Raspberry-Pi - I2C (TWI)
Raspberry Pi B має дві шини I2C (TWI), які виведені на різні роз’єми. Лінії SDA, SCL шини 1 виведені на роз’єм P1. SDA, SCL шини 0 виведені на роз’єм P5.
P5:
P1:
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 — що це таке?
- Raspberry Pi — GPIO
- Raspberry Pi — UART
- Raspberry Pi — FT232
- Raspberry Pi — PWM і Сервопривод
- Raspberry Pi — DHT11
- Raspberry Pi - FM Transmitter
- Прошивка AVR мікроконтролерів за допомогою Raspberry Pi
- Raspberry Pi — LCD display 1602
- Raspberry Pi — WiFi
- Raspberry-Pi — I2C (TWI)
- Raspberry Pi - DS18B20
- Raspberry Pi Camera
- nRF24L01+ ATMEGA + Raspberry Pi
- BMP180 + Raspberry Pi + WH1602
- Wi-Fi Метео станція
- Raspbian. Apache + PHP + Python + MySQL
- Встановлюємо Raspbian на Raspberry Pi без клавіатури та монітору
- IR-дистанційне керування. Використання LIRC у Python
- Raspberry Pi. Raspbian. Відправлення пошти через аккаунт Gmail
- Neoway M590 – GSM/GPRS modem
- MPU-6050 – гіроскоп – акселерометр
- HMC5883L Магнітометр
- PWM контролер з інтерфейсом I2С на базі мікросхеми PCA9685
- Метеостанція на Raspberry Pi своїми руками
- Raspberry Pi. Live-stream video
Недавні записи
- FOC - своя реалізація векторного керування. Підбиваю підсумки 2022 року
- Конструктор регуляторів моторів. Підбиваю підсумки 2022 року.
- Чому трифазні мотори стали такими популярними?
- FOC & Polar coordinates
- Конструктор регуляторів PMSM, BLDC двигунів
- Своя бібліотека для векторного керування безколекторними моторами
- Not Allowed
- Адаптивний ПІД регулятор
- Конструктор регуляторів моторів. Структура.
- Конструктор регуляторів моторів. Анонс.
Tags
st-link 3d-printer encoder servo solar java-script git wifi uart mpu-9250 sensors capture motor esp8266 nodemcu usb usart piezo rfid css atmega bmp280 bkp avr displays brushless watchdog battery sms rs-232 tim mpu-6050 barometer examples nvic pmsm dc-dc eb-500 soldering meteo rtc gpio books websocket docker dht11 led smd stm32 web timer dma lcd mpx4115a hih-4000 bldc ssd1306 adc mongodb python options eeprom raspberry-pi remap max1674 programmator ethernet foc ngnix ssd1331 gps flash exti bluetooth html bme280 i2c pwm flask
Архіви