I2C с ATtiny85 на частоте 8 МГц с использованием библиотеки TinyWireM

Здравствуйте, коллеги-энтузиасты Arduino, я пытаюсь заставить ATtiny85 говорить I2C с помощью платы MMA7660 breakout board, которая у меня есть (это акселерометр, это последующий вопрос к моему предыдущему).

Я бы заранее заявил, что чип I2C отлично работает с Arduino Nano, что я использую Arduino IDE v1.5.6-r2, используя arduino-tiny core (отсюда) и что до сих пор у меня не было особых проблем с работой на частоте 8 МГц.

Официальная документация для библиотеки TinyWireM (на сайте Arduino playground) гласит, что:

По умолчанию основная библиотека I2C (TinyWireM) настроена на частоту 1 МГц. Чтобы работать на частоте 8 МГц, необходимо изменить #defines в USI_TWI_Master.h / .cpp.

Я внес следующие изменения в USI_TWI_Master.cpp:

#define F_CPU 8000000UL // was 1000000UL

Я внес следующие изменения в USI_TWI_Master.h:

#define SYS_CLK   8000.0 // было 1000,0
#define T2_TWI    1.3 // было 5 
#define T4_TWI    0.6 // было 4 

Я предполагаю, что значения T2_TWI и T4_TWI неверны. Я также попробовал T2_TWI 40 и T4_TWI 32 (как указано здесь), а также T2_TWI 2 и T4_TWI 1 (как указано здесь), но безуспешно. Я также попробовал некоторые другие значения между ними, которые, как мне казалось, могли бы иметь смысл, но это не сработает.

Код, который я запускаю, - это сканер I2C отсюда (который, как я уже упоминал, отлично работает с Nano и находит устройство), удар-это модифицированная версия для взаимодействия с библиотекой TinyWireM вместо библиотеки Wire:

#include <TinyWireM.h>
#include <SoftwareSerial.h>

SoftwareSerial mySerial(-1,4);

void setup()
{
  TinyWireM.begin();
  mySerial.begin(9600);
  mySerial.println("\nI2C Scanner");
}

void loop()
{
  byte error, address;
  int nDevices;
  mySerial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    TinyWireM.beginTransmission(address);
    error = TinyWireM.endTransmission();

    if (error == 0)
    {
      mySerial.print("I2C device found at address 0x");
      if (address<16) 
        mySerial.print("0");
      mySerial.print(address,HEX);
      mySerial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      mySerial.print("Unknow error at address 0x");
      if (address<16) 
        mySerial.print("0");
      mySerial.println(address,HEX);
    }  
  }
  if (nDevices == 0)
    mySerial.println("No I2C devices found\n");
  else
    mySerial.println("done\n");

  delay(5000);           // подождите 5 секунд для следующего сканирования
}

В качестве примечания я бы сказал, что мой логический анализатор недавно был сломан, и я уверен, что это помогло бы здесь... Кроме того, я знаю о взломе звуковой карты, который будет использоваться в качестве логического анализатора, но пока предпочел бы избегать добавления в систему более подверженных ошибкам переменных, если это возможно.

Вот картина зондирования с помощью логического анализатора Saleae двух каналов. Результат приведенного выше кода - "Устройства I2C не найдены":

Logic sampling of ATTiny I2C channels

(Полноразмерное изображение)

Был бы признателен за понимание любого, кто имеет опыт успешного использования ATtiny85 на частоте 8 МГц с I2C.

, 👍5

Обсуждение

Вы сожгли предохранители (загрузчик загрузки), чтобы ATtiny работал на частоте 8 МГц?, @imjosh

@imjosh: да. спасибо, что заговорили об этом. Я всегда использую один и тот же ATtiny для прототипирования и время от времени сжигаю предохранители просто на всякий случай :), @Omer

Я взглянул на USI_TWI_Master.h, и я не думаю, что T2_TWI и T4_TWI должны быть изменены вообще. Просто SYS_CLK от 1000,0 до 80000,0. Вы пробовали это сделать?, @imjosh

ДА. Я также попробовал с исходными значениями. не уходи., @Omer

Вы используете внешний кристалл или резонатор?, @imjosh

Я использую внутренний резонатор., @Omer

Попробуйте использовать внешний кристалл или, может быть, откалибровать внутренний резонатор ... https://www.google.com/search?q=калибровка+attiny+внутренний+резонатор, @imjosh

спасибо, но в настоящее время я ищу решение, которое не требует внешнего кристалла. Кроме того, я не смог найти никаких ссылок на то, как откалибровать внутренний генератор (а не резонатор, согласно спецификации). Кроме того, мне трудно поверить, что время SoftwareSerial является правильным, если внутренний осциллятор недостаточно точен., @Omer

Удалось ли вам успешно запустить I2C на ATtiny85 без внешнего генератора?, @Omer

Давайте [продолжим это обсуждение в чате](http://chat.stackexchange.com/rooms/15064/discussion-between-imjosh-and-omer)., @imjosh

У вас есть подтягивающие сопротивления на месте... оба?, @Chip Estrada

ДА. Они оба., @Omer

Есть какие-нибудь успехи с этой проблемой? Вероятно, я испытываю нечто похожее. Мой логический анализатор говорит, что первый отправленный байт (подчиненный адрес) верен, остальное-ерунда. Я попробовал его на 1 МГц и 8 МГц, правильные предохранители, возился с T2_TWI/T4_TWI, но у меня заканчиваются идеи., @oujesky

К сожалению, нет. Я также проверил логический анализатор и осциллограф - и могу подтвердить, что вывод-мусор., @Omer

@Omer Смотрит на [эту фотографию](http://oi57.tinypic.com/2s6vyv8.jpg) из вашего поста следует, что сигналы SDA и SCL не меняются местами? SDA выглядит как часы, а SCL-как данные., @Chetan Bhargava

У меня та же проблема, что и у вас с зондом DHTC3. Код I2scanner не реагирует нормально на адрес зонда с помощью Attiny85, пока он работает с Arduino Uno. Однако я изменил частоту на 8 МГц и 2 таймера T2_TWI и T4_TWI. А вы, пожалуйста, решили свою проблему?, @MikeBee59


2 ответа


1

Вам действительно просто нужно охватить сигналы, даже если это с помощью нанообъектива DSO.

Без загрузки спецификаций:

  • Я бы предположил, что ваше подтягивание, вероятно, слишком мало, но, возможно, слишком велико (охватите его).
  • Скорость нарастания может быть либо недостаточной, либо слишком крутой (scope it).
  • Имейте в виду, что ATtiny работает на частоте "8 МГц", а не 8,00 МГц. Ошибка синхронизации может быть достаточно большой, чтобы вызвать проблемы со связью на высоких скоростях при хорошей работе на более низких скоростях (масштабируйте ее и/или начинайте по умолчанию и постепенно увеличивайте скорость на 0,5 МГц, пока она не перестанет работать).
  • MMA может не поддерживать типичную функцию протокола, например "повторный запуск", пакетные передачи и т. Д. (регистр данных/раздел программирования)

Edit: И ATtiny, и MMA должны иметь байпасные конденсаторы рядом с выводами питания.

,

Это довольно легко пропустить, но в моем последнем комментарии к вопросу я упомянул, что использовал логический анализатор и что результаты - мусор. Это произошло и с другими устройствами I2C, а не только с MMA. Вы когда-нибудь заставляли I2C работать с ATtiny85?, @Omer

Крошечное семейство поддерживает как "I2C", так и "SPI", хотя они и не реализованы как отдельные аппаратные периферийные устройства. Вместо этого Tiny имеет универсальное аппаратное периферийное устройство, называемое USI, которое может эмулировать и то, и другое. Конечно, оба протокола всегда могут быть бит-битами для практически 100% гарантированной связи с чем угодно., @Jon

Если вам так хочется, не могли бы вы подключить любое устройство I2C к одному из них и опубликовать снимок из вашего прицела?, @Jon

Я обнаружил, что у меня есть MMA8451Q на моем KL25Z. Я постараюсь запустить его с Крошечным завтра и отправить обратно результаты., @Jon

Часть USI из документации Atmel - это то, что дает мне надежду. К сожалению, я никогда не слышал, чтобы кто-то преуспел в этом. Я обновлю свой вопрос скриншотом зондирования., @Omer

загрузил скриншот., @Omer

Я знаю, что это старый пост, но мой ATtiny85 успешно поговорил с датчиком BMP280 через I2C с помощью TinyWireM. И нет, SYS_CLK 8MHz или 1MHz не имеет никакого значения. Для меня он работает с любыми T2 и T4 - 5 и 4 по умолчанию (быстрее) или 40 и 32 (просто медленнее). Моя проблема заключалась в том, что я немного ударил ЖК-экран, а затем инициализировал через TinyWireM датчик BMP280 ... этот микс не работает., @Volodymyr Kotylo


0

Просто идея. На adafruit.com есть продукт под названием Trinket, который представляет собой плату микроконтроллера ATtiny85. Он может общаться по I2C, используя свою библиотеку TinyWireM. Может быть, вам стоит проверить его для справки. Надеюсь, это поможет :)

,

Владелец вопроса уже упоминал, что они используют библиотеку., @Avamander