- Wat is het I2C-communicatieprotocol?
- Hoe I2C-communicatie werkt?
- Waar gebruik ik I2C-communicatie?
- I2C in MSP430: aansturen van AD5171 digitale potentiometer
MSP430 is een krachtig platform dat door Texas Instruments wordt geboden voor ingebedde projecten. Door zijn veelzijdige karakter heeft het mogelijkheden gevonden voor veel toepassingen en de fase is nog niet afgerond. Als je onze MSP430-tutorials hebt gevolgd, zou je hebben gemerkt dat we al een breed scala aan tutorials over deze microcontroller hebben behandeld, beginnend bij de basis. Sinds nu hebben we de basis besproken waarmee we op interessantere dingen kunnen komen, zoals het communicatieportaal.
In het enorme systeem van embedded applicaties kan geen enkele microcontroller alle activiteiten zelf uitvoeren. Op een bepaald moment moet het communiceren met andere apparaten om informatie te delen, er zijn veel verschillende soorten communicatieprotocollen om deze informatie te delen, maar de meest gebruikte zijn USART, IIC, SPI en CAN. Elk communicatieprotocol heeft zijn eigen voor- en nadeel. Laten we ons voorlopig concentreren op het I2C-gedeelte, want dat is wat we in deze tutorial gaan leren.
Wat is het I2C-communicatieprotocol?
De term IIC staat voor " Inter Integrated Circuits ". Het wordt normaal gesproken aangeduid als I2C of I squared C of zelfs als 2-draads interfaceprotocol (TWI) op sommige plaatsen, maar het betekent allemaal hetzelfde. I2C is een synchroon communicatieprotocol, wat betekent dat beide apparaten die de informatie delen een gemeenschappelijk kloksignaal moeten delen. Het heeft slechts twee draden om informatie te delen, waarvan de ene wordt gebruikt voor het cocksignaal en de andere wordt gebruikt voor het verzenden en ontvangen van gegevens.
Hoe I2C-communicatie werkt?
I2C-communicatie werd voor het eerst geïntroduceerd door Phillips. Zoals eerder gezegd heeft het twee draden, deze twee draden worden over twee apparaten verbonden. Hier wordt het ene apparaat een master genoemd en het andere apparaat als slaaf. Communicatie moet en zal altijd plaatsvinden tussen twee een Master en een Slave. Het voordeel van I2C-communicatie is dat er meer dan één slaaf op een master kan worden aangesloten.
De volledige communicatie vindt plaats via deze twee draden, namelijk Serial Clock (SCL) en Serial Data (SDA).
Seriële klok (SCL): deelt het kloksignaal dat door de master wordt gegenereerd met de slave
Seriële gegevens (SDA): verzendt de gegevens van en naar tussen de master en slave.
Op elk moment kan alleen de master de communicatie starten. Omdat er meer dan één slave in de bus is, moet de master naar elke slave verwijzen met een ander adres. Wanneer hij wordt aangesproken, zal alleen de slaaf met dat specifieke adres antwoorden met de informatie terwijl de anderen stoppen. Op deze manier kunnen we dezelfde bus gebruiken om met meerdere apparaten te communiceren.
De spanningsniveaus van I2C zijn niet voorgedefinieerd. I2C-communicatie is flexibel, wat betekent dat het apparaat dat wordt gevoed door 5v volt, 5v kan gebruiken voor I2C en de 3.3v-apparaten 3v kunnen gebruiken voor I2C-communicatie. Maar wat als twee apparaten die op verschillende voltages werken, via I2C moeten communiceren? Een 5V I2C-bus kan niet worden aangesloten op een 3,3V-apparaat. In dit geval worden spanningsverschuivers gebruikt om de spanningsniveaus tussen twee I2C-bussen af te stemmen.
Er zijn een aantal voorwaarden die een transactie kaderen. De initialisatie van de verzending begint met een dalende flank van SDA, die wordt gedefinieerd als 'START'-voorwaarde in het onderstaande diagram, waarbij de master SCL hoog laat terwijl SDA laag wordt ingesteld.
Zoals weergegeven in het bovenstaande diagram hieronder, De neergaande flank van SDA is de hardwaretrigger voor de START-conditie. Hierna gaan alle apparaten op dezelfde bus in luistermodus.
Op dezelfde manier stopt de stijgende flank van SDA de transmissie die wordt weergegeven als 'STOP'-toestand in het bovenstaande diagram, waarbij de master SCL hoog laat en ook SDA vrijgeeft om HIGH te gaan. Dus stijgende flank van SDA stopt de verzending.
De R / W-bit geeft de transmissierichting van de volgende bytes aan, als het HOOG is, betekent dit dat de slaaf zal verzenden en als het laag is, betekent dit dat de master zal verzenden.
Elke bit wordt op elke klokcyclus verzonden, dus het duurt 8 klokcycli om een byte te verzenden. Na elke verzonden of ontvangen byte wordt de negende klokcyclus vastgehouden voor de ACK / NACK (bevestigd / niet bevestigd). Deze ACK-bit wordt gegenereerd door een slaaf of een master, afhankelijk van de situatie. Voor ACK bit, is SDA te laag ingesteld door de master of slave op 9 ste klokcyclus. Het is dus laag en wordt als ACK beschouwd, anders NACK.
Waar gebruik ik I2C-communicatie?
I2C-communicatie wordt alleen gebruikt voor communicatie op korte afstand. Het is zeker tot op zekere hoogte betrouwbaar omdat het een gesynchroniseerde klokpuls heeft om het slim te maken. Dit protocol wordt voornamelijk gebruikt om te communiceren met sensoren of andere apparaten die informatie naar een master moeten sturen. Het is erg handig wanneer een microcontroller moet communiceren met veel andere slavemodules met een minimum aan alleen draden. Als u op zoek bent naar langeafstandscommunicatie, moet u RS232 proberen en als u op zoek bent naar betrouwbaardere communicatie, moet u het SPI-protocol proberen.
I2C in MSP430: aansturen van AD5171 digitale potentiometer
Energia IDE is een van de gemakkelijkste software om onze MSP430 te programmeren. Het is hetzelfde als Arduino IDE. U kunt hier meer lezen over Aan de slag met MSP430 met Energia IDE.
Dus om I2C in Energia IDE te gebruiken, moeten we gewoon het header-bestand wire.h opnemen . Pin-declaratie (SDA en SCL) bevindt zich in de draadbibliotheek, dus we hoeven niet te declareren in de instelfunctie .
Voorbeeldvoorbeelden zijn te vinden in het Voorbeeldmenu van de IDE. Een van de voorbeelden wordt hieronder uitgelegd:
Dit voorbeeld laat zien hoe u een Analog Devices AD5171 digitale potentiometer bestuurt die communiceert via het I2C synchroon serieel protocol. Met behulp van de I2C Wire Library van MSP zal de digitale pot door 64 weerstandsniveaus stappen, waarbij een LED vervaagt.
Ten eerste zullen we de bibliotheek opnemen die verantwoordelijk is voor i2c-communicatie, dwz de draadbibliotheek
# omvatten
In de setup- functie zullen we de draadbibliotheek starten met de .begin () -functie.
leegte setup () { Wire.begin (); }
Initialiseer vervolgens een variabele val om de waarden van de potentiometer op te slaan
byte val = 0;
In de lusfunctie starten we de verzending naar het i2c-slaveapparaat (in dit geval Digitale potentiometer IC) door het apparaatadres op te geven dat is opgegeven in het gegevensblad van het IC.
void loop () { Wire.beginTransmission (44); // verzenden naar apparaat # 44 (0x2c)
Zet vervolgens bytes in de wachtrij, dwz gegevens die u naar de IC wilt verzenden voor verzending met de functie write () .
Wire.write (byte (0x00)); // verzendt instructiebyte Wire.write (val); // verzendt de byte van de potentiometerwaarde
Verzend ze vervolgens door endTransmission () aan te roepen.
Wire.endTransmission (); // stop met het verzenden van val ++; // waarde verhogen if (val == 64) {// indien bereikt 64ste positie (max) val = 0; // begin opnieuw vanaf de laagste waarde } vertraging (500); }