AVR Assembler handledning 10 (6 / 10 steg)
Steg 6: Hur det tolerabla VECKOINTAGET överför data?
Vi skulle nu vilja diskutera exakt vad som händer när det tolerabla VECKOINTAGET sänder data.
Det första vi överför är startvillkoret"". Detta är en fallande SDA signal när SCL signalen är hög. Så om du tittar på de två raderna visas SCL-värdet går upp och ner mellan 0V och 5V i en fyrkantsvåg 490 gånger per sekund. SDA linjen, å andra sidan, sitter bara där på 5V. Nu, plötsligt, SDA linjen sjunker till 0V samtidigt SCL linjen är i hög (5V) delen av sin cykel. Detta är en "start"-tillstånd. När den slav see som inträffar det fjädrar till handling. Tja... Jag säger "fjädrar i action" men eftersom slaven CPU-frekvens är 16 MHz och den SCL är 490 Hz betyder att slaven har 32653 cykler att sitta och tråkigt tummarna innan nästa SCL cykel kommer tillsammans. Så det "växer knappast i handling" men du får min mening.
När slaven upptäcker en startvillkoret, klockor linjer och börjar spela in på nästa hög klocka pulsen. De nästa 7 bitarna blir adressen till den slav som befälhavaren vill prata med. Så, till exempel antar att jag är slav och jag ser SDA sjunka till 0V under en hög puls på raden SCL. Då jag vet överföring har startat, jag då se SCL-värdet går till dess låg del, sedan tillbaka upp till hög igen, då jag ser på SDA under denna höga del och se det är låg (0V), innebär den första biten av adressen är 0, jag då vänta på nästa hög puls och igen titta på SDA, igen jag ser en 0V , så nästa adress lite är en annan 0, sedan nästa puls jag se 5V på SDA linjen, så jag vet nästa adress lite är en 1, och detta pågår tills jag har 7 adress bitar. När jag har hela 7 bitars slavadress jag jämföra det med min egen adress och om det är olika jag ignorera bara raden TWI efter det. Om det är samma som min adress då vet jag ledarstyrning vill prata med mig.
Jag då vänta på nästa hög SCL puls och om SDA är en 1 då vet jag det master vill att läsa från mig. Detta innebär master i "Master mottagare Mode". Annars om SDA var 0 skulle istället det innebära master vill skriva till mig. Detta innebär master i "Master sändaren Mode". Nu vet jag om jag är slav som adress, och jag vet om det är en Läs- eller skrivåtgärder. Detta tog 8 klockcykler och överförda 8 bitar (7 adress bitar och lite Läs/skriv) vilket är bra eftersom jag automatiskt lagra det byte i ett dataregister som heter TWDR som jag använder för att räkna ut om det är min adress och om det är en Läs- eller skrivåtgärder.
Då måste jag erkänna att jag fått att information så jag dra raden SDA låg i den nästa hög SCL cykel (den 9: e cykeln sedan starten) och detta säger master än fick jag allt och jag är redo för nästa datapaketet.
Om jag vill, kan på denna punkt jag dra raden SCL låg och bara behålla det där så länge jag vill. Detta kommer att "pausa" saker tills jag låta det gå högt igen.
När saker och ting fortsätta, antar att det var en skriva signal. Det innebär att befälhavaren kommer nu att skicka mig några data-byte. Jag titta på SDA linjen igen och samla in bitarna som de kommer in. Denna gång blir det 8 bitar (kommer från MSB att LSB, dvs från bit 7 för att bit 0) och sedan, om jag fick dem alla utan några problem, kommer jag med SDA linjen till 0V igen i den 9: e cykeln att erkänna att jag fick dem. Detta kan fortsätta på obestämd tid, skicka byte efter byte. Varje gång jag får en det kommer att automatiskt lagras i TWDR och det är mitt jobb att kopiera den därifrån och göra något med det innan nästa databyte kommer in och skriver över den. Slutligen, när befälhavaren är färdiga skickar mig information, ett "stop" tillstånd att skickas. Detta är när befälhavaren drar SDA raden hög i mitten av den höga delen av SCL klockcykel. När jag ser detta är jag klar med det tolerabla VECKOINTAGET tills jag upptäcka en startvillkoret följt av min adress igen.
Märka något. När SCL klockcykel är låg när registeransvarige är att inrätta den nästa bit. Till exempel om jag vill skicka en 1 till slav i nästa klockan cykel, jag använder tiden när raden SCL är låg mellan cykler för att ange SDA alltid antingen hög eller låg så att när nästa hög cykel visas min SDA linje redan porträttera den lite som jag vill skicka. Då jag lämna den antingen 0 eller 1 till det hela kicken arrangerar gradvis tills SCL-värdet går tillbaka ner och jag kan justera igen till min nya data lite. Å andra sidan, om jag vill skicka en START eller stopp, jag satt upp ett starttillstånd under den låga delen av cykeln som vanligt, men sedan istället för att bara lämna det som det genom nästa hög fas, jag övergå till den motsatt läge under den höga delen av cykeln.
Till exempel säga jag är master och jag har slutat sända min data-byte och jag vill skicka en stoppsignal till slav. Sedan under nästa låg cykel kommer att efter att jag har fått kvittering för min senaste databit jag kommer dra raden SDA låg och vänta, sedan under nästa hög fas av SCL-värdet jag dra raden SDA hög. Denna övergång berättar alla på den rad som ett stoppvillkor har inträffat.
Du bör granska alla figurerna på sidorna 208 till 211 och förstår mekaniken i TWI signalerna. De diskuterar också "upprepade startar", mellan flera bakgrunder, och andra saker som jag inte kommer komma in eftersom vi inte behöver dem ännu.