Ultrasonic måttband (4 / 13 steg)
Steg 4: några ord om I²C buss
Kort beskrivning av bussen
I²C bussen är en 8 eller 10 bit, dubbelriktad seriell kommunikationsprotokoll, med överföringshastigheter på 100 KHz, 400 KHz eller nyligen 1 MHz (snabb läge plus). Bussen består av två dubbelriktade signaler (oftast heter SCL - seriell klocka, SDA - seriell data). Dessa signaler ansluta till varje I²C enhet i vår krets vi vill kommunicera med.
Thhe SDA linje används för seriell dataöverföring, raden SCL garanterar att kommunikationen är i synk, i båda riktningar. Förutom dessa två måste vi också ledar-I²C och I²C slavar att dela en gemensam grund.
Stiften i de enheter som är anslutna till en I²C buss är öppen-samlare eller öppen drain. Detta innebär att de kan väcka flytande kommunikationslinjen till marken, och de kan släppa den för att stiga till den nivå som drog de upp.
Det är mycket viktigt att förstå, att termen "release" inte innebär en '1', det betyder bara, att master eller slav inte är körning kommunikationslinjen. Med detta sagt, måste vi se till, att linjen inte är att bli låg, när det inte är tänkt att. Detta kan göras genom att installera en pull-up till power järnväg av kretsen. Vi behöver inte (eller inte måste) sätta en pull-up för varje slav i den krets, som skulle innebära en parallell anslutning, vilket - om alltför många motstånd var installerat - inte skulle tillåta stiftet att få linjen ner.
Värdet på motståndet används behöver inte vara ett givet värde, vanligtvis några k motstånd kommer att fungera bra.
I²C protokollet är master-slav baserat. En master beslutar när de slav enheterna kommunicerar genom vissa data som skickas till I²C buss. I vårt fall måste PIC konfigureras som en slav, eftersom Arduino kommer att vara herre i kretsen. En slav är oftast en sensor, en minneskrets, eller något som kan utöka funktioner en mikrokontroller.
All överföring utlöses av befälhavaren, slavarna inte kommunicera något, såvida inte befälhavaren ber dem att göra så. I²C buss funktion förutsätter, att en enda slavadress erkänns endast av en enda slav. När en slav är markerad får alla andra slavar tiga.
Befälhavaren är ansvarig för alla slags timings - i de flesta system (single master) klocka linjen manipuleras endast av befälhavaren. Detta innebär styrs att överföringshastigheten av I²C master av kretsen.
• När en mästare vill starta en överföring, det utför en start sekvens på I²C bussen. En start tillstånd uppstår när SDA linjen kommer till låg nivå medan SCL linjen är hög.
• När befälhavaren vill signalera, att överföringen är över, skickar den ett stoppvillkor, som är en stigande kanten på SDA SCL-värdet är högt.
• Data får överföras i tidsramen som mellan dessa två händelser. För lite data för att vara giltig, måste SDA inte ändra värde, medan SCL-värdet är hög. Om den gör det, bit-sekvens är misstolkas som ett stopp eller starta tillstånd, och leder till kommunikationsfel.
I mitt fall sker dataöverföring i 8-bitars grupper. Data - efter big endian mönstret - är klockat med den mest signifikanta biten går först. Efter varje 8-th bit blir klockat, måste slav signalera tillbaka för att överföringen ska betraktas som en framgångsrik datautbyte. Denna signal kallas ett "erkänna", och den förutsätter, att slaven sänker SDA linjen på 9-th klocksignal på raden SCL.
Som jag nämnt tidigare, måste varje slav ha en unik slavadress. Denna slavadress är 7 bitar lång, vilket innebär att totalt 128 enheter kan kopplas till den I²C bussen, utan någon form av ingrepp i kretsen.
När det gäller att ta itu med, befälhavaren sänder ut 8 bitar, adress 7 som är slav bitar, den sista en bestämma om befälhavaren vill läsa eller skriva i slav enheter interna register. Denna sista biten är känd som R/W lite, en '0' på denna bitfält innebär en skriva, en '1' på denna bitfält innebär en läsa.
Exempelvis om man vill skriva till en slav enhet med en slavadress av 0b1010000, måste han skicka 0b1010000 efter först börja skick. Om en mästare vill läsa från samma enhet, måste den första byten efter startvillkoret vara 0b10100001. Dessa har förvandlats till hexadecimalt ge 0xA0 och 0xA1. Datablad ge normalt slavadress i hexadecimalt format.
I vissa fall har tillverkaren tillåter användaren att lägga till mer av samma chip i den I²C bussen: detta uppnås genom att tillåta användaren att styra ett antal slav adress bitar. Till exempel har en I²C EEPROM vanligtvis lägre 3 bitar av dess slavadress gett ut på stift. Dra dessa höga innebär en '1' på motsvarande i slav adress byten, innebär dra dem till marken en '0' på den platsen.
Det finns situationer, där befälhavaren är alldeles för snabb för slaven, man vill läsa snabbare, än slav kunde hantera. För att undvika sådana här situationer, kan I²C slav enhetstillverkare bygga i en funktion, som gör slaven att dra raden SCL låg, medan de är upptagen med att köra kommandon från befälhavaren. När slaven sker med mätning, läsning, avkänning, etc. - släpper det SCL linjen, så att pull-ups till ta hög-linjen. Befälhavaren kommer att inte upprätta en annan överlåtelse, om inte den ser raden SCL hög. Detta benämns ofta som "klocka stretching".
Exempel på en startvillkoret följt av en read-kommando från slav 0xA3. Läs operationen är giltig, vi nu detta, från ACK (erkänner) signal skickas av slav.