60636

[i] Загрузка К1986ВЕ8Т и К1986ВК01GI по интерфейсу SPI

Дата последнего изменения: 26.11.2025 08:50:03

В МК К1986ВЕ8Т и К1986ВК01GI предусмотрен режим загрузки программы из внешней SPI памяти. В данном режиме МК по интерфейсу SPI загружает программу из внешней памяти во внутреннюю память ОЗУ, после чего осуществляет её запуск. При выборе соответствующего режима запуска МК запускается загрузчик SPI, который выполняет загрузку и выполнение программы по определённым требованиям, заданным в специальном заголовке. В данной статье рассмотрено, как осуществляется загрузка программы из внешней памяти, и как должен быть сформирован образ программы со специальным информационным заголовком.

Описание режима загрузки программы из внешней памяти по SPI

Согласно спецификации на МК, режимы загрузки программы из внешней памяти по SPI обозначаются в К1986ВЕ8Т как SPI2 и SPI3, а в К1986ВК01GI как SPI1+JA и SPI1+JB. Данные режимы используются для работы с микросхемами памяти по интерфейсу SPI фирмы Motorola в режиме SPO = 0, SPH = 0.

Считывание данных из памяти SPI начинается с помощью команды Read Array (код 0x03) по адресу 0x000000. Подробная информация про параметры обмена по SPI описана в спецификации, в разделе «Режимы работы/загрузки микроконтроллера».

Для определения параметров загрузки и запуска программы в начало образа необходимо добавить информационный заголовок. При старте МК загрузчик сначала считывает информационный заголовок, по которому определяет основные параметры загрузки (по какому адресу и какой объём данных загрузить) и выполнения (с какого адреса выполнить старт), а затем уже загружает основную программу. Подробная структура и параметры информационного заголовка представлены на рисунке 1.

Рисунок 1 - Структура информационного заголовка для режима SPI2-3 (К1986ВЕ8Т) и SPI1+JA/JB (К1986ВК01GI). Слева представлен информационный заголовок с OFFS (INF_Offset) = 0x00000000, справа - с OFFS не равным 0x00000000

В информационный заголовок входят следующие параметры:

  • SRAM_ADDR (Target_Address) - 32-х разрядный адрес, по которому будет расположен образ копируемой программы во внутренней памяти ОЗУ. Определяет, начиная с какого адреса загрузить программу.
  • START_ADDR (Entry_Address) - 32-х разрядный адрес, по которому будет передано управление после копирования программы. Обычный старт программы начинается с обработчика ResetHandler, адрес которого указывается в таблице векторов прерываний по адресу 0x04.
  • PROG_LEN (IMG_Length) - 32-х разрядный размер образа программы в словах (32 бит) без учета CRC16, определяющий количество данных, которые необходимо загрузить.
  • CRC_CNT (CRC16_Over_Data_Cover) - 16-ти разрядная длина данных в словах, по которым вычисляется значение crc16 в образе программы. Подробнее данный параметр разобран далее в статье.
  • CRC16 (CRC16_Over_INF) - значение контрольной суммы crc16, которое рассчитывается по следующим параметрам информационного заголовка: OFFS, SRAM_ADDR, START_ADDR, PROG_LEN, CRC_CNT.
  • OFFS (INF_Offset) - 32-разрядный адрес смещения информационного заголовка. Значение OFFS всегда расположено с 0-го адреса памяти. Выбирая OFFS/INF_Offset, при необходимости, можно сдвинуть информационный заголовок и образ программы в любое место внешней памяти.

Рассмотрим подробнее параметры CRC_CNT и CRC16.

CRC (циклически избыточный код) - это алгоритм нахождения контрольной суммы, предназначенный для проверки целостности данных. Число 16 в обозначении СRC указывает на степень порождающего полинома и определяет количество бит, используемых для вычисления CRC. Подробнее про CRC описано в статье " Начальные сведения о вычислении контрольной суммы CRC ", алгоритм вычисления crc16 приведён в спецификации.

Главное назначение crc16 - это верификация данных, по которым было рассчитано crc16. Верификация производится путём сравнения считанного значения crc16 и рассчитанного МК crc16. Если считанное и рассчитанное значения crc16 не совпадают, значит, при чтении произошла ошибка, поэтому МК инициирует программный сброс, чтобы начать процесс чтения заново.

По значению параметра CRC16 проводится проверка ошибок в информационном заголовке. При необходимости, можно добавить проверку по алгоритму CRC не только для информационного заголовка, но и для образа программы. Для этого служит параметр CRC_CNT. Если параметр CRC_CNT задан не равным нулю, то образ программы должен быть разделён на блоки по CRC_CNT слов, при этом для каждого блока рассчитывается отдельное значение crc16, как показано на рисунке 2.

Рисунок 2 - Структура образа программы с разбиением на блоки по CRC_CNT слов

Например, выбрав CRC_CNT = 5, весь образ программы должен быть разделён на блоки по 5 слов, причём для каждого такого блока должно быть рассчитано crc16. Уникальное для каждого блока значение crc16 располагается после данных блока. Необходимо учесть, что если последний блок окажется меньше, чем CRC_CNT, то для данного блока проверка CRC выполняться не будет. Таким образом, для основной программы расчёт CRC либо не выполняется совсем (CRC_CNT = 0), либо выполняется для N блоков по CRC_CNT слов, при этом N*CRC_CNT ≤ PROG_LEN.


Сохранить статью в PDF

Документация

Теги

Была ли статья полезной?