¿Qué sucede cuando el código se carga usando el gestor de arranque?

13

Cuando subo un nuevo boceto a mi Arduino Uno con el gestor de arranque Optiboot, ¿qué sucede realmente ?

  • ¿Qué se envía al Arduino?
  • ¿Cómo responde?
  • ¿Qué significa "no sincronizado"?
  • ¿Qué es "sincronizado" de todos modos?

Nota: Esto pretende ser una "pregunta de referencia" .

Nick Gammon
fuente
post muy interesante! Solo una pregunta más. ¿Qué software está utilizando para rastrear la comunicación en serie (imágenes)?
julio
Es la salida de un analizador lógico, como Saleae Logic 8. saleae.com Muy pequeño analizador. Solía ​​ser una frecuencia de muestreo de 24 MHz por ~ $ 125, 150. Las velocidades de captura actuales son de 100 y 500 MHz. > SPI, I2C y más> La mayoría de las comunicaciones digitales utilizan un protocolo particular que especifica cómo se transfiere la información. El software Logic tiene analizadores de protocolos que pueden decodificar automáticamente SPI, I2C, serial, 1-Wire, CAN, UNI / O, I2S / PCM, Modo MP, Manchester, Modbus, DMX-512, Paralelo, JTAG, LIN, Atmel SWI, MDIO, SWD, LCD HD44780, BiSS C, HDLC, HDMI CEC, PS / 2, USB 1.1, Midi - o cree el suyo propio
CrossRoads

Respuestas:

21

Cuando reinicia un Uno que ejecuta el cargador Optiboot, el gestor de arranque primero parpadea el pin 13 tres veces.

Pin 13 siendo flasheado

La línea superior (gris) se envía al Arduino, la línea media (naranja) se envía desde el Arduino.

Mientras eso sucede, el programa que se avrdudeejecuta en su computadora envía una consulta al dispositivo:

STK_GET_SYNC / CRC_EOP  (0x30/0x20)

El Arduino no nota el primer "get sync" porque está ocupado parpadeando el pin 13. Una vez hecho esto, se da cuenta del "get sync" (sería protegido por el hardware en serie) y responde:

STK_INSYNC / STK_OK (0x14/0x10)

Parece que avrdude se impacientó un poco y se agotó el tiempo de espera, porque vuelve a intentarlo con la consulta "get sync". Esta vez Optiboot responde de inmediato.


El resto de la carga se describe en la siguiente imagen. Ejemplo producido cargando el programa "Blink" de stock.

Proceso de carga de Optiboot

(Haga clic en la imagen de arriba para una versión más grande)


Los pasos son:

  • Consulta: ¿Obtener sincronización? Respuesta: en sincronización.
  • Consulta: ¿Obtener parámetro? (versión principal) Respuesta: versión 4.
  • Consulta: ¿Obtener parámetro? (versión menor) Respuesta: versión 4.
  • Establecer parámetros del dispositivo. Los siguientes parámetros del dispositivo se envían al chip:

    0x42  // STK_SET_DEVICE
    0x86  // device code
    0x00  // revision
    0x00  // progtype: “0” – Both Parallel/High-voltage and Serial mode
    0x01  // parmode: “1” – Full parallel interface
    0x01  // polling: “1” – Polling may be used
    0x01  // selftimed: “1” – Self timed
    0x01  // lockbytes: Number of Lock bytes.
    0x03  // fusebytes: Number of Fuse bytes
    0xFF  // flashpollval1
    0xFF  // flashpollval2
    0xFF  // eeprompollval1
    0xFF  // eeprompollval2
    0x00  // pagesizehigh
    0x80  // pagesizelow
    0x04  // eepromsizehigh
    0x00  // eepromsizelow
    0x00  // flashsize4
    0x00  // flashsize3
    0x80  // flashsize2
    0x00  // flashsize1
    0x20  // Sync_CRC_EOP
    

    Optiboot ignora todo eso y responde con In Sync / OK. :)

  • Establecer parámetros extendidos del dispositivo:

    0x45  // STK_SET_DEVICE_EXT
    0x05  // commandsize: how many bytes follow
    0x04  // eeprompagesize: EEPROM page size in bytes.
    0xD7  // signalpagel: 
    0xC2  // signalbs2: 
    0x00  // ResetDisable: Defines whether a part has RSTDSBL Fuse 
    0x20  // Sync_CRC_EOP
    

    Optiboot también los ignora y responde con In Sync / OK.

  • Ingrese al modo de programa. Respuesta: en sincronización / OK.

  • Leer firma. Optiboot responde 0x1E 0x95 0x0F sin leer realmente la firma .

  • Escribir fusibles (cuatro veces). Optiboot no escribe el fusible, solo responde In Sync / OK.

  • Dirección de carga (inicialmente 0x0000). La dirección está en palabras (es decir, una palabra tiene dos bytes). Esto establece la dirección donde se escribirá la siguiente página de datos.

  • Página del programa (se envían hasta 128 bytes). Optiboot responde "In Sync" de inmediato. Luego hay una pausa de aproximadamente 4 ms mientras se programa la página. Luego responde "OK".

  • Dirección de carga (ahora 0x0040). Esta es la dirección 64 en decimal, es decir. 128 bytes desde el inicio de la memoria del programa.

  • Se escribe otra página. Esta secuencia continúa hasta que se escriben todas las páginas.

  • Dirección de carga (de nuevo a 0x0000). Esto es para verificar la escritura.

  • Página de lectura (se leen hasta 128 bytes). Esto es para verificar. Tenga en cuenta que incluso si la verificación falla, los datos incorrectos ya se han escrito en el chip.

  • Salga del modo de programación.


¿Qué significa "no sincronizado"?

Como puede ver en lo anterior, en cada paso de la secuencia de programación se espera que el Arduino responda con "In Sync" (0x14), posiblemente seguido de algunos datos, seguido de "OK" (0x10).

Si está "no sincronizado", eso significa que avrdude no obtuvo la respuesta "sincronizado". Las posibles razones podrían ser:

  • Se usó una velocidad de transmisión incorrecta
  • Puerto serie incorrecto seleccionado en IDE
  • Tipo de placa incorrecto seleccionado en IDE
  • No hay cargador de arranque instalado
  • Cargador de arranque incorrecto instalado
  • Placa no configurada para usar el gestor de arranque (en los fusibles)
  • Algún dispositivo conectado a los pines D0 y D1 en el Arduino, lo que interfiere con las comunicaciones en serie
  • El chip de interfaz USB (ATmega16U2) no funciona correctamente
  • Reloj equivocado para el tablero
  • Ajustes de fusibles incorrectos en el Atmega328P (por ejemplo, "dividir el reloj por 8")
  • Tablero / chip dañado
  • Cable USB defectuoso (algunos cables USB solo suministran energía y no son para datos, por ejemplo, cables baratos para ventiladores USB)

¿Qué es "sincronizado"?

Como se mencionó anteriormente, la respuesta "En sincronización" significa que el Arduino (gestor de arranque) está sincronizado con el programa de carga.


¿Qué protocolo se está utilizando?

El protocolo es el protocolo STK500 según lo documentado por Atmel. Ver las referencias a continuación.


Referencias

Nota : La versión 2 de STK500 no se usa en Optiboot, pero se incluye para información en caso de que esté usando placas como Mega2560.


Constantes STK500

/* STK500 constants list, from AVRDUDE */
#define STK_OK              0x10
#define STK_FAILED          0x11  // Not used
#define STK_UNKNOWN         0x12  // Not used
#define STK_NODEVICE        0x13  // Not used
#define STK_INSYNC          0x14  // ' '
#define STK_NOSYNC          0x15  // Not used
#define ADC_CHANNEL_ERROR   0x16  // Not used
#define ADC_MEASURE_OK      0x17  // Not used
#define PWM_CHANNEL_ERROR   0x18  // Not used
#define PWM_ADJUST_OK       0x19  // Not used
#define CRC_EOP             0x20  // 'SPACE'
#define STK_GET_SYNC        0x30  // '0'
#define STK_GET_SIGN_ON     0x31  // '1'
#define STK_SET_PARAMETER   0x40  // '@'
#define STK_GET_PARAMETER   0x41  // 'A'
#define STK_SET_DEVICE      0x42  // 'B'
#define STK_SET_DEVICE_EXT  0x45  // 'E'
#define STK_ENTER_PROGMODE  0x50  // 'P'
#define STK_LEAVE_PROGMODE  0x51  // 'Q'
#define STK_CHIP_ERASE      0x52  // 'R'
#define STK_CHECK_AUTOINC   0x53  // 'S'
#define STK_LOAD_ADDRESS    0x55  // 'U'
#define STK_UNIVERSAL       0x56  // 'V'
#define STK_PROG_FLASH      0x60  // '`'
#define STK_PROG_DATA       0x61  // 'a'
#define STK_PROG_FUSE       0x62  // 'b'
#define STK_PROG_LOCK       0x63  // 'c'
#define STK_PROG_PAGE       0x64  // 'd'
#define STK_PROG_FUSE_EXT   0x65  // 'e'
#define STK_READ_FLASH      0x70  // 'p'
#define STK_READ_DATA       0x71  // 'q'
#define STK_READ_FUSE       0x72  // 'r'
#define STK_READ_LOCK       0x73  // 's'
#define STK_READ_PAGE       0x74  // 't'
#define STK_READ_SIGN       0x75  // 'u'
#define STK_READ_OSCCAL     0x76  // 'v'
#define STK_READ_FUSE_EXT   0x77  // 'w'
#define STK_READ_OSCCAL_EXT 0x78  // 'x'
Nick Gammon
fuente
1
¡Buen punto! Agregué algunas referencias a la respuesta. Gracias.
Nick Gammon
Tenga en cuenta que el proceso de verificación descrito aquí utiliza específicamente una lectura de página, lo que significa que cualquier cargador de avrdudearranque que admita el comportamiento de verificación predeterminado es un cargador de arranque que admite la lectura de los contenidos flash.
Chris Stratton
1
Esta extensa y descriptiva instrucción del programa y el análisis de Optiboot / STK500 es increíblemente increíble. ¡Gracias, el gran Nick Gammon!
David Refoua