Преобразовать шестнадцатеричный код Intel в команды SPI для Arduino ICSP AVR
Я пытаюсь использовать Arduino в качестве ICSP AVR для прошивки сотен микроконтроллеров ATMEGA 90USB162. У меня возникли некоторые трудности при прошивке микросхемы. Я правильно подключил все провода и могу прочитать сигнатуру. Мой источник — шестнадцатеричный файл Intel, и я читаю его корректно, поскольку вижу каждый байт по мере чтения из памяти Arduino. Я запутался в том, что в документации указано, что сначала нужно установить младший байт, а затем старший для того же адреса памяти. Используя следующий пример (подчёркивания для разделения данных), может ли кто-нибудь помочь мне определить, как будут выглядеть байты моей транзакции SPI?
:_20_0000_00_16C100003CC100003AC1000038C1000036C1000034C1000032C1000030C10000_48
Я знаю, что двоеточие — это начальный код, 20 — шестнадцатеричное значение количества байтов данных, 0000 — адрес, 00 — тип записи, следующие 32 байта — это мои данные, за которыми следует контрольная сумма.
Я думал, что буду циклически проходить по части данных и увеличивать адрес через каждый байт
uint16_t addr = 0;
while (recordtype != endOfFile)
{
auto data[] = parseData();
for(uint8_t index = 0; index < 32;)
{
SPITask.Send(0x40, 0x00, addr, data[index++]);//отправить младший байт
SPITask.Send(0x48, 0x00, addr, data[index++]);//отправить старший байт
SPITask.Send(0x4C, addr, addr, 0x00);// зафиксировать новые байты по адресу
addr++;
}
}
Я не думаю, что это правильно, и в некоторых примерах, которые я примерно понимаю, говорится, что они преобразуют байт адреса в слово, что имеет смысл, судя по структуре команд в техническом описании (стр. 260) 90USB162. Может ли кто-нибудь подсказать, как разбить эти данные на старшие и младшие байты?
@xtreampb, 👍0
1 ответ
У меня есть код, который делает именно то, что вам нужно на GitHub.
Среди прочих процессоров он поддерживает чип At90USB162. Код считывает данные с SD-карты в шестнадцатеричном формате Intel и записывает их на чип при нажатии кнопки. Именно это вы и пытаетесь сделать.
Модератор форума Arduino «Crossroads» (который недавно также присоединился к Stack Exchange) создал плату для программирования, вмещающую SD-карту и оснащенную светодиодами состояния:

Вот мой код для записи во флэш-память:
// выполнить одну инструкцию программирования ... b1 — команда, b2, b3, b4 — аргументы
// процессор может вернуть результат на 4-й передаче, это возвращается.
byte program (const byte b1, const byte b2 = 0, const byte b3 = 0, const byte b4 = 0)
{
noInterrupts ();
BB_SPITransfer (b1);
BB_SPITransfer (b2);
BB_SPITransfer (b3);
byte b = BB_SPITransfer (b4);
interrupts ();
return b;
} // конец программы
// записываем байт в буфер флэш-памяти (готов к фиксации)
void writeFlash (unsigned long addr, const byte data)
{
byte high = (addr & 1) ? 0x08 : 0; // установить, если нужен старший байт
addr >>= 1; // превратить в адрес слова
program (loadProgramMemory | high, 0, lowByte (addr), data);
} // конец writeFlash
Ваш цикл выглядит немного странно, размер страницы (до того, как вам нужно будет сделать фиксацию) составляет 128 байт (64 байта), а не 2 байта.
См. техническое описание:

- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
- В чем разница/связь между Arduino и AVR?
- Прорыв FTDI с дополнительным соединителем ISP
- Как преобразовать скетч примера Arduino в полный проект C++?
- реализация sbi() и cli()
- Для чего нужен второй заголовок ICSP в Arduino Uno R3?
- Не удается записать загрузчик через Arduino Nano clone ISP в atmega328p
- Внезапно "avrdude: Device signature = 0x000000" с ArduinoISP. Мой чип умер?
Можно ли где-нибудь купить эти доски?, @xtreampb
http://www.crossroadsfencing.com/BobuinoRev17/Programmer.html, @Gerben
Да, доски есть в наличии, как указано. Я принимаю оплату через PayPal и могу отправить вам одну завтра. Напишите мне на robert@crossroadsfencing.com., @CrossRoads
(xtreampb сказал в комментарии под теперь удаленным ответом): *Я не вижу, где он также будет прошивать EEPROM целевой платы, что я также хочу видеть в своем конечном продукте* - однако об этом нигде не упоминается в вопросе., @Nick Gammon