Как преодолеть растяжение часов на I2C

У меня есть проблема с растяжением часов на моей линии I2C, приложенный снимок ниже.

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

У меня есть плата Kinetis K64, которая обменивается данными с расширителем портов MAX7304 на частоте 400 кГц.

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

Со всем чтением я понял, почему это происходит. Я пытаюсь понять, как с этим бороться.

Любая мысль высоко ценится, спасибо

Вы получаете растяжение часов, когда ведомое устройство I2C запрашивает это. Замена резисторов или конденсаторов не поможет, вам нужно адаптировать мастер I2C, чтобы справиться с этим (что может означать обходной путь в драйвере).
@BrianDrummond мастер может также растягивать часы, когда программное обеспечение написано медленно. В техническом описании MAX7304 не упоминается растяжение тактовой частоты или специальные тайминги для записи, поэтому я бы посмотрел драйвер I²C для повышения производительности, возможно, использовал DMA.
@Арсенал, если это делает мастер, это не «растягивание часов», а просто более длительный период времени.
@ user2054364, какую часть вашей временной диаграммы вы называете «растягиванием часов»?
@ThePhoton в прицеле будет выглядеть так же? Вы можете установить последовательные резисторы, чтобы узнать, какой из них тянет его вниз, но в этом случае я очень подозреваю, что это мастер.
Это не осциллограф, это логический анализатор Seele. На самом деле нарастающий фронт должен быть больше похож на форму сигнала зарядки RC, и ключевой частью оптимизации системы I2C является рассмотрение этого нарастающего фронта, чтобы увидеть, достаточно ли быстрое его время нарастания. Логический анализатор не показывает эту информацию, он показывает только цифровой низкий или высокий логический уровень.

Ответы (2)

MAX7304 не способен растягивать тактовую частоту, поэтому проблема заключается в вашем драйвере I²C в вашем программном обеспечении.

Соответствующая цитата из таблицы данных :

Линия SCL устройства работает только как вход. Подтягивающий резистор требуется на SCL, если на 2-проводном интерфейсе есть несколько мастеров или если мастер в системе с одним мастером имеет выход SCL с открытым стоком.

(выделено мной)

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


Мой предпочтительный подход к сокращению времени передачи — использовать DMA, который в большинстве случаев обеспечивает оптимальную пропускную способность.

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

Прочитайте спецификацию IIC. Растяжение часов — это способ ведомого замедлить автобус до скорости, с которой он может справиться. Это не функция резисторов и конденсаторов. Подтягивающие резисторы должны быть такими, какими они должны быть, чтобы подтягивать линию, но не требовать больше, чем максимальный ток, чтобы линия была низкой. Что касается конденсаторов, не ставьте конденсаторы ни на одну из линий IIC.

Растяжка часов не является проблемой для решения. Это система, работающая правильно, позволяющая ведомому устройству функционировать, как задумано. Здесь нечего исправлять. В любом случае, вы не должны находиться здесь на этом уровне, не понимая IIC.

согласен со всем, кроме последнего предложения.