- Vad är I2C-kommunikationsprotokoll?
- Hur fungerar I2C-kommunikation?
- Var ska jag använda I2C-kommunikation?
- I2C i MSP430: Styr AD5171 digital potentiometer
MSP430 är en kraftfull plattform som tillhandahålls av Texas Instruments för inbäddade projekt, dess mångsidiga natur har gjort det möjligt att hitta vägar till många applikationer och fasen pågår fortfarande. Om du har följt våra MSP430-självstudier, skulle du ha märkt att vi redan har täckt ett brett utbud av självstudier på denna mikrokontroller med utgångspunkt från de grundläggande. Sedan nu har vi täckt grunderna vi kan komma in på mer intressanta saker som kommunikationsportalen.
I det stora systemet med inbäddade applikationer kan ingen mikrokontroller utföra alla aktiviteter på egen hand. Vid någon tidpunkt måste den kommunicera med andra enheter för att dela information, det finns många olika typer av kommunikationsprotokoll för att dela informationen, men de mest använda är USART, IIC, SPI och CAN. Varje kommunikationsprotokoll har sina egna fördelar och nackdelar. Låt oss fokusera på I2C-delen för nu eftersom det är vad vi ska lära oss i denna handledning.
Vad är I2C-kommunikationsprotokoll?
Termen IIC står för " Inter Integrated Circuits ". Det betecknas normalt som I2C eller I kvadrat C eller till och med som 2-tråds gränssnittsprotokoll (TWI) på vissa ställen men allt betyder detsamma. I2C är ett synkron kommunikationsprotokoll som betyder att båda enheterna som delar informationen måste dela en gemensam klocksignal. Den har bara två ledningar för att dela information varav den ena används för kocksignalen och den andra används för att skicka och ta emot data.
Hur fungerar I2C-kommunikation?
I2C-kommunikation introducerades först av Phillips. Som sagt tidigare har den två ledningar, dessa två ledningar kommer att anslutas över två enheter. Här kallas en enhet en master och den andra enheten kallas slav. Kommunikation bör och kommer alltid att ske mellan två en mästare och en slav. Fördelen med I2C-kommunikation är att mer än en slav kan anslutas till en mästare.
Den fullständiga kommunikationen sker via dessa två ledningar, nämligen Serial Clock (SCL) och Serial Data (SDA).
Serial Clock (SCL): Delar klocksignalen som genereras av mastern med slaven
Serial Data (SDA): Skickar data till och från mellan Master och slav.
Vid varje given tidpunkt är det bara befälhavaren som kan initiera kommunikationen. Eftersom det finns mer än en slav i bussen måste mästaren hänvisa till varje slav med en annan adress. När endast slaven med den specifika adressen adresseras kommer att svara tillbaka med informationen medan de andra fortsätter. På så sätt kan vi använda samma buss för att kommunicera med flera enheter.
De spänningsnivåer i I2C är inte fördefinierade. I2C-kommunikation är flexibel, betyder att enheten som drivs av 5v volt, kan använda 5v för I2C och 3.3v-enheterna kan använda 3v för I2C-kommunikation. Men vad händer om två enheter som körs på olika spänningar behöver kommunicera med I2C? En 5V I2C-buss kan inte anslutas till en 3.3V-enhet. I detta fall används spänningsväxlare för att matcha spänningsnivåerna mellan två I2C-bussar.
Det finns vissa uppsättningar villkor som ramar in en transaktion. Initiering av sändning börjar med en fallande kant av SDA, vilket definieras som "START" -villkor i nedanstående diagram där master lämnar SCL högt medan SDA är lågt.
Som visas i ovanstående diagram, Den fallande kanten av SDA är hårdvarutlösaren för START-tillståndet. Efter detta går alla enheter på samma buss i lyssningsläge.
På samma sätt stoppar den stigande kanten av SDA överföringen som visas som 'STOPP-tillstånd i ovanstående diagram, där mastern lämnar SCL högt och också släpper SDA för att gå HÖG. Så stigande kant på SDA stoppar överföringen.
R / W-bit indikerar sändningsriktningen för följande byte, om den är HÖG betyder slaven att sända och om den är låg betyder att mastern kommer att sända.
Varje bit sänds på varje klockcykel, så det tar åtta klockcykler att sända en byte. Efter varje byte, antingen skickad eller mottagen, hålls den nionde klockcykeln för ACK / NACK (kvitterad / ej kvitterad). Denna ACK-bit genereras av antingen slav eller master beroende på situationen. För ACK-bit är SDA inställt på lågt av master eller slav vid 9: e klockcykeln. Så det är lågt det anses som ACK annars NACK.
Var ska jag använda I2C-kommunikation?
I2C-kommunikation används endast för kortdistanskommunikation. Det är verkligen tillförlitligt i viss utsträckning eftersom det har en synkroniserad klockpuls för att göra det smart. Detta protokoll används främst för att kommunicera med sensorer eller andra enheter som måste skicka information till en master. Det är mycket praktiskt när en mikrokontroller måste kommunicera med många andra slavmoduler med ett minimum av endast ledningar. Om du letar efter en långväga kommunikation bör du prova RS232 och om du letar efter mer tillförlitlig kommunikation bör du prova SPI-protokollet.
I2C i MSP430: Styr AD5171 digital potentiometer
Energia IDE är en av de enklaste programvarorna för att programmera vår MSP430. Det är samma som Arduino IDE. Du kan läsa mer om att komma igång med MSP430 med Energia IDE här.
Så för att använda I2C i Energia IDE måste vi bara inkludera wire.h-rubrikfilen . Stiftdeklaration (SDA och SCL) finns i trådbiblioteket, så vi behöver inte deklarera i installationsfunktionen .
Exempel på exempel finns i Exempelmenyn i IDE. Ett av exemplen förklaras nedan:
Det här exemplet visar hur man styr en Analog Devices AD5171 Digital Potentiometer som kommunicerar via det synkrona seriella protokollet I2C. Med hjälp av MSP: s I2C Wire Library kommer den digitala potten att gå igenom 64 motståndsnivåer och bleka en LED.
Först kommer vi att inkludera biblioteket som ansvarar för i2c-kommunikation, dvs. trådbibliotek
#omfatta
I installationsfunktionen startar vi trådbiblioteket med .begin () -funktionen.
ogiltig installation () { Wire.begin (); }
Initiera sedan en variabel val för att lagra värdena för potentiometern
byte val = 0;
I loop -funktionen, kommer vi att börja sändning till I2C slavanordningen (i detta fall Digital potentiometer IC) genom att ange enhetsadressen som ges i databladet av IC.
void loop () { Wire.beginTransmission (44); // överför till enhet # 44 (0x2c)
Därefter köbyte dvs. data som du vill skicka till IC för överföring med skrivfunktionen () .
Wire.write (byte (0x00)); // skickar instruktionsbyte Wire.write (val); // skickar potentiometervärdesbyte
Sänd dem sedan genom att ringa till endTransmission () .
Wire.endTransmission (); // sluta sända val ++; // inkrementvärde om (val == 64) {// om det nått 64: e position (max) val = 0; // starta om från lägsta värde } fördröjning (500); }