Usar I2C en aplicaciones de alto nivel
Azure Sphere admite circuito Inter-Integrated (I2C) en modo maestro. I2C es un bus serie que conecta periféricos de menor velocidad a microcontroladores. I2C usa un modelo multi-master/multi subordinado donde un dispositivo maestro controla un conjunto de dispositivos subordinados. I2C se usa a menudo con periféricos que solo requieren una comunicación sencilla y ligera con un microcontrolador, como configurar controles, interruptores de alimentación y sensores.
Las aplicaciones pueden acceder a periféricos a través de I2C llamando a las API de Applibs I2C para realizar operaciones en una interfaz maestra I2C. El ejemplo LSM6DS3 I2C describe cómo configurar el hardware para I2C en un dispositivo MT3620 y usar I2C en una aplicación.
Requisitos de I2C
Las aplicaciones que usan I2C deben incluir los archivos de encabezado adecuados para I2C y agregar la configuración de I2C al manifiesto de la aplicación.
Todas las aplicaciones deben establecer su hardware de destino e incluir el archivo de encabezado de definición de hardware correspondiente.
Archivos de encabezado
#define I2C_STRUCTS_VERSION 1
#include <applibs/i2c.h>
#include "path-to-your-target-hardware.h"
Declara la definición del I2C_STRUCTS_VERSION
preprocesador antes de incluir el archivo de encabezado. Esto especifica la versión struct que usa la aplicación.
Reemplace "path-to-your-target-hardware.h" por la ruta de acceso al archivo de encabezado del hardware.
Configuración de manifiesto de la aplicación
Para usar las API de I2C, debe agregar la I2cMaster
funcionalidad al manifiesto de la aplicación y, a continuación, agregar cada interfaz maestra I2C a la funcionalidad. Esto permite a la aplicación acceder a la interfaz.
El manifiesto de la aplicación Azure Sphere tiene más detalles sobre el manifiesto de la aplicación.
En el código, utilice las constantes que se definen para su hardware para identificar las interfaces I2C. El compilador traducirá estos valores a valores RAW al crear la aplicación.
Por ejemplo, este es un extracto de un manifiesto de aplicación que se centra en un panel de desarrollo de referencia de MT3620 (RDB) y configura dos interfaces maestras I2C:
"I2cMaster": [ "$MT3620_RDB_HEADER2_ISU0_I2C", "$MT3620_RDB_HEADER4_ISU1_I2C" ],
El siguiente extracto muestra cómo especificar las mismas interfaces maestras I2C en una aplicación que se centra en el kit de inicio Avnet MT3620:
"I2cMaster": [ "$AVNET_MT3620_SK_ISU0_I2C", "$AVNET_MT3620_SK_ISU1_I2C" ]
Abrir una interfaz maestra I2C
Antes de realizar operaciones en una interfaz maestra I2C, debe abrirla llamando a la función I2CMaster_Open .
Actualizar la configuración de una interfaz maestra I2C
Después de abrir la interfaz maestra, puede cambiar la configuración:
- Para cambiar la velocidad del autobús para operaciones en la interfaz maestra, llame a I2CMaster_SetBusSpeed
- Para cambiar el tiempo de espera de las operaciones, llame a I2CMaster_SetTimeout
Realizar operaciones de lectura y escritura en la interfaz maestra I2C
Azure Sphere admite varias opciones para realizar operaciones de lectura y escritura con I2C. Estas opciones son todas operaciones sincrónicas y de bloqueo.
Para operaciones de escritura o lectura unidireccionales, puede llamar a I2CMaster_Write o I2CMaster_Read. Esta es la forma más sencilla de realizar operaciones en una interfaz maestra I2C porque solo especifica una operación e incluye la dirección del dispositivo subordinado en la llamada de función.
Puede llamar a I2CMaster_WriteThenRead para realizar una operación combinada de escritura y lectura en una única transacción de bus sin interrupción de otra transacción.
Para la interoperabilidad con algunas interfaces POSIX, puede llamar a las funciones read(2) y write(2) de POSIX para realizar transacciones unidireccionales. Debe llamar a I2CMaster_SetDefaultTargetAddress para establecer la dirección del dispositivo subordinado antes de llamar a read(2) o write(2).
Puede llamar a estas funciones para realizar operaciones de escritura de 0 bytes con el fin de comprobar la presencia de un dispositivo subordinado. Si se produce un error en una operación de lectura o escritura, la aplicación debe encargarse de volver a emitir la solicitud.
Cerrar la interfaz I2C
Para cerrar la interfaz, debe llamar a la función POSIX estándar close().
Compatibilidad con MT3620
En esta sección se describen las opciones de I2C que solo se aplican al ejecutar Azure Sphere en mt3620.
Las especificaciones I2C para el chip MT3620 se enumeran en Estado de soporte técnico mt3620. La guía de usuario de la placa de desarrollo MT3620 describe el diseño de los pines y las funciones de cableado.
La carpeta HardwareDefinitions del directorio de instalación del SDK de Sphere de Microsoft Azure contiene definiciones para placas de desarrollo, módulos y chips comunes de Azure Sphere. Contiene archivos de encabezado y JSON que definen las interfaces maestras para el MT3620, MT3620 RDB, junto con otro hardware MT3620. La ubicación predeterminada para la carpeta HardwareDefinitions se encuentra C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions
en Windows y /opt/azurespheresdk/HardwareDefinitions
en Linux.
- Al configurar la placa de desarrollo MT3620, puede utilizar cualquier puerto ISU como interfaz maestra I2C. Cuando utiliza un puerto ISU como interfaz maestra I2C, no puede utilizar el mismo puerto que una interfaz SPI o UART.
- Las direcciones de dispositivo subordinadas de 10 bits no se admiten en el MT3620; solo se admiten las direcciones de 7 bits.
- El MT3620 admite velocidades de bus de 100 KHz, 400 KHz y 1 MHz, pero no de 3,4 MHz.
- Las lecturas I2C de 0 bytes no son compatibles con el MT3620.
- Al usar I2C en una aplicación de alto nivel, el periférico I2C solo usa los pin SCL y SDA del bloque periférico ISU, y los otros pin se pueden usar como GPIOs mediante la misma aplicación de alto nivel. Consulta Periféricos de E/S para obtener una lista de los pin de ISU que no se usan y que se pueden volver a usar para GPIO.