Stap 5: Code Code Code!
Ik schreef een schets die me toestaat om te communiceren met de Uno via seriële TTY communicatie via de seriële Monitor (of zelfs een Unix-prompt, zoals u goed zien). Dit is een nuttige methode voor het debuggen van nieuwe hardware, zoals ik opdrachten interactief kan uitgeven.
De "serialEvent()"-functie is een ingebouwde terugbellen, aangeroepen wanneer iets op het standaard seriële-object gebeurt. Ik gebruik deze terugbellen te bouwen een opdrachtreeks en stelt u een Boole-vlag (de bouw van de byte-door-byte van de tekenreeks is voltooid wanneer de callback als puntkomma ";" van de stream leest; Ik gebruik dit in plaats van een newline aangezien er geen manier om een nieuwe regel van de seriële monitor). Wanneer de callback de tekenreeks construeert en stelt u de vlag, uitvoert de "loop"-functie een decoder. De decoder bepaalt welke aan te roepen functie op basis van de opdrachtreeks, en eventuele extra parameters van de opdrachtreeks parseert en die functie aanroept.
Elke functie is in wezen een wrapper rond een low-level implementatie van een diagram van de functionele timing WinBond SPI. Ik gebruikte een wrapper zodat de low-level functies generieke blijven: ik ze opnieuw kunt gebruiken in andere schetsen met een eenvoudig knippen en plakken. Plus drukt de wrapper wat feedback aan de gebruiker, wat zeer handig is voor debug.
De bovenstaande screenshot toont een interactieve sessie met de seriële Monitor. Ik heb afgegeven vier opdrachten, "get_jedec_id;", "read_page 0;", "write_byte 0 2 8;", en "read_page 0;" Je zie niet echt de opdrachten (de seriële monitor hoeft niet een echo en ik niet de exacte opdracht afdrukken... Ik waarschijnlijk zou moeten hebben), maar u ziet de reactie. Moet het meest duidelijk wanneer ik lezen/schrijven/lezen pagina 0. De "read_page;" opdracht wordt gewoon gedumpt in de opgegeven pagina (in decimaal). De "write_byte;" functie is een beetje raar, zoals de parameters geven aan een paginanummer, een offset naar die pagina, waarna de byte. Aangezien er geen native 32-bits register in de 16-bits Atmega is, ik heb niet de moeite doen logische fysieke vertaling, maar moet u overwegen deze vertaling op een bepaald punt. Anyways, merk op dat de derde byte van pagina nul is nu "08h".
Ik kon hebben ook uitgegeven "chip_erase;" en vervolgens "read_page 0;" ter illustratie van een cyclus van wissen, maar hopelijk krijg je de foto.
De lage functies beginnen met "_", en heten "_read_page" of "_write_page" of "_erase_chip". Deze functies expliciet volgnummer uit de opdrachten van de SPI gevonden in het gegevensblad timing diagrammen. Elke functie eindigt met een oproep tot "not_busy()" om te voorkomen dat de uitvoering van de procedure, voordat de chip heeft voltooid zijn interne werking.
BEWERKEN (11-MAR-2014): er was een probleem met de low-level functie van _read_page, ik was vergeten te trekken CS hoge voordat trekken het laag aan het begin van de functie, net als de andere functies. Dit betekent dat als _read_page is de eerste functie die u aanroept, CS kan niet al hoog, dus zonder een geldig /CS 1 -> 0 overgang _read_page niet behoorlijk zal functioneren, de eerste keer het heet. De tweede keer het zou prima werken omdat het laat /CS als 1. Klein maar vervelend Boeg.