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


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.