Преобразовать шестнадцатеричный код 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. Может ли кто-нибудь подсказать, как разбить эти данные на старшие и младшие байты?

, 👍0


1 ответ


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 байта.

См. техническое описание:

Размер страницы Flash

,

Можно ли где-нибудь купить эти доски?, @xtreampb

http://www.crossroadsfencing.com/BobuinoRev17/Programmer.html, @Gerben

Да, доски есть в наличии, как указано. Я принимаю оплату через PayPal и могу отправить вам одну завтра. Напишите мне на robert@crossroadsfencing.com., @CrossRoads

(xtreampb сказал в комментарии под теперь удаленным ответом): *Я не вижу, где он также будет прошивать EEPROM целевой платы, что я также хочу видеть в своем конечном продукте* - однако об этом нигде не упоминается в вопросе., @Nick Gammon