В этой статье мы продолжим знакомство с программированием зоны конфигурации микросхемы ATSHA204A, начатое в двух предыдущих статьях. Переоценить значение этой информации невозможно — без хорошего её понимания работа с микросхемой ATSHA204A просто невозможна.
Таблица зоны конфигурации
Для удобства мы приводим таблицу зоны конфигурации микросхемы ATSHA204A из даташита. Если вы внимательно читали предыдущие статьи этого руководства, то уже знакомы с ней.
В предыдущих статьях мы разобрали работу и чтение из зоны конфигурации ATSHA204A множества различных параметров, эту статью мы начнём с разбора и чтения байтов Use Flag.
Чтение Use Flag (0 – 7)
Байты Use Flag определяют количество раз, когда «одноразовые» слоты 0 – 7 могут используется перед отключением. Создадим скетч для чтения этих байтов:
/* ATSHA204 Read Config Use Flag */ #include <sha204_library.h> #define ATSHA204_PIN A3 byte useFlag = 0; byte slots[8] = {13, 13, 14, 14, 15, 15, 16, 16}; byte shifts[8] = {0, 1, 0, 1, 0, 1, 0, 1}; #define SLOT_NUM 0 byte slot = slots[SLOT_NUM]; byte shift = shifts[SLOT_NUM]; atsha204Class sha204(ATSHA204_PIN); void setup() { Serial.begin(115200); Serial.println("ATSHA204 Read Config Use Flag start..."); for (byte i = 0; i < 8; i++) { slot = slots[i]; shift = shifts[i]; Serial.print(F("Use Flag")); Serial.print(i); Serial.print(F(": 0x")); readConf(); Serial.println(useFlag, HEX); } } byte addr(byte slot) { return slot * 4; } void readConf() { byte bufTx[SHA204_CMD_SIZE_MAX]; byte bufRx[SHA204_RSP_SIZE_MAX]; byte retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot)); useFlag = bufRx[SHA204_BUFFER_POS_DATA + 0 + shift*2]; } void loop() { }
И разберём его работу. Примечание: разбор типичных особенностей устройства скетчей чтения данных из конфигурационной зоны микросхемы ATSHA204A был дан в предыдущих статьях — если вы с ними ещё не знакомы, то рекомендуем ознакомиться с этими статьями. А тут мы подробно остановимся только на особенностях текущего скетча чтения байтов Use Flag.
Итак, объявляем байтовые массивы, определяющие нужное положение байтов по слотам конфигурационной зоны и соответствующим смещениям, согласно даташита на ATSHA204A.
byte slots[8] = {13, 13, 14, 14, 15, 15, 16, 16}; byte shifts[8] = {0, 1, 0, 1, 0, 1, 0, 1};
Функция чтения байта Use Flag из заданного слота.
void readConf() { byte bufTx[SHA204_CMD_SIZE_MAX]; byte bufRx[SHA204_RSP_SIZE_MAX]; byte retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot)); useFlag = bufRx[SHA204_BUFFER_POS_DATA + 0 + shift*2]; }
И код вывода байтов Use Flag всех 8-и слотов в serial.
for (byte i = 0; i < 8; i++) { slot = slots[i]; shift = shifts[i]; Serial.print(F("Use Flag")); Serial.print(i); Serial.print(F(": 0x")); readConf(); Serial.println(useFlag, HEX); }
Результат работы нашего скетча:
Выведены все байты Use Flag и все они имеют максимальное значение 0xFF.
Чтение Update Count (0 – 7)
Байты Update Count показывают, сколько раз слоты 0 – 7 были обновлены с помощью DeriveKey. Полный код скетча чтения байтов Update Count:
/* ATSHA204 Read Config Update Count */ #include <sha204_library.h> #define ATSHA204_PIN A3 byte updateCount = 0; byte slots[8] = {13, 13, 14, 14, 15, 15, 16, 16}; byte shifts[8] = {0, 1, 0, 1, 0, 1, 0, 1}; #define SLOT_NUM 0 byte slot = slots[SLOT_NUM]; byte shift = shifts[SLOT_NUM]; atsha204Class sha204(ATSHA204_PIN); void setup() { Serial.begin(115200); Serial.println("ATSHA204 Read Config Update Count start..."); for (byte i = 0; i < 8; i++) { slot = slots[i]; shift = shifts[i]; Serial.print(F("Update Count")); Serial.print(i); Serial.print(F(": 0x")); readConf(); Serial.println(updateCount, HEX); } } byte addr(byte slot) { return slot * 4; } void readConf() { byte bufTx[SHA204_CMD_SIZE_MAX]; byte bufRx[SHA204_RSP_SIZE_MAX]; byte retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot)); updateCount = bufRx[SHA204_BUFFER_POS_DATA + 1 + shift*2]; } void loop() { }
Получаем данные по выбранному слоту, используя смещение, согласно даташита на ATSHA204A.
void readConf() { byte bufTx[SHA204_CMD_SIZE_MAX]; byte bufRx[SHA204_RSP_SIZE_MAX]; byte retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot)); updateCount = bufRx[SHA204_BUFFER_POS_DATA + 1 + shift*2]; }
И выводим на печать данные сразу по всем 8-и слотам.
for (byte i = 0; i < 8; i++) { slot = slots[i]; shift = shifts[i]; Serial.print(F("Update Count")); Serial.print(i); Serial.print(F(": 0x")); readConf(); Serial.println(updateCount, HEX); }
Результат работы нашего скетча:
Чтение Last Key Use (0 – 15)
Байты Last Key Use используются для ограничения использования слотов, каждый единичный бит представляет оставшееся их использование. Применяется только в том случае, если 5-й бит SlotConfig (Single Use) установлен в единицу.
Полный код скетча чтения байтов Last Key Use:
/* ATSHA204 Read Config Last Key Use */ #include <sha204_library.h> #define ATSHA204_PIN A3 byte lastKeyUse = 0; byte slots[] = {17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20}; byte shifts[] = {0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3}; #define SLOT_NUM 0 byte slot = slots[SLOT_NUM]; byte shift = shifts[SLOT_NUM]; atsha204Class sha204(ATSHA204_PIN); void setup() { Serial.begin(115200); Serial.println("ATSHA204 Read Config Last Key Use start..."); for (byte i = 0; i < 16; i++) { slot = slots[i]; shift = shifts[i]; Serial.print(F("Last Key Use")); Serial.print(i); Serial.print(F(": 0x")); readConf(); Serial.println(lastKeyUse, HEX); } } byte addr(byte slot) { return slot * 4; } void readConf() { byte bufTx[SHA204_CMD_SIZE_MAX]; byte bufRx[SHA204_RSP_SIZE_MAX]; byte retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot)); lastKeyUse = bufRx[SHA204_BUFFER_POS_DATA + shift]; } void loop() { }
И результат его работы — вывод данных (байтов Last Key Use ) по всем 16-и слотам:
Чтение UserExtra
Байт UserExtra используется для работы с системой и устанавливается с помощью команды CreateExtra. Код скетча для чтения байта UserExtra.
/* ATSHA204 Read Config User Extra */ #include <sha204_library.h> #define ATSHA204_PIN A3 byte bufTx[SHA204_CMD_SIZE_MAX]; byte bufRx[SHA204_RSP_SIZE_MAX]; byte userExtra = 0; byte slot = 0; byte retCode = 0; atsha204Class sha204(ATSHA204_PIN); void setup() { Serial.begin(115200); Serial.println("ATSHA204 Read Config User Extra start..."); Serial.print(F("User Extra: 0x")); readConf(); Serial.print(userExtra, HEX); } byte addr(byte slot) { return slot * 4; } void readConf() { slot = 21; retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot)); userExtra = bufRx[SHA204_BUFFER_POS_DATA + 0]; } void loop() { }
Чтением данных о состоянии байта UserExtra занимается функция readConf().
void readConf() { slot = 21; retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot)); userExtra = bufRx[SHA204_BUFFER_POS_DATA + 0]; }
Присваиваем переменной slot значение слота, содержащего байт UserExtra, согласно даташита.
slot = 21;
Осуществляем чтение слота в массив bufRx.
retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot));
И получаем байт userExtra по смещению 0 (+ 0).
userExtra = bufRx[SHA204_BUFFER_POS_DATA + 0];
Далее выводим данные в Serial.
Serial.print(F("User Extra: 0x")); readConf(); Serial.print(userExtra, HEX);
Результат работы скетча, байт userExtra равен нулю:
Чтение Selector
Selector — это байт выбора устройства, которое останется в активном режиме после выполнения команды Pause. Код чтения байта Selector из конфигурационной зоны микросхемы ATSHA204A.
/* ATSHA204 Read Config Selector */ #include <sha204_library.h> #define ATSHA204_PIN A3 byte bufTx[SHA204_CMD_SIZE_MAX]; byte bufRx[SHA204_RSP_SIZE_MAX]; byte selector = 0; byte slot = 0; byte retCode = 0; atsha204Class sha204(ATSHA204_PIN); void setup() { Serial.begin(115200); Serial.println("ATSHA204 Read Config Selector start..."); Serial.print(F("Selector: 0x")); readConf(); Serial.print(selector, HEX); } byte addr(byte slot) { return slot * 4; } void readConf() { slot = 21; retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot)); selector = bufRx[SHA204_BUFFER_POS_DATA + 1]; } void loop() { }
И результат его работы:
Чтение Lock Data
Байт Lock Data управляет блокировкой Data и OTP зон микросхемы ATSHA204A. В разблокированном состоянии эти зоны могут быть записаны, но недоступны для чтения. Возможные значения байта:
0x55 — Зоны Data и OTP разблокированы и имеют доступ на запись.
0x00 — Зоны данных и OTP заблокированы. Слоты в Data зоне могут быть изменены только на основе соответствующих полей WriteConfig. Зона OTP может быть изменена только в соответствии с правилами режима OTP.
Полный код скетча чтения байта Lock Data:
/* ATSHA204 Read Config Lock Data */ #include <sha204_library.h> #define ATSHA204_PIN A3 byte bufTx[SHA204_CMD_SIZE_MAX]; byte bufRx[SHA204_RSP_SIZE_MAX]; byte lockData = 0; byte slot = 0; byte retCode = 0; atsha204Class sha204(ATSHA204_PIN); void setup() { Serial.begin(115200); Serial.println("ATSHA204 Read Config Lock Data start..."); Serial.print(F("Lock Data: 0x")); readConf(); Serial.print(lockData, HEX); } byte addr(byte slot) { return slot * 4; } void readConf() { slot = 21; retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot)); lockData = bufRx[SHA204_BUFFER_POS_DATA + 2]; } void loop() { }
И результат его работы:
Из представленной выше информации понятно, что наш экземпляр микросхемы ATSHA204A имеет разблокированные зоны Data и OTP и мы можем записывать в них нужную нам информацию.
Чтение Lock Config
Lock Config — это байт блокировки конфигурационной зоны микросхемы ATSHA204A. Его возможные значения:
0x55 — Зона конфигурации разблокирована (есть доступ на запись, по умолчанию)
0x00 — Зона конфигурации заблокирована (нет доступа на запись)
Код скетча чтения байта Lock Config:
/* ATSHA204 Read Config Lock Conf */ #include <sha204_library.h> #define ATSHA204_PIN A3 byte bufTx[SHA204_CMD_SIZE_MAX]; byte bufRx[SHA204_RSP_SIZE_MAX]; byte lockConf = 0; byte slot = 0; byte retCode = 0; atsha204Class sha204(ATSHA204_PIN); void setup() { Serial.begin(115200); Serial.println("ATSHA204 Read Config Lock Conf start..."); Serial.print(F("Lock Conf: 0x")); readConf(); Serial.print(lockConf, HEX); } byte addr(byte slot) { return slot * 4; } void readConf() { slot = 21; retCode = sha204.sha204m_read(bufTx, bufRx, SHA204_ZONE_CONFIG, addr(slot)); lockConf = bufRx[SHA204_BUFFER_POS_DATA + 3]; } void loop() { }
Результат работы скетча:
Конфигурационная зона нашей микросхемы ATSHA204A не заблокирована и мы можем производить запись и изменять её настройки.
Заключение
Этой статьёй мы заканчиваем мини-цикл материалов о чтении и свойствах конфигурационная зоны микросхемы ATSHA204A и в следующей статье мы приступим к изучению записи и изменению настроек этой криптомикросхемы.
Ссылки по теме
ATSHA204 - Библиотека и примеры
ATSHA204A - Чтение зоны конфигурации 1
ATSHA204A - Чтение зоны конфигурации 2
ATSHA204A - Запись конфигурации 1
ATSHA204A - Запись конфигурации 2
ATSHA204A - Запись конфигурации 3
ATSHA204A - Запись конфигурации 4
ATSHA204A - Работа в режиме Config Lock
ATSHA204A - Работа с зонами памяти
ATSHA204A - Чтение Data и OTP зон памяти
ATSHA204A - Аутентификация. Базовый блок
ATSHA204A - Аутентификация. Датчик
ATSHA204A - Криптография и команды
ATSHA204A - nRF24 аутентификация. База
ATSHA204A - nRF24 аутентификация. Датчик