Що відбувається при завантаженні коду за допомогою завантажувача?


13

Коли я завантажую новий ескіз до свого Arduino Uno за допомогою завантажувача Optiboot, що насправді відбувається?

  • Що надсилається Ардуїно?
  • Як він реагує?
  • Що означає "не синхронізовано"?
  • Що все-таки "синхронізується"?

Примітка. Це розроблено як "довідкове запитання" .


дуже цікавий пост! Просто більше питання. Яке програмне забезпечення ви використовуєте для відстеження послідовного зв'язку (зображень)?
— Джуліо

Це вихід логічного аналізатора, наприклад Saleae Logic 8. saleae.com Дуже приємний маленький аналізатор. Раніше частота дискретизації 24 МГц становила ~ 125, 150 дол. США. Швидкісні поточні швидкості зйомки становлять 100 та 500 МГц. > SPI, I2C та більше> Більшість цифрових комунікацій використовує певний протокол, який визначає спосіб передачі інформації. Програмне забезпечення Logic має аналізатори протоколів, які можуть автоматично розшифровувати SPI, I2C, послідовний, 1-провідний, CAN, UNI / O, I2S / PCM, режим MP, Manchester, Modbus, DMX-512, Parallel, JTAG, LIN, Atmel SWI, MDIO, SWD, LCD HD44780, BiSS C, HDLC, HDMI CEC, PS / 2, USB 1.1, Midi - або створіть свій власний
— CrossRoads

Відповіді:


21

Коли ви скидаєте Uno під керуванням навантажувача Optiboot, завантажувач спочатку тричі спалахує контакт 13.

Пина 13 миготіла

Верхня лінія (сіра) надсилається до Arduino, середня (помаранчева) - від Arduino.

Поки це відбувається, програма, що avrdudeпрацює на вашому комп’ютері, надсилає запит на пристрій:

STK_GET_SYNC / CRC_EOP  (0x30/0x20)

Arduino не помічає перше "отримати синхронізацію", оскільки він зайнятий блимає штифтом 13. Після цього він помічає "отримати синхронізацію" (це буде завантажено серійним обладнанням) і відповідає:

STK_INSYNC / STK_OK (0x14/0x10)

Схоже, avrdude трохи нетерплячий і вичерпаний, тому що він намагається знову з запитом "отримати синхронізацію". Цього разу Optiboot реагує негайно.


Решта завантаження описана на наступному зображенні. Приклад виробляється завантаженням програми "Blink".

Процес завантаження Optiboot

(Клацніть на зображення вище для більшої версії)


Етапи:

  • Запит: Отримати синхронізацію? Відповідь: синхронізовано.
  • Запит: Отримати параметр? (основна версія) Відповідь: версія 4.
  • Запит: Отримати параметр? (другорядна версія) Відповідь: версія 4.
  • Встановлення параметрів пристрою. На мікросхему надсилаються такі параметри пристрою:

    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 ігнорує всі ці відповіді та відповідає на In Sync / OK. :)

  • Встановити розширені параметри пристрою:

    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 також ігнорує всі ці відповіді та відповідає на In Sync / OK.

  • Увійдіть у режим програми. Відповідь: Синхронізувати / ОК.

  • Прочитайте підпис. Optiboot відповідає, 0x1E 0x95 0x0F не фактично читаючи підпис .

  • Напишіть запобіжники (чотири рази). Optiboot не записує запобіжник, а лише відповідає у синхронізації / ОК.

  • Завантажте адресу (спочатку 0x0000). Адреса в словах (тобто слово - два байти). Тут встановлюється адреса, де буде записана наступна сторінка даних.

  • Сторінка програми (надсилається до 128 байт). Optiboot негайно відповідає "In Sync". Потім настає пауза близько 4 мс, поки вона фактично програмує сторінку. Потім він відповідає "ОК".

  • Завантажте адресу (зараз 0x0040). Це адреса 64 у десятковій частині, тобто. 128 байт від початку програмної пам'яті.

  • Ще одна сторінка написана. Ця послідовність триває, поки всі сторінки не будуть записані.

  • Завантажте адресу (назад до 0x0000). Це для перевірки написання.

  • Сторінка читання (читається до 128 байт). Це для перевірки. Зауважте, що навіть якщо перевірка не вдається, погані дані вже записані в чіп.

  • Вийти з режиму програмування.


Що означає "не синхронізовано"?

Як видно з вищесказаного, на кожному кроці через послідовність програмування Arduino, як очікується, відповість "In Sync" (0x14), можливо, за цим послідують деякі дані, а потім "OK" (0x10).

Якщо він не синхронізований, це означає, що avrdude не отримав відповіді "синхронізуватися". Можливими причинами можуть бути:

  • Використовується неправильна швидкість передачі
  • У IDE вибрано неправильний послідовний порт
  • У IDE вибрано неправильний тип дошки
  • Не встановлено завантажувач
  • Встановлений неправильний завантажувач
  • Плата не налаштована для використання завантажувача (у запобіжниках)
  • Деякий пристрій підключався до штифтів D0 і D1 на Arduino, заважаючи послідовним комунікаціям
  • Чип інтерфейсу USB (ATmega16U2) не працює належним чином
  • Неправильний годинник для дошки
  • Неправильні параметри запобіжника на Atmega328P (наприклад, "розділити годинник на 8")
  • Дошка / мікросхема пошкоджені
  • Несправний кабель USB (деякі USB-кабелі забезпечують лише живлення та не передаються для даних, наприклад, дешеві кабелі для USB-вентиляторів)

Що таке "синхронно"?

Як було сказано вище, відповідь "Синхронізується" означає, що Arduino (завантажувач) синхронізується з програмою завантаження.


Який протокол використовується?

Протокол - це протокол STK500, як документально підтверджено Atmel. Дивіться посилання нижче.


Список літератури

Примітка : STK500 Версія 2 не використовується в Optiboot, але вона включена для отримання інформації, якщо ви використовуєте плати типу Mega2560.


Константи 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'


1
Гарна думка! До відповіді я додав кілька посилань. Дякую.
— Нік Гаммон

Зауважте, що описаний тут процес верифікації спеціально використовує зчитування сторінки, а це означає, що будь-який завантажувач, що підтримує avrdudeповедінку перевірки за замовчуванням, є завантажувачем, який підтримує зчитування вмісту флеш.
— Кріс Страттон

1
Ця обширна та описова програмна інструкція та аналіз Optiboot / STK500 надзвичайно приголомшливі. Дякую, чудовий Нік Гаммон!
— Девід Рефуа
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.