I2C gebruiken in toepassingen op hoog niveau
Azure Sphere ondersteunt Inter-Integrated Circuit (I2C) in de hoofdmodus. I2C is een seriële bus die randapparatuur met lagere snelheid verbindt met microcontrollers. I2C maakt gebruik van een model met meerdere masters/meerdere ondergeschikten waarbij een hoofdapparaat een set onderliggende apparaten beheert. I2C wordt vaak gebruikt met randapparatuur waarvoor alleen eenvoudige, lichtgewicht communicatie met een microcontroller nodig is, zoals instellingen, aan/uit-schakelaars en sensoren.
Toepassingen hebben toegang tot randapparatuur via I2C door Applibs I2C-API's aan te roepen om bewerkingen uit te voeren op een I2C-hoofdinterface. In het LSM6DS3 I2C-voorbeeld wordt beschreven hoe u de hardware voor I2C configureert op een MT3620-apparaat en I2C gebruikt in een toepassing.
I2C-vereisten
Toepassingen die gebruikmaken van I2C moeten de juiste headerbestanden voor I2C bevatten en I2C-instellingen toevoegen aan het toepassingsmanifest.
Alle toepassingen moeten hun doelhardware instellen en het bijbehorende headerbestand voor de hardwaredefinitie bevatten.
Koptekstbestanden
#define I2C_STRUCTS_VERSION 1
#include <applibs/i2c.h>
#include "path-to-your-target-hardware.h"
Declareer de I2C_STRUCTS_VERSION
preprocessordefinitie voordat u het headerbestand opgeeft. Hiermee geeft u de struct-versie op die wordt gebruikt door de toepassing.
Vervang path-to-your-target-hardware.h door het pad naar het headerbestand voor uw hardware.
Toepassingsmanifestinstellingen
Als u de I2C-API's wilt gebruiken, moet u de I2cMaster
mogelijkheid toevoegen aan het toepassingsmanifest en vervolgens elke I2C-hoofdinterface toevoegen aan de mogelijkheid. Hierdoor heeft de toepassing toegang tot de interface.
Het Azure Sphere-toepassingsmanifest bevat meer informatie over het toepassingsmanifest.
Gebruik in uw code de constanten die zijn gedefinieerd voor uw hardware om de I2C-interfaces te identificeren. De compiler vertaalt deze waarden naar onbewerkte waarden wanneer u de app bouwt.
Hier volgt bijvoorbeeld een fragment van een toepassingsmanifest dat is gericht op een MT3620-referentieontwikkelingsbord (RDB) en twee I2C-masterinterfaces configureert:
"I2cMaster": [ "$MT3620_RDB_HEADER2_ISU0_I2C", "$MT3620_RDB_HEADER4_ISU1_I2C" ],
In het volgende fragment ziet u hoe u dezelfde I2C-masterinterfaces opgeeft in een toepassing die is gericht op de Avnet MT3620 Starter Kit:
"I2cMaster": [ "$AVNET_MT3620_SK_ISU0_I2C", "$AVNET_MT3620_SK_ISU1_I2C" ]
Een I2C-hoofdinterface openen
Voordat u bewerkingen uitvoert op een I2C-hoofdinterface, moet u deze openen door de functie I2CMaster_Open aan te roepen.
De instellingen voor een I2C-hoofdinterface bijwerken
Nadat u de hoofdinterface hebt geopend, kunt u de instellingen wijzigen:
- Als u de bussnelheid voor bewerkingen op de hoofdinterface wilt wijzigen, roept u I2CMaster_SetBusSpeed
- Als u de time-out voor bewerkingen wilt wijzigen, roept u I2CMaster_SetTimeout
Lees- en schrijfbewerkingen uitvoeren op de I2C-hoofdinterface
Azure Sphere ondersteunt verschillende opties voor het uitvoeren van lees- en schrijfbewerkingen met I2C. Deze opties zijn allemaal blokkerende, synchrone bewerkingen.
Voor schrijf- of leesbewerkingen in één richting kunt u I2CMaster_Write of I2CMaster_Read aanroepen. Dit is de eenvoudigste manier om bewerkingen uit te voeren op een I2C-hoofdinterface, omdat hiermee slechts één bewerking wordt opgegeven en het adres van het onderliggende apparaat in de functieaanroep wordt opgenomen.
U kunt I2CMaster_WriteThenRead aanroepen om een gecombineerde schrijf- en leesbewerking uit te voeren in één bustransactie zonder onderbreking van een andere transactie.
Voor interoperabiliteit met sommige POSIX-interfaces kunt u de functies POSIX read(2) en write(2) aanroepen om eenrichtingstransacties uit te voeren. U moet I2CMaster_SetDefaultTargetAddress aanroepen om het adres van het onderliggende apparaat in te stellen voordat u read(2) of write(2) aanroept.
U kunt deze functies aanroepen om schrijfbewerkingen van 0 bytes uit te voeren om de aanwezigheid van een onderliggend apparaat te controleren. Als een lees- of schrijfbewerking mislukt, moet uw toepassing het opnieuw uitgeven van de aanvraag afhandelen.
De I2C-interface sluiten
Als u de interface wilt sluiten, moet u de standaard-POSIX-functie close() aanroepen.
MT3620-ondersteuning
In deze sectie worden de I2C-opties beschreven die alleen van toepassing zijn bij het uitvoeren van Azure Sphere op de MT3620.
De I2C-specificaties voor de MT3620-chip worden vermeld in MT3620-ondersteuningsstatus. De gebruikershandleiding van het MT3620-ontwikkelbord beschrijft de speldindeling en -functies voor bedrading.
De map HardwareDefinitions in de installatiemap van de Microsoft Azure Sphere SDK bevat definities voor algemene Azure Sphere-ontwikkelborden, -modules en -chips. Het bevat header- en JSON-bestanden die de hoofdinterfaces definiëren voor de MT3620, MT3620 RDB, samen met andere MT3620-hardware. De standaardlocatie voor de map HardwareDefinitions is C:\Program Files (x86)\Microsoft Azure Sphere SDK\Hardware Definitions
in Windows en /opt/azurespheresdk/HardwareDefinitions
op Linux.
- Wanneer u het MT3620-ontwikkelbord configureert, kunt u elke ISU-poort gebruiken als I2C-hoofdinterface. Wanneer u een ISU-poort als I2C-hoofdinterface gebruikt, kunt u niet dezelfde poort gebruiken als een SPI- of UART-interface.
- 10-bits onderliggende apparaatadressen worden niet ondersteund op de MT3620; alleen 7-bits adressen worden ondersteund.
- De MT3620 ondersteunt bussnelheden van 100 KHz, 400 KHz en 1 MHz, maar niet 3,4 MHz.
- I2C-leesbewerkingen van 0 bytes worden niet ondersteund op de MT3620.
- Wanneer U I2C gebruikt in een toepassing op hoog niveau, worden alleen de SCL- en SDA-pinnen in het randapparatuurblok van ISU gebruikt door het I2C-randapparaat en kunnen de andere pinnen worden gebruikt als GPIO's door dezelfde toepassing op hoog niveau. Zie I/O-randapparatuur voor een lijst met ongebruikte ISU-pinnen die opnieuw kunnen worden gebruikt voor GPIO.