Usare I2C nelle applicazioni di alto livello
Importante
Questa è la documentazione di Azure Sphere (legacy). Azure Sphere (legacy) viene ritirato il 27 settembre 2027 e gli utenti devono eseguire la migrazione ad Azure Sphere (integrato) entro questo periodo. Usare il selettore di versione posizionato sopra il sommario per visualizzare la documentazione di Azure Sphere (integrata).
Azure Sphere supporta I2C (Inter-Integrated Circuit) in modalità master. I2C è un bus seriale che connette le periferiche a bassa velocità ai microcontroller. Usa un modello multimaster/multisubordinato in cui un dispositivo master controlla un set di dispositivi subordinati. Si usa in genere con periferiche che richiedono solo una semplice comunicazione leggera con un microcontroller, ad esempio per l'impostazione di controlli, interruttori di alimentazione e sensori.
Le applicazioni possono accedere alle periferiche tramite I2C effettuando una chiamata alle API I2C Applibs per eseguire operazioni su un'interfaccia master I2C. L'esempio LSM6DS3 I2C descrive come configurare l'hardware per I2C su un dispositivo MT3620 e usare I2C in un'applicazione.
Requisiti di I2C
Le applicazioni che usano I2C devono includere i file di intestazione appropriati per I2C e aggiungere le impostazioni di I2C al manifesto dell'applicazione.
Tutte le applicazioni devono impostare il relativo hardware di destinazione e includere il corrispondente file di intestazione di definizione dell'hardware.
File di intestazione
#define I2C_STRUCTS_VERSION 1
#include <applibs/i2c.h>
#include "path-to-your-target-hardware.h"
Dichiarare la definizione del preprocessore I2C_STRUCTS_VERSION
prima di includere il file di intestazione. Specifica la versione dello struct usato dall'applicazione.
Sostituire "path-to-your-target-hardware.h" con il percorso del file di intestazione dell'hardware in uso.
Impostazioni del manifesto dell'applicazione
Per usare le API I2C, è necessario aggiungere la funzionalità I2cMaster
al manifesto dell'applicazione, quindi aggiungere ogni interfaccia master I2C alla funzionalità. In questo modo l'applicazione può accedere all'interfaccia. Il manifesto dell'applicazione Azure Sphere contiene altri dettagli sul manifesto dell'applicazione.
Nel codice usare le costanti definite per l'hardware in uso per identificare le interfacce I2C. Il compilatore convertirà questi valori in valori non elaborati quando si compila l'app.
Ad esempio, di seguito è riportato un estratto di un manifesto dell'applicazione che ha come destinazione una scheda di sviluppo di riferimento (Reference Development Board, RDB) MT3620 e configura due interfacce master I2C:
"I2cMaster": [ "$MT3620_RDB_HEADER2_ISU0_I2C", "$MT3620_RDB_HEADER4_ISU1_I2C" ],
Nell'estratto seguente viene illustrato come specificare le stesse interfacce master I2C in un'applicazione che ha come destinazione Avnet MT3620 Starter Kit:
"I2cMaster": [ "$AVNET_MT3620_SK_ISU0_I2C", "$AVNET_MT3620_SK_ISU1_I2C" ]
Aprire un'interfaccia master I2C
Prima di eseguire operazioni su un'interfaccia master I2C, è necessario aprirla effettuando una chiamata alla funzione I2CMaster_Open.
Aggiornare le impostazioni per un'interfaccia master I2C
Dopo aver aperto l'interfaccia master, è possibile cambiare le impostazioni:
- Per cambiare la velocità di bus per le operazioni nell'interfaccia master, chiamare I2CMaster_SetBusSpeed
- Per cambiare il timeout per le operazioni, chiamare I2CMaster_SetTimeout
Eseguire operazioni di lettura e scrittura sull'interfaccia master I2C
Azure Sphere supporta diverse opzioni per eseguire operazioni di lettura e scrittura con I2C. Queste opzioni sono tutte operazioni sincrone bloccanti.
Per le operazioni di lettura o scrittura unidirezionali, è possibile chiamare I2CMaster_Write o I2CMaster_Read. Questo è il modo più semplice per eseguire operazioni su un'interfaccia master I2C, perché viene specificata un'unica operazione e l'indirizzo del dispositivo subordinato è incluso nella chiamata alla funzione.
Per eseguire un'operazione combinata di scrittura e quindi lettura in una singola transazione di bus senza interruzioni da altre transazioni, è possibile chiamare I2CMaster_WriteThenRead.
Per l'interoperabilità con alcune interfacce POSIX, è possibile chiamare le funzioni POSIX read(2) e write(2) per eseguire transazioni unidirezionali. Prima di chiamare read(2) o write(2), è necessario chiamare I2CMaster_SetDefaultTargetAddress per impostare l'indirizzo del dispositivo subordinato.
È possibile chiamare queste funzioni per eseguire operazioni di scrittura di 0 byte e verificare la presenza di un dispositivo subordinato. Se un'operazione di lettura o scrittura non riesce, l'applicazione deve gestire il rinvio della richiesta.
Chiudere l'interfaccia I2C
Per chiudere l'interfaccia, è necessario chiamare la funzione POSIX close() standard.
Supporto di MT3620
Questa sezione descrive le opzioni di I2C applicabili solo quando si esegue Azure Sphere su MT3620.
Le specifiche di I2C per il chip MT3620 sono indicate in MT3620: stato del supporto. Il manuale utente della scheda di sviluppo MT3620 descrive il layout dei pin e le funzioni per il cablaggio.
La cartella HardwareDefinitions nella directory di installazione di Microsoft Azure Sphere SDK contiene definizioni per schede di sviluppo, moduli e chip di Azure Sphere comuni. Contiene file di intestazione e JSON che definiscono le interfacce master per MT3620, MT3620 RDB, insieme ad altri hardware MT3620. Il percorso predefinito per la cartella HardwareDefinitions si trova C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions
in Windows e /opt/azurespheresdk/HardwareDefinitions
in Linux.
Il repository di esempi di Azure Sphere in GitHub contiene file di intestazione e JSON che definiscono interfacce master SPI per il chip MT3620 e MT3620 RDB, insieme ad altri hardware MT3620.>
- Quando si configura la scheda di sviluppo MT3620, è possibile usare qualsiasi porta ISU come interfaccia master I2C. Se si usa una porta ISU come interfaccia master I2C, non è possibile usare la stessa porta come interfaccia SPI o UART.
- Gli indirizzi di 10 bit dei dispositivi subordinati non sono supportati su MT3620; sono supportati solo indirizzi di 7 bit.
- MT3620 supporta velocità di bus a 100 KHz, 400 KHz e 1 MHz, ma non a 3,4 Mhz.
- Le letture di I2C di 0 byte non sono supportate su MT3620.
- Quando si usa I2C in un'applicazione di alto livello, solo i pin SCL e SDA nel blocco di periferiche ISU vengono usati dalla periferica I2C e gli altri pin possono essere usati come oggetti Criteri di gruppo dalla stessa applicazione di alto livello. Vedere Periferiche di I/O per un elenco dei pin ISU inutilizzati che possono essere riutilizzati per GPIO.