Связь I2C не работает

Я пытаюсь читать данные/записывать данные на Xilinx Zedboard (платформа FPGA) с помощью внешнего микроконтроллера через шину I2C. Схема для этого в настоящее время будет выглядеть следующим образом:

введите описание изображения здесь

Как видно из схемы, микроконтроллер использует подтягивающие резисторы номиналом 1 кОм для шины I2C.

Я заметил, что после первой транзакции микроконтроллер больше не будет читать/записывать данные.

Я не могу отладить это на микроконтроллере, потому что я не могу внести какие-либо изменения в программное обеспечение микроконтроллера. Микроконтроллер был проверен на корректную работу с другими периферийными устройствами I2C.

Когда я смотрю на осциллограмму, я вижу, что Zedboard не переводит линию SDA на логический низкий уровень микроконтроллера при отправке ACKnowledge. Я думаю, что это может быть причиной сбоя транзакции. См. снимок ниже, где видно, что низкий уровень SDA Zedboard примерно на 600 мВ выше низкого уровня SDA микроконтроллера.

введите описание изображения здесь

Я думаю, что причина этого может быть в том, что подтягивающие резисторы довольно низкие. Однако я не могу внести какие-либо изменения в плату микроконтроллера, а значит, не могу заменить их на более высокие сопротивления.

У вас есть идеи, в чем может быть проблема и как я могу это решить?

Спасибо и привет.

Есть ли длинные провода между платами? Отправляются ли SDA и SCL по соседним проводам? Кажется, есть неожиданно высокий уровень перекрестных помех, учитывая, что резисторы имеют номинал 1 кОм.
Провода имеют длину около 50 см и не проходят по соседним проводам.
Вы подключаете Zedboard через ту же самую линию GND? Если да, сопротивление линии GND может привести к отрыву от земли. Используйте более толстые или более провода для GND.
Так что это за кабель и какая распиновка тогда? I2C, отправленный более чем на 50 см плохой проводки, может быть ненадежным, но когда все правильно спроектировано, он может работать на многих метрах (как в VGA, DVI и HDMI).
Попробуйте использовать преобразователь уровня для буферизации ваших сигналов или, если возможно, буферную микросхему I2C, такую ​​как P82B715T.

Ответы (2)

Напряжение, которое вы видите на вашей линии шины, соответствует сопротивлению переключателя на стороне низкого напряжения, превышающему 200 Ом.

Беглый взгляд на схему ZedBoard показывает, что некоторые входные контакты имеют последовательный резистор на 200 Ом, вероятно, для защиты от электростатического разряда. Я предполагаю, что вы использовали такой контакт для связи I2C, но, поскольку вы не сказали нам, как именно вы подключили микроконтроллер к ZedBoard, я не могу сказать наверняка.

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

Да, ты прав. Я подключил контакты I2C к JA2 и JA3. Теперь я также посмотрел на схему и увидел, что все выводы PMOD, которые не используют резисторы 200 Ом, являются дифференциальными. Знаете ли вы, может ли это причинить вред при использовании дифференциальных контактов для I2C?
Я на самом деле не уверен, но подозреваю, что пины можно настроить как угодно. Убедитесь, что контакты настроены на поддержку высокого напряжения 3,3 В цифровых линий I2C. Вероятно, по умолчанию для дифференциальной конфигурации используется более низкое входное напряжение. Вы должны копаться в таблице данных, чтобы получить подробную информацию.
Я попробовал это с дифференциальными штифтами, и это решило проблему. Спасибо.

Одним из вариантов может быть использование буфера I2C, чтобы вы могли использовать свои собственные подтяжки на стороне устройства.