Предположим, у нас есть шина I 2 C с частотой 400 кГц . Есть один хозяин и куча ведомых устройств. Мы хотели бы представить еще одно ведомое устройство, но, к сожалению, оно работает только на 100 кГц.
Ясно, что надежные варианты дизайна:
- просто запустите эту шину на 100 кГц
- используйте отдельные шины для периферийных устройств 400 кГц и 100 кГц
Но вопрос только в хаке: что, если мы используем одну шину и обращаемся к устройствам 400 кГц на частоте 400 кГц, и переключаем шину на 100 кГц при обращении к ведомому на 100 кГц?
Или же более медленное ведомое устройство может вести себя неправильно в ответ на хэш 400 кГц, которое оно видит в линиях I 2 C, потому что оно ошибочно думает, что к нему обращаются?
Можем ли мы полагаться на устройства с частотой 100 кГц, чтобы все еще иметь возможность обрабатывать сигнал I 2 C с частотой 400 кГц достаточно хорошо, чтобы надежно игнорировать сообщения, адресованные другим ведомым устройствам?
Ответы:
Как вы предлагаете, это не очень хорошая инженерная практика. В то время как некоторые устройства в большинстве случаев игнорируют трафик, который они не могут получить (ниже образца), другие устройства могут загромождать шину ошибочными кадрами.
Таким образом, ответ, который вы ищете, зависит от специфики вашего приложения, например:
Конечно, трудно предсказать, что произойдет с устройством, работающим вне его спецификаций через несколько лет.
Другой вариант - запустить линию отключения для замедления устройств или пропустить тактовую линию (при условии, что они не могут генерировать тактовый сигнал) через логический элемент AND.
источник
Другой вариант, если у вас нет дополнительной шины I2C, выходящей из вашего мастера, это использовать переключатель I2C, такой как PCA9543A / 43B . Поместите ведомые 400 кГц на одну ветвь, а ведомые 100 кГц на другую и при необходимости переключите их.
источник
Нет никакой гарантии, что устройство с частотой 100 кГц не будет плохо себя вести при воздействии трафика с частотой 400 кГц - возможно все, от NACK до зависаний шины.
Вы должны использовать всю шину на частоте 100 кГц или иметь отдельную низкоскоростную шину для медленной периферии.
источник
Другие варианты. Вместо двух шин вы можете просто использовать одну дополнительную строку (проще с программным обеспечением / бит-бандинг I 2 C). Отдельная линия часов или отдельная линия данных. Или используйте я 2 Ĉ буфер или я 2 переключателя C , чтобы положить , что один чип 100MHz на свой собственный сегмент, без изменения все остальное.
Или просто проверить это на одном автобусе. Вполне возможно, что чип 100 кГц повлияет на линию. Он может читать каждый 4-й бит и в итоге думать, что к нему обращены. Но он должен увидеть правильное условие запуска, а затем прочитать каждый 4-й бит из следующих 32 битов в качестве его точного адреса, а затем либо попытаться прочитать следующую пару байтов в качестве корректной информации для записи в свои регистры. или попробуйте отключить данные. Я не думаю, что это слишком вероятно, ситуация. Лучше всего просто подключить его к тестовой схеме и проверить.
Обратите внимание на две вещи: если это одноконтурная схема, или вы делаете только несколько, достаточно просто рискнуть или изменить ее. Если это серийно выпускаемый товар, вам может понадобиться второй автобус. Другая причина заключается в том, что вы должны учитывать, что микросхема 100 кГц была просто произведена в соответствии с исходной спецификацией I 2 C и вполне могла бы поддерживать более высокие тактовые частоты. Он не был протестирован на более высокой скорости 400 кГц.
источник
Конструкция шины I2C такова, что -
Из-за разницы в силе драйвера и емкости линии теоретически возможно, что одно устройство может реагировать на несколько медленный спад на SCL, управляя SDA так быстро, что другое устройство увидит падение SDA первым.
Возможно, можно было определить несколько логических порогов в SCL и указать, что для падающего фронта в SCL, который следует рассматривать как идущий после фронта в SDA, он все равно должен быть выше 2/3 VDD при обнаружении фронта в SDA, но устройство может не утверждать SDA в ответ на падающий фронт на SCL, пока оно не упадет ниже 1/3 VDD, но спецификация не написана в таких терминах.
Вместо этого устройства, которые видят почти одновременные падающие фронты на SDA и SCL, обычно рассматривают фронт на SCL как произошедший первым, если ему не предшествует фронт на SDA. Некоторые реализации I2C обрабатывают это, синхронизируя SCL и SDA с некоторыми внешними тактовыми импульсами и требуя, чтобы задний фронт SDA наблюдался за два периода перед периодом SCL, чтобы считаться наступающим первым. Если скорость операций на SCL и SDA слишком высока относительно тактовой частоты синхронизации, устройства могут воспринимать произвольные последовательности сигналов высокого и низкого уровня на SCL и SDA; если одна из этих последовательностей выглядит так, как будто она обращается к медленному устройству, она может реагировать соответствующим образом, подавляя любые другие сообщения, которые могут происходить.
Нет особой причины, по которой устройства на шине I2C должны полагаться на синхронизацию с системными часами (было бы лучше воспринимать два дискретных порога на SCL), но факт заключается в том, что некоторые устройства на самом деле работают именно так. Обратите внимание, что даже если бы устройство, которое было ограничено низкими скоростями внутри, хотело сосуществовать с быстрой шиной, оно, вероятно, должно было бы как минимум задействовать растягивание часов каждый раз, когда что-то происходило, что могло бы его заинтересовать.
Это может привести к тому, что некоторые коммуникации будут происходить медленнее, чем в противном случае, но снижение скорости, скорее всего, будет не таким плохим, как требуется при синхронизации с синхронизацией (фактическая величина, на которую медленное устройство растягивает часы, вероятно, не будет быть настолько плохим, как величина, на которую часы должны быть замедлены, чтобы избежать сбоев в наихудшем сценарии в синхронизированных единицах синхронизации).
источник