Tabla de Contenidos
Hardware
El BikeLight está basado en un microcontrolador MSP430g2553 de Texas Instruments, que además de ejecutar el código necesario, utiliza parte de su memoria flash como medio de almacenamiento para los mensajes y animaciones. Para la visualización, se utiliza un driver de leds Max7219 que controla una matriz de leds de 8×8. Para la comunicación, un chip ftdi ft323rl hace de puente USB-Serie, empleando un sencillo protocolo de mensajes de dos bytes. Además se incorpora un max1555 como cargador de baterías de litio, y un regulador LDO de 3.3V, además de los pasivos necesarios para todo el sistema.
Los últimos archivos (KiCAD) del hardware, en gitorious: https://gitorious.org/bikelight/bikelight-hardware
Firmware
El código fuente del firmware está disponible en: https://github.com/ladecadence/BikeLight-Firmware
Memoria
La memoria principal de msp430g2553 es una memoria flash dividida en segmentos de 512 bytes. Estos segmentos deben de ser borrados antes de ser escritos. En principio se usarán casi todos los 8kB superiores (menos los últimos 512 bytes) de los 16kB de microcontrolador para almacenar datos. Los 8kB superiores empiezan en 0x0E000.
El orden de los datos en la flash es:
- 0x0E000 : flash magic number. Si la flash ha sido programada con datos válidos, valdrá 0xA5.
- 0x0E001 : Número de strings programadas.
- 0x0E002 : Número de animaciones programadas.
- 0x0E003 : Datos
Los datos se organizan de la siguiente manera
- Strings. Cada string tiene un máximo de 250 caracteres, el primer byte indica su longitud, el segundo el delay, el tercero es un espacio, luego los 250 bytes del string, otro espacio y el null. Máximo 255 bytes por string.
- Animaciones. Cada animación empieza por un byte con el número de frames que lleva, otro byte con el delay en milisegundos entre frames, otro byte con el numero de repeticiones, y los datos de cada frame.
Flash magic number. Indica el fin de la memoria programada. Útil para comprobar que los datos son correctos.
Animaciones
Cada frame ocupa 10 bytes. Los dos primeros bytes son el ancho y el alto del frame en pixels (nomalmente 8×8) y luego 8 bytes por frame, cada byte representando una columna de la matriz.
Comunicación
El protocolo de comunicaciones es sencillo. Se utilizan paquetes de dos bytes, siendo el primer byte el tipo de paquete y el segundo byte el dato.
Los tipos de paquetes son los siguientes:
- PKT_COMMAND : 0x11 : Envia un comando al BL, el segundo byte indica el comando a realizar.
- PKT_DATA : 0x22 : Envia o recibe datos del BL. El segundo byte contiene el dato.
- PKT_STAT : 0x33 : Envia o recibe estados. El segundo byte define el estado que normalmente será de STAT_OK (0x14) o de STAT_ERR (0xEE)
- PKT_INFO : 0x44 :
Los comandos especificados por el paquete comando son:
- CMD_ID: 0x11 : Pide la identificación al BL. Devuelve tres paquetes de datos conteniendo el ID y la versión (menor y mayor) del firmware.
- CMD_PRG_FLASH : 0x22 : Pide flashear nuevos datos en la memoria del BL. En este momento se inicia una secuencia de flasheo detallada más adelante.
- CMD_ERASE_FLASH: 0x33: Pide borrar la memoria del BL. Útil para pruebas.
- CMD_END: 0xFF: Pide terminar el procedimiento en curso.
Flasheo
El procedimiento de enviar nuevos datos al BikeLight, se inicia enviándole un comando de flasheo, y a partir de aqui, y teniendo en cuenta sus respuestas, se deben de enviar los datos a flashear en bloques de 128 bytes, enviando un comando de CMD_END para terminar. El algoritmo es el siguiente:
1: enviar comando CMD_PRG_FLASH 2: esperamos respuesta (el BL está borrando la memoria) 3: la respuesta es estado STAT_OK? 4: si: 5: enviamos un bloque de 128 bytes (directamente, sin protocolo) 6: esperamos respuesta 7: la respuesta es un PKT_DATA conteniendo la suma acumulada de (byte n enviado+1)? 8: si: 9: hay que enviar más datos? 10: si: 11: enviamos comando CMD_PRG_FLASH 12: seguimos en 5: 13: no: 14: enviamos comando CMD_PRG_END y salimos correctamente 15: no: 16: error en el checksum 17: enviamos comando CMD_PRG_END y salimos con error 18: no: 19: error en el borrado 20: enviamos comando CMD_PRG_END y salimos con error