Dela via


Använda I2C i högnivåprogram

Viktigt!

Det här är dokumentationen om Azure Sphere (Legacy). Azure Sphere (Legacy) upphör den 27 september 2027 och användarna måste migrera till Azure Sphere (integrerad) vid den här tiden. Använd versionsväljaren ovanför TOC för att visa dokumentationen om Azure Sphere (integrerad).

Azure Sphere stöder interintegrerad krets (I2C) i huvudläge. I2C är en seriebuss som ansluter kringutrustning med lägre hastighet till mikrostyrenheter. I2C använder en modell med flera original/flera underordnade enheter där en huvudenhet styr en uppsättning underordnade enheter. I2C används ofta med kringutrustning som bara kräver enkel enkel kommunikation med en mikrostyrenhet, till exempel inställningskontroller, strömbrytare och sensorer.

Program kan komma åt kringutrustning via I2C genom att anropa Applibs I2C-API:er för att utföra åtgärder i ett I2C-huvudgränssnitt. I LSM6DS3 I2C-exempel beskrivs hur du konfigurerar maskinvaran för I2C på en MT3620-enhet och använder I2C i ett program.

Krav för I2C

Program som använder I2C måste innehålla lämpliga huvudfiler för I2C och lägga till I2C-inställningar i programmanifestet.

Alla program måste ange sin målmaskinvara och inkludera motsvarande rubrikfil för maskinvarudefinition.

Rubrikfiler

 #define I2C_STRUCTS_VERSION 1
 #include <applibs/i2c.h>
 #include "path-to-your-target-hardware.h"

Deklarera förprocessordefinitionen I2C_STRUCTS_VERSION innan du inkluderar huvudfilen. Detta anger den structversion som används av programmet.

Ersätt "path-to-your-target-hardware.h" med sökvägen till huvudfilen för maskinvaran.

Inställningar för programmanifest

Om du vill använda I2C-API:erna måste du lägga till I2cMaster funktionen i programmanifestet och sedan lägga till varje I2C-huvudgränssnitt i funktionen. Detta gör att programmet kan komma åt gränssnittet. Azure Sphere-programmanifestet innehåller mer information om programmanifestet.

I koden använder du de konstanter som har definierats för maskinvaran för att identifiera I2C-gränssnitten. Kompilatorn översätter dessa värden till råvärden när du skapar appen.

Här är till exempel ett utdrag från ett programmanifest som riktar sig mot en MT3620-referensutvecklingstavla (RDB) och konfigurerar två I2C-huvudgränssnitt:

"I2cMaster": [ "$MT3620_RDB_HEADER2_ISU0_I2C", "$MT3620_RDB_HEADER4_ISU1_I2C" ],

Följande utdrag visar hur du anger samma I2C-huvudgränssnitt i ett program som riktar sig till Avnet MT3620 Starter Kit:

"I2cMaster": [ "$AVNET_MT3620_SK_ISU0_I2C", "$AVNET_MT3620_SK_ISU1_I2C" ]

Öppna ett I2C-huvudgränssnitt

Innan du utför åtgärder i ett I2C-huvudgränssnitt måste du öppna det genom att anropa funktionen I2CMaster_Open .

Uppdatera inställningarna för ett I2C-huvudgränssnitt

När du har öppnat huvudgränssnittet kan du ändra inställningarna:

Utföra läs- och skrivåtgärder i I2C-huvudgränssnittet

Azure Sphere har stöd för flera alternativ för att utföra läs- och skrivåtgärder med I2C. De här alternativen är alla blockerande, synkrona åtgärder.

För enkelriktade skriv- eller läsåtgärder kan du anropa I2CMaster_Write eller I2CMaster_Read. Det här är det enklaste sättet att utföra åtgärder på ett I2C-huvudgränssnitt eftersom det bara anger en åtgärd och innehåller adressen till den underordnade enheten i funktionsanropet.

Du kan anropa I2CMaster_WriteThenRead för att utföra en kombinerad skrivåtgärd och sedan läsa i en enda busstransaktion utan avbrott från en annan transaktion.

För samverkan med vissa POSIX-gränssnitt kan du anropa funktionerna POSIX read(2) och write(2) för att utföra enkelriktade transaktioner. Du måste anropa I2CMaster_SetDefaultTargetAddress för att ange adressen till den underordnade enheten innan du anropar read(2) eller write(2).

Du kan anropa dessa funktioner för att utföra 0 bytes skrivåtgärder för att verifiera förekomsten av en underordnad enhet. Om en läs- eller skrivåtgärd misslyckas måste programmet hantera att skicka begäran igen.

Stäng I2C-gränssnittet

Om du vill stänga gränssnittet måste du anropa POSIX-standardfunktionen close().

MT3620-stöd

I det här avsnittet beskrivs de I2C-alternativ som endast gäller när du kör Azure Sphere på MT3620.

I2C-specifikationerna för MT3620-chipet visas i MT3620-supportstatus. Användarhandboken för MT3620-utvecklingskortet beskriver pin-layouten och funktionerna för kabeldragning.

Mappen HardwareDefinitions i installationskatalogen för Microsoft Azure Sphere SDK innehåller definitioner för vanliga Azure Sphere-utvecklingskort, moduler och chips. Den innehåller huvud- och JSON-filer som definierar huvudgränssnitten för MT3620, MT3620 RDB, tillsammans med annan MT3620-maskinvara. Standardplatsen för mappen HardwareDefinitions finns C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions i Windows och /opt/azurespheresdk/HardwareDefinitions i Linux.

Azure Sphere Samples-lagringsplatsen på GitHub innehåller huvud- och JSON-filer som definierar SPI-huvudgränssnitt för MT3620-chipet och MT3620 RDB, tillsammans med annan MT3620-maskinvara.-->

  • När du konfigurerar MT3620 dev board kan du använda valfri ISU-port som ett I2C-huvudgränssnitt. När du använder en ISU-port som ett I2C-huvudgränssnitt kan du inte använda samma port som ett SPI- eller UART-gränssnitt.
  • 10-bitars underordnade enhetsadresser stöds inte på MT3620. Endast 7-bitars adresser stöds.
  • MT3620 stöder 100 KHz, 400 KHz och 1 MHz busshastigheter, men inte 3,4 Mhz.
  • I2C-läsningar med 0 byte stöds inte på MT3620.
  • När du använder I2C i ett högnivåprogram används endast SCL- och SDA-stiften i ISU-kringutrustningsblocket av I2C-kringutrustningen, och de andra stiften kan användas som GPIOs av samma högnivåprogram. Se I/O-kringutrustning för en lista över oanvända ISU-stift som kan återanvändas för GPIO.