Nous écrivons un chargeur de démarrage OTA pour ATmega128RFA1 (dans le cadre du périphérique Smart Response XE)

Nous écrivons un chargeur de démarrage OTA pour ATmega128RFA1 (dans le cadre du périphérique Smart Response XE)

Tout a commencé avec l'achat par l'auteur d'un appareil intéressant sur le marché secondaire - Smart Response XE (brève description). Il est destiné aux écoles : chaque élève de la classe reçoit un appareil semblable à un cahier électronique ou à un traducteur des années 802.15.4, l'enseignant pose une question, et les élèves tapent les réponses sur les claviers des appareils, qui sont reçues via un canal radio (XNUMX) vers un récepteur connecté au PC du professeur.

Ces appareils ont été abandonnés il y a plusieurs années, et ce que les écoles achetaient entre 100 et 200 dollars pièce apparaît désormais sur eBay pour 10 dollars ou moins. Le matériel y est très adapté aux expériences geek :

  • clavier 60 touches
  • affichage avec une résolution de 384×136, 2 bits par pixel - similaire à BC, CGA, mais 4 pas de couleurs, mais des gradations de luminosité
  • microcontrôleur ATmega128RFA1 (mémoire flash 128 Ko, ROM 4 Ko, RAM 16 Ko, émetteur-récepteur 802.15.4)
  • externe (par rapport au microcontrôleur, pas à l'ensemble de l'appareil) mémoire flash de 1 mégabit (128 kilo-octets) avec interface SPI
  • compartiment pour 4 éléments AAA.

D'après le nom du microcontrôleur, il est clair qu'il appartient à la famille AVR, ce qui signifie que rendre l'appareil compatible Arduino est une tâche plus que triviale...

De l'actualité sur Hackaday l'auteur a découvert ce que c'était a déjà fait (le même lien vous indique quoi connecter où), avoir la possibilité de faire tourner des jeux pour Arduboy :


Mais l'auteur est plus intéressé par la possibilité non pas de jouer sur l'appareil, mais d'étudier :

  • mémoire flash avec interface série SPI
  • chargeurs de démarrage pour AVR
  • norme 802.15.4

L'auteur a commencé par écrire Bibliothèque (GPL v3), qui vous permet d'initialiser l'affichage, d'afficher du texte et des rectangles et d'accéder à la mémoire flash SPI. Puis il commence à proposer des idées d'utilisation pratique de l'appareil : un terminal de poche compatible VT-100, des jeux multijoueurs. Après avoir reconstruit trois appareils, il décide de leur « apprendre » à recevoir des croquis « par voie hertzienne ». Ce qui serait non seulement intéressant, mais aussi très pratique : le boîtier de l'appareil est difficile à ouvrir à chaque fois, et sous le couvercle du compartiment à piles, il n'y a que des trous qui permettent de connecter un programmateur JTAG à la carte.

Nous écrivons un chargeur de démarrage OTA pour ATmega128RFA1 (dans le cadre du périphérique Smart Response XE)

Cela suffit pour télécharger le chargeur de démarrage Arduino, mais pas le croquis - le port série n'y est pas connecté, vous ne pouvez donc toujours pas vous passer d'ouvrir le boîtier. De plus, les lignes TX0 et RX0 du premier port série sont combinées avec les lignes d'interrogation de la matrice du clavier, à savoir celles qui interrogent les touches de fonction sur les côtés de l'écran. Mais que pouvez-vous faire - l'auteur a construit ceci :

Nous écrivons un chargeur de démarrage OTA pour ATmega128RFA1 (dans le cadre du périphérique Smart Response XE)

Il y a amené les lignes JTAG, et désormais il n'est plus nécessaire d'ouvrir le compartiment à piles. Et pour que les croquis puissent être téléchargés, j'ai connecté les deux ports série au même connecteur, en ajoutant également un interrupteur, car avec les piles installées, il est physiquement impossible d'éteindre l'appareil d'une autre manière.

Il a fallu un certain temps pour travailler avec un fer à souder, un couteau tout usage et un pistolet à colle. En général, télécharger des croquis « par voie hertzienne » est beaucoup plus pratique ; nous devons de toute urgence inventer quelque chose pour cela.

Arduino IDE utilise le programme pour télécharger des croquis avrude. Il interagit avec le microcontrôleur en utilisant le protocole STK500, qui vous permet de transférer des fichiers dans les deux sens. Il est peu compatible avec les canaux où des retards variables, des distorsions et des pertes de données sont possibles. Si quelque chose se détache ou bruisse dans le canal série, vous pouvez devenir fou en cherchant la cause. Une fois, l'auteur a souffert pendant une demi-journée jusqu'à ce qu'il se rende compte que le problème venait d'un mauvais câble, ainsi que d'un convertisseur d'interface CP2102 capricieux. Même un microcontrôleur avec un convertisseur d'interface intégré, par exemple ATmega32u4, peut parfois agir ainsi. Chaque utilisateur d'Arduino a remarqué que les erreurs lors du téléchargement de croquis ne sont pas si rares. Parfois l'enregistrement se passe bien, mais lors d'un test de lecture une erreur est détectée. Cela ne signifie pas qu'il y a eu une erreur lors de l'écriture - il y a eu un échec lors de la lecture. Imaginez maintenant que lorsque vous travaillez « en direct », la même chose se produit, mais beaucoup plus souvent.

Après avoir essayé différentes manières de résoudre ce problème, l’auteur a abouti à la solution suivante. L'appareil dispose d'une mémoire flash de 128 Ko avec une interface SPI - nous recevons des données par fil (rappelez-vous que l'auteur a déjà un appareil avec un connecteur sur le côté), utilisons cette mémoire comme tampon et envoyons les données par radio canal vers un autre appareil. Bonjour de Cybiko.

Après avoir écrit le code pour fonctionner avec la chaîne radio, ainsi qu'avec la police, le chargeur est devenu plus long que 4 kilo-octets. Par conséquent, la valeur HFUSE a dû être modifiée de 0xDA à 0xD8. Désormais, le chargeur de démarrage peut mesurer jusqu'à 8 kilo-octets et l'adresse de départ est désormais 0x1E000. Ceci est reflété dans le Makefile, mais doit également être pris en compte lors du remplissage chargeur de démarrage via avrdude.

L'émetteur-récepteur 802.15.4 de l'ATmega128RFA1 est initialement conçu pour fonctionner en utilisant le protocole ZigBee, ce qui est assez compliqué, l'auteur a donc décidé de simplement transmettre des paquets. Ceci est implémenté matériellement dans l'ATmega128RFA1, donc peu de code est requis. De plus, par souci de simplicité, l'auteur a décidé d'utiliser un canal fixe, ne vous permettant pas de le sélectionner même manuellement. La norme 802.15.4 prend en charge 16 canaux avec des numéros de 11 à 26. Ils sont assez encombrés, certains chevauchent également les canaux WiFi (le rouge sont les canaux ZigBee, le bleu, le vert et le jaune sont le WiFi).

Nous écrivons un chargeur de démarrage OTA pour ATmega128RFA1 (dans le cadre du périphérique Smart Response XE)

Il s'est avéré que les canaux 15 et 26 sont les moins sensibles aux interférences du Wi-Fi. L'auteur a choisi le second d'entre eux. Avertissement : le traducteur ne sait pas s'il est autorisé à simplifier ZigBee de cette façon. Peut-être devrions-nous faire un peu plus de programmation et la mettre en œuvre complètement ?

Sur le premier appareil, il est nécessaire d'implémenter une machine à états finis qui transmet les données via le protocole STK500. Pour la plupart, les messages transmis et reçus se suffisent à eux-mêmes, mais certains sont liés à ceux qui ont transité auparavant par le canal. La description du dialogue est donnée ici.

Un élément important de ce dialogue est la transmission de paquets destinés à être écrits dans la mémoire flash de l'appareil destinataire. Pour les microcontrôleurs simples de la famille AVR, la taille de page est de 128 octets, mais pour l'ATmega128RFA1 elle est de 256. Et pour la mémoire flash qui est connectée via le protocole SPI, c'est pareil. Le programme du premier appareil, lors du téléchargement d'un croquis, ne le transfère pas immédiatement vers le second, mais l'écrit dans cette mémoire. Lorsque l'IDE Arduino vérifie l'exactitude de l'entrée, ce qui y est écrit lui est envoyé. Nous devons maintenant transmettre les données reçues via un canal radio au deuxième appareil. Dans le même temps, le passage de la réception à la transmission et inversement se produit assez souvent. Le protocole STK500 est indifférent aux retards, mais ne tolère pas la perte de données (étrange, mais il a été dit plus haut que les retards affectent également le transfert de données). Et les pertes lors de la transmission sans fil sont inévitables. L'ATmega128RFA1 dispose d'une implémentation matérielle intégrée de requêtes répétées en cas de doute sur l'exactitude du transfert, mais l'auteur a décidé de l'implémenter lui-même dans le logiciel. Il a développé un protocole dans lequel beaucoup plus de données circulent dans un sens que dans l’autre.

Ce n'est pas parfait, mais ça marche. La page de 256 octets est divisée en quatre segments, dont chacun est transmis par voie hertzienne sous forme de paquet. Un paquet peut contenir jusqu'à 125 octets de données plus un octet pour la longueur et deux octets pour le CRC. Ainsi, des fragments de 64 octets ainsi que des numéros de page et de segment (de 0 à 3) y sont placés. L'appareil de réception dispose d'une variable qui lui permet de suivre le nombre de segments qui ont été reçus, et lorsque les quatre arrivent, l'appareil d'envoi reçoit la confirmation que la page entière a été reçue. Aucune confirmation (le CRC ne correspond pas) - renvoyez la page entière. La vitesse est encore plus élevée que lors de la transmission par câble. Voir:


Mais en général, il serait nécessaire de prévoir un moyen pratique de connecter le câble aux appareils pour télécharger des croquis et via celui-ci. Par exemple, placez à l'intérieur un tel convertisseur d'interface sur le CP2102, comme sur la photo, et collez-le sur la carte afin qu'il puisse résister à la force lors de la connexion et de la déconnexion du câble Micro USB.

Nous écrivons un chargeur de démarrage OTA pour ATmega128RFA1 (dans le cadre du périphérique Smart Response XE)

Il dispose également d'un stabilisateur de 3,3 volts (et comment l'utiliser dans un appareil avec une alimentation de 6 volts - si seulement il a le même stabilisateur, et vous pouvez ajouter deux diodes pour sélectionner automatiquement laquelle d'entre elles alimentera l'appareil) . Les trois LED doivent être dessoudées de la carte convertisseur d'interface, sinon elles chargeront en plus les batteries lors de leur fonctionnement, interféreront également avec l'interrogation du clavier et fonctionneront avec la mémoire flash avec une interface SPI.

Poursuivre un objectif s’est avéré encore plus intéressant que de l’atteindre (et je n’ai pas besoin de cette blague sur le bus). L'auteur a beaucoup appris sur les chargeurs de démarrage AVR, la mémoire flash SPI, le protocole STK500 et la norme 802.15.4.

Tout autre code en plus de la bibliothèque décrite ci-dessus est - ici, et il est également sous GPL v3. Twitter de l'auteur - ici.

Source: habr.com

Ajouter un commentaire