Очевидно, що при роботі на шину з «монтажним І» можна в цю шину подавати сильний високий рівень. Інакше якщо який-небудь з блоків видасть свій сильний низький, то один з них вигорить в результаті КЗ.
· Передавач - елемент, який посилає дані в шину.
· Приймач - елемент, який отримує дані з шини.
· Master - елемент, який ініціалізує передачу, генерує сигнали синхронізації, і завершує передачу.
· Multi-master - система з більш ніж одним майстром.
· Арбітраж - процедура, яка гарантує, що, якщо більше ніж один майстер одночасно намагаються управляти шиною, тільки один з них отримає повне управління шиною і забезпечить передачу даних без помилок.
· Синхронізація - синхронізація передачі даних між елементами.
Передача / Прийом сигналів здійснюється притисканням лінії в 0. в одиничку встановлюється сама, за рахунок підтягують резисторів. Їх ставити обов'язково завжди. Стандарт! Резистори на 10к оптимальні. Чим більше резистор, тим довше лінія відновлюється в одиницю (йде перезарядка паразитної ємності між проводами) і тим сильніше завалюються фронти імпульсів, а значить швидкість передачі падає. Саме тому у I 2 C швидкість передачі набагато нижче ніж у SPI. Зазвичай IIC працює або на швидкості 10кбіт / с - в повільному режимі, або на 100кбіт / с в швидкому. Але в реальності можна плавно змінювати швидкість аж до нуля.
Ні в якому разі не можна перемикати висновок мікроконтролера в OUT і смикати ногу на +5. Можна запросто зловити КЗ і попалити або контролер або який-небудь девайс на шині. Хіба мало хто там лінію придавить.
Вся передача даних складається з Стартовою посилки. бітів і стоповою посилки. Порядок зміни рівня на шинах задає тип посилки.
Після старту передача одного біта даних йде по тактовому імпульсу. Тобто коли лінія SCL в нулі master або slave виставляють біт на SDA (притискають - якщо 0 або не притискаючись - якщо 1 лінію SDA) після чого SCL відпускається і master / slave зчитують біт. Таким чином, у нас протокол абсолютно не залежить від тимчасових інтервалів. тільки від тактових бітів. Тому шину I 2 C дуже легко налагоджувати - якщо щось не так, то досить знизити швидкість до байта в хвилину і спокійно, звичайними вольтметрами, дивитися що у нас відбувається. Правда це не прокотить з залізним I 2 C. там немає таких низьких швидкостей. Але що нам заважає затактовать мікроконтролер від ДУЖЕ повільного тактового генератора і налагодити все по кроках? ;)
Повторимо для ясності:
- Початок передачі визначається Start послідовністю - провал SDA при високому рівні SCL
- При передачі інформації від Master до Slave, провідний генерує такти на SCL і видає біти наSDA. Які ведений зчитує коли SCL стає 1.
- При передачі інформації від Slave до Master, провідний генерує такти на SCL і дивиться що там ведений творить з лінією SDA - зчитує дані. А ведений, коли SCL йде в 0, виставляє на SDA біт, який майстер зчитує, коли підніме SCL назад.
- Закінчується все STOP послідовністю. Коли при високому рівні на SCL лінія SDA переходить з низького на високий рівень.
Тобто, зміна на шині даних в момент прийому даних може бути тільки при низькому рівні на SCL. Коли SCL вгорі то йде читання. Якщо ж у нас SDA змінюється при високому SCL. то це вже службові команди START або STOP.
Якщо Slave гальмо і не встигає (у EEPROM, наприклад, низька швидкість запису), то він може насильно покласти лінію SCL в землю і не давати ведучому генерувати нові такти. Майстер повинен це зрозуміти і дати слейв прожувати байт. Так що не можна тупо генерувати такти, при відпуску SCL треба стежити за тим, що лінія піднялася. Якщо не піднялася, то треба зупинитися і чекати до тих пір, поки Slave її не відпустить. Потім продовжити з того ж місця.