Raspberry-Pi - I2C (TWI)


18.11.2014

Raspberry Pi B має дві шини I2C (TWI), які виведені на різні роз’єми. Лінії SDA, SCL шини 1 виведені на роз’єм P1.  SDA, SCL шини 0 виведені на роз’єм P5.

P5:

RaspberryPi_B_Rev2_P5  RaspberryPi_B_Rev2_I2C0

P1:

RaspberryPi_B_Rev2_I2C1

I2C налаштування

Для включення I2C шини на Raspberry Pi потрібно виконати операції, що описані нижче.

Відредагуємо файл: /etc/modprobe.d/raspi-blacklist.conf:


nano /etc/modprobe.d/raspi-blacklist.conf

Закоментуємо рядок blacklist i2c-bcm2708. Приклад вмісту файлу:


#blacklist spi-bcm2708
#blacklist i2c-bcm2708

Коригуємо файл /etc/modules:


sudo nano /etc/modules

Додаємо рядки:

i2c-bcm2708
i2c-dev

Встановлюємо i2c-tools утиліти:


sudo apt-get install python-smbus i2c-tools

Перезавантажуємо Raspberry Pi:


reboot

Після перезавантаження можемо переглянути всі підключені прилади до шин I2C:


sudo i2cdetect -y 1

0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --

В даному випадку на шині 1 тільки один пристрій за адресою 0x27

Якщо команда выдає помилку: Error: Could not open file `/dev/i2c-0` or `/dev/i2c/0`: No such file or directory

треба додати у файл /boot/config.txt рядок:

dtparam=i2c_arm=on

і перезавантажити систему.

Дві шини I2C

Виконуючи команду sudo i2cdetect -y 1 ми вказуємо номер шини I2C, у нашому випадку - 1. Зверніть увагу: у попередніх версіях Raspberry Pi на основний роз’єм може бути виведена шина 0. У нових Raspberry Pi шина 0 виведена на роз’єм P5. Цей роз’єм, зазвичай, не запаяний. При потребі є можливість впаяти роз’єм і використовувати обидві лінії I2C.

Утиліти I2C

i2cdetect - дозволяє переглянути адреси усіх підключених до шини I2C пристроїв. Приклад:


i2cdetect -y 1

де 1 - номер шини I2C.

i2cget - зчитує дані з вказаної адреси вказаного пристрою. Приклад:


i2cget -y 1 0x27 0xA0

де: 1 - номер шини I2C; 0x27 - адреса пристрою; 0xA0 - адреса, з якої виконується зчитування.

i2cset - записує дані до вказаної адреси вказаного пристрою. Приклад:


i2cset -y 1 0x27 0xA0 0xFF

де: 1 - номер шини I2C; 0x27 - адреса пристрою; 0xA0 - адреса, до якої виконується запис; 0xFF - значення, що записуються.

Проблеми I2C. Зменшення швидкості шини I2C (TWI)

Деякі повільні пристрої при роботі з шиною I2C можуть виконувати зупинку тактування (clock stretching). Це прописано в протоколі I2C, але на момент написання статті не підтримується драйверами Raspberry Pi. Це може стати причиною неможливості зчитування даних або їх спотворення. Зазвичай, робоча частота шини I2C - 100КГц. Для забезпечення стабільної роботи доводиться знижати її. Це можна зробити, вказавши потрібну швидкість в одному з конфіг-файлів у директорії /etc/modprobe.d/ . Наприклад, створивши файл i2c.conf таким чином:


echo options i2c_bcm2708 baudrate=32000 > /etc/modprobe.d/i2c.conf

де, 32000 - частота роботи шини. Після змін у конфігурації треба перезавантажити Raspberry Pi.

Якщо Вам потрібно працювати зі швидкими та повільними пристроями, які підключені до однієї шини, зменшення частоти роботи шини може викликати небажані затримки. Існує інший шлях вирішення проблеми з повільними пристроями. Ви можете скачати і використовувати утиліти, які можуть уповільнювати роботу шини I2C і повертати її в початковий стан. Скачайте архів з цими програмами:


wget http://www.hobbytronics.co.uk/download/rpi_i2c.zip

Розпакуйте архів:


unzip rpi_i2c.zip

Добавимо атрибут можливості запуску:


chmod +x i2c_fast i2c_slow

Тепер, перед роботою з повільними пристроями, можемо уповільнити швидкість шини I2C, а після - повернути до початкового стану:


sudo ./i2c_slow
i2cget -y 1 0x27 0xA1
sudo ./i2c_fast

Успіхів.

Дивись також:

Raspberry Pi
Коментарі:
Додати коментар
Code
* - обов'язкові поля

Архіви