
В этой статье мы продолжим знакомство с программированием зоны конфигурации микросхемы 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 аутентификация. Датчик



