3.23. Основи I2C¶
I2C (Inter-Integrated Circuit, вимовляється «I-squared-C» або «I-two-C») — це двопровідна послідовна шина, розроблена для короткодистанційного зв’язку між мікросхемами на одній платі. За своїми характеристиками вона займає проміжне місце між SPI і UART: повільніша за SPI, але вимагає менше виводів; адресна (кілька пристроїв на одних двох дротах), тоді як SPI потребує окремого виводу CS для кожного пристрою.
I2C є шиною вибору для низькошвидкісних датчиків — акселерометрів, датчиків температури, датчиків вологості, магнетометрів, годинників реального часу, EEPROM — де економія виводів і зменшення складності шини важливіші за максимальну пропускну здатність.
3.23.1. Два дроти, обидва з відкритим стоком¶
Шина I2C має лише два сигнали:
SCL (послідовний тактовий сигнал). Керується контролером (у більшості випадків).
SDA (послідовні дані). Керується тим пристроєм, який зараз передає — контролером під час адресації та вихідних даних, периферійним пристроєм під час читання та бітів ACK.
Обидві лінії мають відкритий стік: кожен пристрій на шині може опускати лінію до землі, але ніколи не піднімає її до рівня «high». Два підтягуючих резистори на шині (зазвичай 2.2 kΩ до 10 kΩ до шини живлення) піднімають лінії до «high», коли ніхто їх не опускає. З цього випливає поведінка логічного АБО по дроту — будь-який пристрій, що опускає лінію, «виграє», а стан «high» означає просто «ніхто не говорить».
Внутрішні підтягуючі резистори мікроконтролера на виводах SCL і SDA зазвичай недостатньо потужні, щоб самостійно виконувати роль шинних підтягуючих резисторів; зовнішні резистори на шині, як правило, потрібні. Багато плат-переходників для датчиків вже включають їх; перевіряйте технічну документацію перед тим, як додавати власні.
3.23.2. Транзакція¶
Кожна транзакція I2C має однакову структуру:
Транзакція I2C: START, 7-бітна адреса + R/W, ACK, регістр, ACK, дані, NACK, STOP.¶
Обмін розгортається побітово:
START. Контролер опускає SDA, поки SCL ще високий. Цей незвичний перепад повідомляє кожному пристрою на шині, що транзакція ось-ось почнеться.
Адреса + R/W. Контролер виштовхує 7-бітну адресу периферійного пристрою, за якою слідує один біт читання/запису (
0— запис,1— читання).ACK / NACK. Після кожного байта приймач керує SDA протягом одного такту: ACK (низький) або NACK (високий). На байті адреси периферійний пристрій підтверджує (ACK), якщо розпізнає власну адресу; якщо жоден пристрій не підтверджує, контролер отримує NACK і знає, що адреса відсутня на шині.
Байти даних. Кожен супроводжується ACK від приймача. При записі периферійний пристрій підтверджує кожен байт; при читанні контролер підтверджує кожен потрібний йому байт і відправляє NACK на останньому байті, сигналізуючи периферійному пристрою про зупинку.
STOP. Контролер відпускає SDA до «high», поки SCL ще високий, завершуючи транзакцію.
Повторний старт — це другий START, виданий без попереднього STOP — контролер змінює напрямок (адреса запису, потім адреса читання) для того самого периферійного пристрою, не звільняючи шину.
3.23.3. Адресація¶
7-бітний адресний простір охоплює 0x08 – 0x77; значення на краях зарезервовані для спеціальних цілей. Адреса кожного пристрою встановлюється розробником мікросхеми; у багатьох компонентах дозволяється змінювати кілька молодших бітів на рівні плати (підключенням виводу до «high» або до землі), щоб два однакових датчики могли знаходитися на одній шині.
Якщо два пристрої мають однакову адресу, немає способу звернутися до одного з них без перешкод від іншого, тому перевіряйте технічну документацію перед поєднанням компонентів. i2c.scan() (розглянуто в I2C у коді) проходить по адресному простору та повідомляє, які адреси відповідають, — це стандартний спосіб дізнатися, що є на шині.
3.23.4. Переваги та недоліки¶
Переваги та недоліки шини визначають її нішу:
Два виводи для багатьох пристроїв. Одна пара SCL/SDA може обслуговувати десяток датчиків. SPI потребував би додаткового виводу CS на кожен пристрій.
Стандартні швидкості.
100 kHz(«стандартний режим») та400 kHz(«швидкий режим») підходять майже для кожного датчика.1 MHzдосяжний, але починає пред’являти більші вимоги до ємності шини та розрахунку підтягуючих резисторів.Повільна порівняно з SPI. Все, що потребує більш ніж кількасот кілобіт на секунду, краще перевести на SPI.
Конфлікти адрес. Два пристрої з однаковою адресою на одній шині — це апаратна помилка, яку протокол не може обійти.