USB-Wii Classic Controller (9 / 18 steg)
Steg 8: TWI / I2C förklarade
Relaterade värden:
- http://en.wikipedia.org/wiki/I%C2%B2C
- I2C Tutorial - inbäddade Labs
- < min andra instructable som förklarar I2C
På en TWI buss är två signal ledningarna SDA och SCL, i princip data och klocka. Dessa signaler är öppna avlopp (betyder dess logik är antingen hög impedans eller låg, det någonsin kan inte vara hög), men det måste finnas en pull-up resistor på var och en av dessa signaler (vi använder AVR: s interna pull-up motstånd). Detta är viktigt för alla enheter på en TWI buss kan köra signalerna låg när som helst, så att signalen kan endast bli hög när alla enheter tillåter att bli hög. Detta gör att enheter kan upptäcka när bussen är ockuperade ("skiljeförfarande med SDA") och även tillåta en långsam enhet att diktera hastigheten på klockan eller ens pausa en överföring om långsammare enheten är upptagen (detta kallas "klocka stretching". Dessa fakta gör TWI bussen bra för kommunikation mellan en massa chips med bara två kablar.
Varje transaktion är mellan en master (den som kör klocksignalen) och en slav enhet. Varje transaktion startar med en "starta skick" och slutar med ett "slutet villkor". En start villkora är när bus master enheterna SDA låg först, sedan köra SCL låg näst. Ett slutet villkor är när befälhavaren släpper TWI bussen genom att släppa SCL och sedan släppa SDA.
Efter start villkora har befälhavaren att välja vilken enhet att prata med genom att skicka en 7 bitars adress byte. Den 8: e (senast som skickas) biten anger huruvida befälhavaren vill läsa (1) från eller skriva (0) till slav behandlas. Om befälhavaren skriver, skickas sedan mer data. Om befälhavaren läser, kommer att det släppa SDA linjen så slav skickar data (men befälhavaren fortfarande driver klockan). När upp
Alla byte skickas MSB först (mest signifikanta bit först). Varje byte avslutas eventuellt av en bekräftelse/nacknowledgement. Kontrollera enheten databladet för att se vad enheten kommer att förvänta sig eller kommer att skicka tillbaka. Vanligtvis, för att citera Wikipedia: "om befälhavaren vill skriva till slav då upprepade gånger skickar en byte med slav skicka en ACK bit. (I denna situation, är befälhavaren i master sändningsläge och slaven är i slav ta emot-läge.) Om befälhavaren vill läsa från slav sedan den upprepade gånger får en byte från slav, lite befälhavaren skickar en ACK efter varje byte men sist. (I denna situation, master är i ledar-ta emot-läge och slaven är i slav överför funktionsläge.) "
Mer intrikata detaljer är oftast specifika för en viss enhet, och sådan information kommer från dess datablad.
När jag använder I2C/TWI med AVR mikrokontroller, använder jag låg nivå lagret av "Tråd" bibliotek för Arduino. Wire biblioteket är ett C++-omslag för lägre nivå "twi.c" och "twi.h"-modulen, som jag ändra spenslig och sammanställa i min egen kod (eftersom jag inte brukar använda C++). Det hand tar om nästan allt.
Wii Classic Controller har den I2C adressen 0x52, ha detta i åtanke. Använda "twi.c" och "twi.h", skickar vissa data till Wii Classic Controller, börja med att skapa en byte-array som innehåller data som ska skickas, och sedan skicka som till funktionen "twi_writeTo", tillsammans med måladressen, mängden data att skicka, och berätta det "vänta tills alla data skickas". Koden ser ut:
unsigned char dataArray [3] = {"a", "b", "c",};
twi_writeTo (0x52, dataArray, 3, 1);
Att läsa tre bytes, Använd funktionen "twi_readFrom" och berätta den adressen, data sparas i en matris du passera i, och du anger mängden data. Koden ser ut så:
unsigned char dataArray [3].
twi_readFrom (0x52, dataArray, 3);