Требуется задержка I2C и c18

Я использую I2C, и я ранее писал здесь сомнения по поводу I2C. Я использую контроллеры PIC и использую их компилятор C18. Я использовал их библиотеки для создания функции для записи данных в EEPROM через I2C, и когда я перепроверил строки SCL, они колебались.

Я создал функцию для записи в EEPROM, но я упустил задержки, поскольку в техническом описании указано, что «требуется минимальная задержка 5 мс для каждой операции записи в I2C».

Я верю, что это вызывает проблемы. Проблема в том, что SCL не остается на уровне 100 кГц, а колеблется между 54 кГц и 100 кГц, но никогда не выходит за его пределы. Это потому, что управляющий байт, адрес и данные отправляются по функции?

float ee_write_float(unsigned char ee_addr, float f)
{
     void i2c_init(); //initialize I2c
     unsigned char *p = (unsigned char *)&f;
     unsigned char  i;

   for (i = sizeof f; i != 0; --i)
   {
      EEByteWrite(EE_I2C_ADDR, ee_addr++, *p++);
   }

} 

Насколько важны дела для операций записи I2C?

Может ли это быть причиной проблемы?

Должен ли я поставить задержку после функции EEByteWrite для компенсации?

Отмечено: SCL становится несколько стабильным после того, как скорость передачи данных снижается до 20 кГц, а затем колеблется между 17 кГц и 19 кГц. Я был бы очень рад, если бы вы нашли какую-либо разумную причину для устранения этой проблемы ... или любые ценные предложения будут приветствоваться от всего сердца.

Я должен спросить, знаете ли вы, что в таблице данных указана задержка 5 мс, почему бы не попробовать? Это довольно большая задержка, и в данный момент вы, вероятно, пытаетесь писать в тысячу раз быстрее, чем разрешено.
Ну, я пытаюсь писать со скоростью 100 кбит/с... но строка scl при наблюдении за областью действия показала... колебания и никогда не оставалась постоянной на скорости 100 кбит/с, когда я запускаю вышеуказанную функцию в main().
Это может быть растяжение часов, как было предложено в ответе на другой вопрос (я мало что знаю об этом), но в конечном итоге вам понадобится задержка 5 мс, чтобы она работала надежно. Вы всегда можете использовать триггер на осциллографе, чтобы зафиксировать часы со скоростью 100 кбит/с даже с задержкой. Как вы измеряете частоту? Возможно, это просто дрожание между передаваемыми байтами.
Да, я использую триггерную кнопку на прицеле. Ну, частота просто показывает вниз... под прицелом. ОК .. Так что это может быть дрожание между байтами. Ну, я поместил его в цикл for .. непрерывно.
Можете ли вы опубликовать источник EEByteWrite() и, возможно, трассировку шин?
Вы интерпретируете вещи, чтобы прийти к проблеме, что ваши часы I2C нестабильны. Насколько я знаю, стабильность тактовой частоты не гарантируется стандартом I2C. В чем РЕАЛЬНАЯ проблема? Ненадежная связь?

Ответы (1)

В I2C часы переключаются только по мере необходимости для передачи или приема данных. Нет необходимости в непрерывном тактовом сигнале, поэтому следует ожидать изменения наблюдаемой частоты. Спецификация 100 кГц — это максимальная тактовая частота, а не средняя или непрерывная тактовая частота.

Энергонезависимая память, такая как флэш-память и EEPROM, требует относительно длительного периода времени для записи данных в память, и 5 мс звучит примерно так. Вы не должны пытаться выполнить несколько операций записи, не учитывая эту задержку между ними. Из-за этого вы не можете выполнять более 200 операций записи в секунду и по-прежнему разрешать 5 мс на операцию.

Если у вас все работает правильно, вы должны ожидать появления всплеска тактовых импульсов 100 кГц каждые 5 мс или около того.