Estamos escribiendo un gestor de arranque OTA para ATmega128RFA1 (como parte del dispositivo Smart Response XE)

Estamos escribiendo un gestor de arranque OTA para ATmega128RFA1 (como parte del dispositivo Smart Response XE)

Todo comenzó cuando el autor compró un dispositivo interesante en el mercado secundario: Smart Response XE (Breve descripción). Está destinado a las escuelas: cada alumno de la clase recibe un dispositivo similar a un cuaderno electrónico o un traductor de los años noventa, el profesor hace una pregunta y los alumnos escriben las respuestas en los teclados de los dispositivos, que se reciben a través de un canal de radio (802.15.4) a un receptor conectado a la PC del profesor.

Estos dispositivos fueron descontinuados hace varios años, y lo que las escuelas compraron por $100-$200 cada uno ahora aparece en eBay por $10 o menos. El hardware que hay allí es muy adecuado para experimentos geek:

  • teclado de 60 teclas
  • pantalla con una resolución de 384×136, 2 bits por píxel, similar a BC, CGA, pero 4 no colores, sino gradaciones de brillo
  • microcontrolador ATmega128RFA1 (memoria flash de 128 kB, ROM de 4 kB, RAM de 16 kB, transceptor 802.15.4)
  • Memoria flash externa (en relación con el microcontrolador, no con todo el dispositivo) de 1 megabit (128 kilobytes) con interfaz SPI
  • Compartimento para 4 elementos AAA.

Por el nombre del microcontrolador se desprende claramente que pertenece a la familia AVR, lo que significa que hacer que el dispositivo sea compatible con Arduino es una tarea más que trivial...

De las noticias en adelante Hackaday el autor descubrió lo que es ya he hecho (el mismo enlace te dice qué conectar y dónde), teniendo la oportunidad de ejecutar juegos para Arduboy:


Pero al autor le interesa más la posibilidad no de jugar en el dispositivo, sino de estudiar:

  • memoria flash con interfaz serial SPI
  • cargadores de arranque para AVR
  • estándar 802.15.4

El autor comenzó escribiendo Biblioteca (GPL v3), que le permite inicializar la pantalla, generar texto y rectángulos y acceder a la memoria flash SPI. Luego empezó a proponer ideas para el uso práctico del dispositivo: un terminal de bolsillo compatible con el VT-100, juegos multijugador. Después de reconstruir tres dispositivos, decidió "enseñarles" a recibir bocetos "por aire". Lo que no sólo sería interesante, sino también muy conveniente: la carcasa del dispositivo siempre es difícil de abrir y debajo de la tapa del compartimiento de la batería solo hay orificios que permiten conectar un programador JTAG a la placa.

Estamos escribiendo un gestor de arranque OTA para ATmega128RFA1 (como parte del dispositivo Smart Response XE)

Esto es suficiente para cargar el gestor de arranque Arduino, pero no el boceto: el puerto serie no está conectado allí, por lo que aún no puede prescindir de abrir la carcasa. Además, las líneas TX0 y RX0 del primer puerto serie se combinan con las líneas de sondeo de la matriz del teclado, es decir, aquellas que sondean las teclas de función en los lados de la pantalla. Pero, ¿qué puedes hacer? El autor creó esto:

Estamos escribiendo un gestor de arranque OTA para ATmega128RFA1 (como parte del dispositivo Smart Response XE)

Llevó las líneas JTAG allí y ahora no es necesario abrir el compartimento de la batería. Y para poder subir bocetos conecté ambos puertos serie al mismo conector, agregando también un interruptor, porque con las baterías instaladas es físicamente imposible apagar el dispositivo de otra forma.

Me llevó bastante tiempo trabajar con un soldador, una navaja y una pistola de pegamento. En general, cargar bocetos "por aire" es mucho más conveniente, necesitamos urgentemente inventar algo para esto.

Arduino IDE utiliza el programa para cargar bocetos avrdude. Interactúa con el microcontrolador mediante el protocolo. STK500, que le permite transferir archivos en ambas direcciones. Es poco compatible con canales donde son posibles retrasos variables, distorsión y pérdida de datos. Si algo se suelta o cruje en el canal serie, puedes volverte loco buscando la causa. Una vez, el autor sufrió durante medio día hasta que se dio cuenta de que el problema era un cable defectuoso, así como un convertidor de interfaz CP2102 caprichoso. Incluso un microcontrolador con un convertidor de interfaz incorporado, por ejemplo el ATmega32u4, a veces puede actuar así. Todos los usuarios de Arduino han notado que los errores al cargar bocetos no son tan raros. A veces la grabación va bien, pero durante una lectura de prueba se detecta un error. Esto no significa que hubo un error durante la escritura: hubo un error durante la lectura. Ahora imagine que cuando trabaje “por aire” sucederá lo mismo, pero con mucha más frecuencia.

Después de probar diferentes formas de superar este problema, al autor se le ocurrió lo siguiente. El dispositivo tiene una memoria flash de 128 KB con una interfaz SPI: recibimos datos a través de cables (recuerde que el autor ya tiene un dispositivo con un conector en el lateral), usamos esta memoria como buffer y enviamos los datos por radio. canal a otro dispositivo. Hola desde Cybiko.

Después de escribir el código para trabajar con el canal de radio, así como la fuente, el cargador alcanzó una longitud de más de 4 kilobytes. Por lo tanto, el valor HFUSE tuvo que cambiarse de 0xDA a 0xD8. Ahora el gestor de arranque puede tener hasta 8 kilobytes de longitud y la dirección inicial ahora es 0x1E000. Esto se refleja en el Makefile, pero también se debe tener en cuenta al completar cargador de arranque vía avrdude.

El transceptor 802.15.4 del ATmega128RFA1 está diseñado originalmente para funcionar utilizando el protocolo ZigBee, lo cual es bastante complicado, por lo que el autor decidió simplemente transmitir paquetes. Esto se implementa en hardware en el ATmega128RFA1, por lo que se requiere poco código. Además, por simplicidad, el autor decidió utilizar un canal fijo, no permitiendo seleccionarlo ni siquiera manualmente. El estándar 802.15.4 admite 16 canales con números del 11 al 26. Están bastante llenos, algunos también se superponen con canales WiFi (el rojo son canales ZigBee, el azul, el verde y el amarillo son WiFi).

Estamos escribiendo un gestor de arranque OTA para ATmega128RFA1 (como parte del dispositivo Smart Response XE)

Resultó que los canales menos susceptibles a las interferencias WiFi son 15 y 26. El autor eligió el segundo de ellos. Descargo de responsabilidad: el traductor no sabe si está permitido simplificar ZigBee de esta manera. ¿Quizás deberíamos programar un poco más e implementarlo por completo?

En el primer dispositivo, es necesario implementar una máquina de estados finitos que transmita datos mediante el protocolo STK500. En su mayor parte, los mensajes transmitidos y recibidos son autosuficientes, pero algunos están ligados a los que pasaron anteriormente por el canal. Se da la descripción del diálogo. aquí.

Un componente importante de este diálogo es la transmisión de paquetes destinados a escribirse en la memoria flash del dispositivo de destino. Para los microcontroladores simples de la familia AVR, el tamaño de página es de 128 bytes, pero para el ATmega128RFA1 es de 256. Y para la memoria flash que se conecta mediante el protocolo SPI, ocurre lo mismo. El programa en el primer dispositivo, al cargar un boceto, no lo transfiere inmediatamente al segundo, sino que lo escribe en esta memoria. Cuando el IDE de Arduino comprueba la exactitud de la entrada, envía lo que estaba escrito allí. Ahora necesitamos transmitir los datos recibidos por canal de radio al segundo dispositivo. Al mismo tiempo, el cambio de recepción a transmisión y viceversa ocurre con bastante frecuencia. El protocolo STK500 es indiferente a los retrasos, pero no tolera la pérdida de datos (es extraño, pero se dijo anteriormente que los retrasos también afectan la transferencia de datos). Y las pérdidas durante la transmisión inalámbrica son inevitables. El ATmega128RFA1 tiene una implementación de hardware incorporada para solicitudes repetidas cuando hay dudas sobre la exactitud de la transferencia, pero el autor decidió implementar lo mismo en el software. Desarrolló un protocolo en el que fluyen muchos más datos en un sentido que en el otro.

No es perfecto, pero funciona. La página de 256 bytes se divide en cuatro segmentos, cada uno de los cuales se transmite por aire como un paquete. Un paquete puede contener hasta 125 bytes de datos más un byte de longitud y dos bytes de CRC. Por lo tanto, allí se colocan fragmentos de 64 bytes de longitud junto con los números de página y de segmento (de 0 a 3). El dispositivo receptor tiene una variable que le permite rastrear cuántos segmentos se han recibido y, cuando llegan los cuatro, el dispositivo emisor recibe la confirmación de que se ha recibido la página completa. Sin confirmación (CRC no coincidió): reenvíe la página completa. La velocidad es incluso mayor que cuando se transmite por cable. Ver:


Pero, en general, sería necesario prever una forma cómoda de conectar el cable a los dispositivos para cargar bocetos y a través de él. Por ejemplo, coloque un convertidor de interfaz en el CP2102 dentro, como en la foto, y péguelo a la placa para que pueda soportar la fuerza al conectar y desconectar el cable Micro USB.

Estamos escribiendo un gestor de arranque OTA para ATmega128RFA1 (como parte del dispositivo Smart Response XE)

También tiene un estabilizador de 3,3 voltios (y cómo usarlo en un dispositivo con una fuente de alimentación de 6 voltios; si solo tiene el mismo estabilizador y puede agregar dos diodos para seleccionar automáticamente cuál de ellos alimentará el dispositivo) . Los tres LED deben desoldarse de la placa convertidora de interfaz; de lo contrario, cargarán aún más las baterías cuando funcionen con ellos y también interferirán con el sondeo del teclado y el funcionamiento con la memoria flash con una interfaz SPI.

Perseguir una meta resultó ser aún más interesante que lograrla (y no hace falta ese chiste sobre el autobús). El autor aprendió mucho sobre los cargadores de arranque AVR, la memoria flash SPI, el protocolo STK500 y el estándar 802.15.4.

Todo el resto del código además de la biblioteca descrita anteriormente es: aquí, y también está bajo GPL v3. Twitter del autor - aquí.

Fuente: habr.com

Añadir un comentario