Designa med diskret SPI Flash minne (3 / 7 steg)
Steg 3: Hur man läser en Timing Diagram
Nu när jag har förklarat blixt, SPI, och en specifik implementering av ett SPI flash-enhet, de nästa saker du måste förstå är kommunikation timing diagram *. Timing diagram förklara sekvenseringen av data över stiften att utfärda instruktioner till enheten. Varje SPI enhet svarar på sin egen uppsättning instruktioner (t.ex. en flash-enhet kommer att ha en läsa eller radera instruktion) och timing diagrammet är länken mellan begreppsmässiga instruktion och själva hårdvaran protokollet att instruktion.
I diagrammet för detta avsnitt kopierade jag chip radera timing diagram från databladet eftersom det är lättast att förstå.
Den nedre axeln är tid, de lodräta axlarna representerar fyra SPI stift och ordnar data ska visas på dem över tid en instruktion. Obs: "Hög impedans" innebär att du kan ignorera den signalen (det drivs att inte 0 eller 1, men extremt högt motstånd, så det är faktiskt en öppen krets). Fall när två rader (som DI) det enkelt representerar att någon form av övergångar sker men är okänd; en enda rad innebär ett visst högt eller lågt värde är närvarande.
Låt oss titta på diagrammet från vänster till höger och uppifrån och ned.
För att prata med någon SPI enhet, det är chip-Välj måste flyttas högt och därefter drivande låg (kom ihåg /CS innebär aktiv låg). När /CS förs låg, Observera att klockan i diagrammet ritas uttryckligen för att Visa åtta faser. Detta innebär att du måste puls klockan åtta gånger, en gång per bit. Då klockan är stroboskopeffekt går data i från hög till låg till hög. Jag tycker DI diagrammet är felaktig, eftersom om du dra en vertikal linje ner stigande kanten av varje klocka och beräkna de binära värdena för DI vid dessa punkter, du borde få värdet 11000111 eller 0xC7. Detta är den instruktion som talar om chip att radera sig. När chip Välj tas högt, börjar de inre kretsarna köra funktionen 0xC7/Chip radera. Denna anvisning tar omkring 1 ~ 2 sekunder att slutföra.
Kom ihåg, du behöver inte växla faktiskt klockan pin 8 gånger att skicka ut 8 bitar i en byte, SPI biblioteket gör för dig när du använder funktionen SPI.transfer(). Behöver du fortfarande att manuellt köra /CS med digitalWrite(), men den SCK, MOSI och MISO hanteras alla av SPI funktioner.
Du kommer att märka i min källkod en funktion kallad "not_busy()". Denna funktion kontinuerligt utfärdar ett "Läs kontroll register #1" och kontrollerar bit 0 som anger om interna arbete har slutfört ännu och blixten inte är upptagen. Tidpunkten för denna operation matchar diagram 9.2.8 i databladet.
* Observera jag inte avser de elektriska timing diagram, som förklarar att nanosekund setup och håll tider för den interna digital logiken; diagram jag syftar på är de logiska diagram som ignorera nanosekunder och beskriver den logiska händelseförloppet. Faktiska elektriska tidpunkten för SPI gränssnitt hanteras av Arduino SPI biblioteket. Och att vara ärlig, att koden inte är mycket komplex, och kan förenklas ytterligare om du designar till en viss enhet.