Étape 5: Code Code Code !
J’ai écrit un sketch qui me permet de communiquer à l’ONU par l’intermédiaire de communication série de TTY via le Serial Monitor (ou même une invite de commandes Unix, comme vous le voyez bien). Il s’agit d’une méthode utile pour le débogage de nouveau matériel, comme je peux émettre des commandes de manière interactive.
La fonction « serialEvent() » est un rappel intégré, appelé chaque fois que quelque chose se passe sur l’objet de série par défaut. J’utilise ce rappel pour construire une chaîne de commandement et de définir un indicateur booléen (la construction octet par octet de la chaîne se termine lorsque le rappel se lit comme le point-virgule «; » dans le flux ; J’utilise cela au lieu d’un saut de ligne puisqu’il n’y a aucun moyen d’émettre une nouvelle ligne de la série monitor). Lorsque le rappel construit la chaîne et affecte à l’indicateur, la fonction « loop() » exécute un décodeur. Le décodeur détermine quelle fonction appeler selon la chaîne de commandement et analyse tous les paramètres supplémentaires de la chaîne de commandement et appelle cette fonction.
Chaque fonction est essentiellement un wrapper autour d’une implémentation de bas niveau d’un oscillogramme fonctionnelle WinBond SPI. J’ai utilisé un wrapper afin que les fonctions de bas niveau restent génériques : je peux les réutiliser dans d’autres dessins avec un simple copier-coller. De plus, le wrapper imprime un feedback à l’utilisateur, ce qui est très utile pour le débogage.
La capture d’écran ci-dessus montre une session interactive avec le Serial Monitor. J’ai publié quatre commandes, « get_jedec_id; », « read_page 0; », « write_byte 0 2 8; "et « read_page 0; » Vous n’en verrez les commandes (le moniteur de la série n’est pas un écho, et j’ai n’a pas imprimer la commande exacte... Je devrais probablement), mais vous ne voyez pas la réponse. Il devrait être plus clair quand je lecture/écriture/lecture page 0. Le « read_page »; commande exporte tout simplement la page spécifiée (en décimal). Le « write_byte »; fonction est un peu bizarre, car les paramètres spécifient un numéro de page, un décalage dans cette page, puis l’octet. Puisqu’il n’y a aucun registre 32 bits natif dans l’Atmega 16 bits, je ne dérange pas faire logique traduction physique, mais vous devrez considérer cette traduction à un moment donné. En tout cas, Notez que le troisième octet de la page zéro est maintenant « 08h ».
Je pourrais ont également émis « chip_erase; », puis « read_page 0; », pour illustrer un cycle d’effacement, mais j’espère que vous obtenez l’image.
Les fonctions de bas niveau commencent par « _ » et sont nommées « _read_page » ou « _write_page » ou « _erase_chip ». Ces fonctions de séquences explicitement les commandes de SPI dans les oscillogrammes de feuille de données. Chaque fonction se termine par un appel à « not_busy() » afin d’empêcher l’exécution d’aller de l’avant la puce a terminé son opération interne.
EDIT (11 mars 2014): il y avait un problème avec la fonction de bas niveau de _read_page, j’avais oublié de tirer Haut CS avant tirant vers le bas au début de la fonction, comme les autres fonctions. Cela signifie que si _read_page est la première fonction que vous appelez, CS peut pas encore être élevé, donc sans un /CS valide 1 -> 0 transition _read_page ne fonctionnera pas correctement, la première fois, elle est appelée. La deuxième fois cela fonctionnerait très bien parce qu’elle laisse/cs comme 1. Petit mais bug gênant.