В этой статье мы рассмотрим как использовать контакты I2C в плате Raspberry Pi Pico и рассмотрим код сканера I2C. Плата Raspberry Pi Pico построена с использованием микроконтроллера RP2040. На плате имеется 26 многофункциональных контактов/выводов GPIO (контакты ввода/вывода) из 36 контактов GPIO. 10 выводов GPIO не открыты, поэтому их нельзя использовать. Из 26 используемых выводов GPIO есть 2 пары выводов I2C, которые будут обсуждаться в этой статье.
Мы рассмотрим что собой представляет протокол связи I2C и как он работает. Мы также подробно изучим контакты I2C платы Raspberry Pi Pico. Мы возьмем код сканера I2C в качестве примера и проверим определение адреса I2C нескольких датчиков и модулей с поддержкой I2C.
Также на нашем сайте мы рассматривали работу с интерфейсом I2C в других микроконтроллерах и платах:
Необходимые компоненты
- Плата Raspberry Pi Pico (купить на AliExpress).
- Датчик BME680 (купить на AliExpress).
- Модуль акселерометра и гироскопа MPU6050 (купить на AliExpress).
- OLED дисплей с интерфейсом I2C и диагональю экрана 1.3 дюйма (1.3 inch I2C OLED display) (купить на AliExpress - для данного проекта выбирайте вариант дисплея с 4 контактами).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Что такое протокол связи I2C?
I2C (Inter-Integrated Circuit) — это синхронная, многоведущая, многоведомая, пакетно-коммутируемая, однопроводная, последовательная коммуникационная шина. Она широко используется для подключения низкоскоростных периферийных интегральных схем (ИС) к процессорам и микроконтроллерам в ближней внутриплатной коммуникации.
Как и связь UART, I2C использует только два провода для передачи данных между устройствами.
Два провода в интерфейсе I2C называются Serial Clock Line (SCL) и Serial Data Line (SDA). Передаваемые данные отправляются по проводу SDA и синхронизируются с тактовым сигналом от SCL. Все устройства/ИС в сети I2C подключены к тем же линиям SCL и SDA, как показано выше.
Устройства, подключенные к шине I2C, являются либо ведущими (masters), либо ведомыми (slaves). В любой момент времени на шине I2C остается активным только одно ведущее устройство. Оно управляет линией синхронизации SCL и решает, какая операция должна быть выполнена на линии данных SDA .
Все устройства, которые отвечают на инструкции этого главного устройства, являются подчиненными. Для различения нескольких подчиненных устройств, подключенных к одной шине I2C, каждому подчиненному устройству физически назначается постоянный 7-битный адрес.
Когда ведущее устройство хочет передать данные на ведомое устройство или с него, оно указывает этот конкретный адрес ведомого устройства на линии SDA и затем продолжает передачу. Таким образом, эффективная связь происходит между ведущим устройством и конкретным ведомым устройством. Все остальные ведомые устройства не отвечают, если их адрес не указан ведущим устройством на линии SDA.
Контакты I2C в плате Raspberry Pi Pico
Микроконтроллер RP2040 имеет два контроллера I2C. Вы можете получить доступ к обоим контроллерам I2C через контакты GPIO Raspberry Pi Pico. В следующей таблице показано подключение контактов GPIO к обоим контроллерам I2C.
Контроллер I2C | Контакты GPIO |
I2C0 – SDA | GP0/GP4/GP8/GP12/GP16/GP20 |
I2C0 – SCL | GP1/GP5/GP9/GP13/GP17/GP21 |
I2C1 – SDA | GP2/GP6/GP10/GP14/GP18/GP26 |
I2C1 – SCL | GP3/GP7/GP11/GP15/GP19/GP27 |
Каждое соединение контроллера можно настроить через несколько контактов GPIO, как показано на рисунке. Но перед использованием контроллера I2C следует настроить в программном обеспечении, какие контакты GPIO вы хотите использовать с конкретным контроллером I2C.
Характеристики контактов I2C платы Raspberry Pi Pico
Raspberry Pi Pico имеет чип RP2040, который поддерживает следующие функции:
- Устройство может работать в режиме ведущего или ведомого устройства с адресом ведомого устройства по умолчанию = 0x055.
- Контакты I2C имеют 3 режима скорости: стандартный (от 0 до 100 Кбит/с), быстрый (<= 400 Кбит/с ) и быстрый режим Plus (<= 1000 Кбит/с).
- Он может как передавать, так и принимать данные.
- Он также может использоваться в режиме прерывания и DMA (прямой доступ к памяти).
Как использовать контакты I2C Raspberry Pi Pico с датчиками или модулями I2C?
Теперь давайте узнаем, как мы можем использовать контакты I2C платы Raspberry Pi Pico с любыми другими датчиками или модулями на основе протокола I2C. В этом случае мы можем использовать Raspberry Pi Pico как главное (ведущее) устройство, а другие внешние датчики или модули как подчиненное (ведомое) устройство.
Вот схема, в которой мы подключили 3 разных устройства I2C к плате Pico. Эти 3 устройства — это датчик BME680, датчик MPU6050 и 0,96″ OLED-дисплей.
В этом примере мы подключим контакты SDA и SCL MPU6050, BME680 и OLED-дисплея к общей линии I2C платы Raspberry Pi Pico. Поскольку у данной платы имеется несколько выводов I2C, мы будем использовать только одну пару выводов I2C платы Raspberry Pi Pico. Мы будем использовать GPIO8 как SDA0 и GPIO9 как SCL0.
Код сканера I2C для платы Raspberry Pi Pico
Теперь давайте посмотрим на код сканера I2C для платы Raspberry Pi Pico. Код написан на MicroPython. Вы можете использовать Thonny IDE или uPyCraft IDE для подключения Raspberry Pi Pico к вашему компьютеру.
Следующий код будет сканировать I2C-адреса всех датчиков, подключенных к I2C-контактам платы Raspberry Pi Pico. Скопируйте код, а затем загрузите и запустите его.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import machine sda=machine.Pin(8) scl=machine.Pin(9) i2c=machine.I2C(0,sda=sda, scl=scl, freq=400000) print('Scan i2c bus...') devices = i2c.scan() if len(devices) == 0: print("No i2c device !") else: print('i2c devices found:',len(devices)) for device in devices: print("Decimal address: ",device," | Hexa address: ",hex(device)) |
После запуска кода Micropython попытается просканировать устройства I2C, подключенные к плате Raspberry Pi Pico. Вы можете подключить до 127 ведомых устройств. Устройство просканирует адрес и отобразит его в окне.
1. Адрес I2C OLED-дисплея — 60, что в шестнадцатеричном формате равно 0x3C.
2. Адрес I2C MPU6050 — 104, что в шестнадцатеричном формате равно 0x68.
3. Адрес I2C BME680 — 119, что в шестнадцатеричном формате равно 0x77.
23 просмотров