Использование I2C в высокоуровневых приложениях
Внимание
Это документация по Azure Sphere (устаревшая версия). Служба Azure Sphere (устаревшая версия) выходит на пенсию 27 сентября 2027 г., и к этому времени пользователи должны перейти в Azure Sphere (интегрированная). Используйте селектор версий, расположенный над toC, чтобы просмотреть документацию по Azure Sphere (интегрированная).
Azure Sphere поддерживает шину I2C для связи между интегральными схемами в режиме главного устройства. Последовательная шина I2C используется для подключения низкоскоростных периферийных устройств к микроконтроллерам. I2C использует модель "много главных — много подчиненных", в которой главное устройство управляет набором подчиненных устройств. I2C часто используется с такими периферийными устройствами, для которых нужно простое взаимодействие с микроконтроллером, например элементы управления настройками, выключатели питания и датчики.
Чтобы обращаться к периферийным устройствам через I2C, приложения могут вызывать API-интерфейсы I2C из Applibs, которые позволяют выполнять операции с интерфейсом главного устройства I2C. Пример с I2C для LSM6DS3 описывает, как настроить оборудование для работы с I2C на устройстве MT3620 и как использовать I2C в приложении.
Требования I2C
Приложения, которые используют I2C, должны включать соответствующие файлы заголовка для I2C, а в манифест приложения нужно добавить параметры I2C.
Все приложения должны установить свое целевое оборудование и содержать соответствующий файл заголовка определения оборудования.
Файлы заголовков
#define I2C_STRUCTS_VERSION 1
#include <applibs/i2c.h>
#include "path-to-your-target-hardware.h"
Объявите определение препроцессора I2C_STRUCTS_VERSION
до включения файла заголовка. Так вы укажете версию структуры, которая используется в приложении.
Замените "path-to-your-target-hardware.h" на путь к файлу заголовка для оборудования.
Параметры в манифесте приложения
Чтобы использовать API-интерфейсы I2C, необходимо добавить возможность I2cMaster
в манифест приложения и каждый главный интерфейс I2C. Это позволит приложению получить доступ к интерфейсу. Манифест приложения Azure Sphere содержит дополнительные сведения о манифесте приложения.
В своем коде используйте константы, определенные для вашего оборудования, чтобы идентифицировать интерфейсы I2C. При сборке приложения компилятор преобразует эти значения в необработанные значения.
Например, вот отрывок из манифеста приложения, который предназначен для MT3620 справочной платы разработки (RDB) и настраивает два главных интерфейса I2C:
"I2cMaster": [ "$MT3620_RDB_HEADER2_ISU0_I2C", "$MT3620_RDB_HEADER4_ISU1_I2C" ],
Следующий отрывок показывает, как задать те же самые главные интерфейсы I2C в приложении, ориентированном на Начальный набор Avnet MT3620:
"I2cMaster": [ "$AVNET_MT3620_SK_ISU0_I2C", "$AVNET_MT3620_SK_ISU1_I2C" ]
Открытие главного интерфейса I2C
Прежде, чем выполнять операции с главным интерфейсом I2C, его необходимо открыть путем вызова функции I2CMaster_Open.
Обновление параметров для главного интерфейса I2C
Открыв главный интерфейс, вы можете изменить следующие параметры:
- Чтобы изменить скорость шины для операций с главным интерфейсом, вызовите I2CMaster_SetBusSpeed.
- Чтобы изменить время ожидания для операций, вызовите I2CMaster_SetTimeout.
Выполнение операций чтения и записи через главный интерфейс I2C
Azure Sphere поддерживает несколько вариантов выполнения операций чтения и записи через I2C. Все варианты являются синхронными блокирующими операциями.
Для операций односторонней записи или чтения можно вызвать I2CMaster_Write или I2CMaster_Read. Это самый простой способ для операций с главным интерфейсом I2C, так как он указывает только одну операцию и включает адрес подчиненного устройства прямо в вызов функции.
Вы можете вызвать I2CMaster_WriteThenRead, чтобы выполнять объединенные операции записи и чтения в одной транзакции шины без прерываний другими транзакциями.
Для совместимости с некоторыми интерфейсами POSIX можно вызвать для односторонних транзакций функции POSIX read(2) и write(2). Перед вызовом read(2) или write(2) следует вызвать I2CMaster_SetDefaultTargetAddress, чтобы назначить адрес подчиненного устройства.
Эти функции можно использовать для выполнения операций записи нулевой длины, которые позволяют проверить наличие подчиненного устройства. При сбое операции чтения или записи приложение должно применять логику повторной отправки запроса.
Закрытие интерфейса I2C
Чтобы закрыть интерфейс, вызовите стандартную функцию POSIX close().
Поддержка MT3620
В этом разделе описываются параметры I2C, которые применяются только при выполнении Azure Sphere на плате MT3620.
Спецификации I2C для микросхемы MT3620 перечислены в сведениях о состоянии поддержки MT3620. Руководство пользователя для разработки платы MT3620 описывает расположение контактов и функции для подключения.
Папка HardwareDefinitions в каталоге установки пакета SDK Microsoft Azure Sphere содержит определения общих досок разработки Azure Sphere, модулей и микросхем. Он содержит файлы заголовков и JSON, определяющие главные интерфейсы для MT3620, MT3620 RDB, а также другого оборудования MT3620. Расположение по умолчанию для папки HardwareDefinitions находится C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions
в Windows и /opt/azurespheresdk/HardwareDefinitions
Linux.
Репозиторий примеров Azure Sphere на GitHub содержит файлы заголовков и JSON, определяющие главные интерфейсы SPI для микросхем MT3620 и RDB MT3620, а также другое оборудование MT3620.-->
- При настройке платы MT3620 можно использовать в качестве главного интерфейса I2C любой порт ISU. Когда порт ISU используется как главный интерфейс I2C, этот же порт нельзя применить в роли интерфейса SPI или UART.
- 10-разрядные адреса подчиненных устройств на MT3620 не поддерживаются. Допустимы только 7-разрядные адреса.
- MT3620 поддерживает скорости шины 100 кГц, 400 кГц и 1 МГц, но не 3,4 МГц.
- Операции чтения I2C нулевой длины на MT3620 не поддерживаются.
- При использовании I2C в высокоуровневом приложении только маркеры SCL и SDA в периферийном блоке ISU используются периферийным устройством I2C, а другие пин-коды можно использовать в качестве GPIOs тем же высокоуровневым приложением. Дополнительные сведения о периферийных устройствах ввода-вывода см. в списке неиспользуемых пин-адресов ISU, которые можно повторно использовать для GPIO.