Конструкция шины I2C такова, что -
- когда в SCL происходит спад, это может привести к тому, что подчиненное устройство немедленно установит SDA без какой-либо конкретной минимальной задержки;
- относительное упорядочение восходящих и падающих краев имеет решающее значение.
Из-за разницы в силе драйвера и емкости линии теоретически возможно, что одно устройство может реагировать на несколько медленный спад на 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), но факт заключается в том, что некоторые устройства на самом деле работают именно так. Обратите внимание, что даже если бы устройство, которое было ограничено низкими скоростями внутри, хотело сосуществовать с быстрой шиной, оно, вероятно, должно было бы как минимум задействовать растягивание часов каждый раз, когда что-то происходило, что могло бы его заинтересовать.
Это может привести к тому, что некоторые коммуникации будут происходить медленнее, чем в противном случае, но снижение скорости, скорее всего, будет не таким плохим, как требуется при синхронизации с синхронизацией (фактическая величина, на которую медленное устройство растягивает часы, вероятно, не будет быть настолько плохим, как величина, на которую часы должны быть замедлены, чтобы избежать сбоев в наихудшем сценарии в синхронизированных единицах синхронизации).