ISO/IEC 14443a Расчет CRC
Привет всем Я заканчиваю последний раздел моей прошивки для моего проекта NFC. Я пытаюсь установить связь с меткой NFC AD-740, которая использует MF0ULx1 MIFARE Ultralight EV1 от NXP - IC бесконтактных билетов. Читатель NFC, который я использую, - это CLRC663 от NXP. Я управляю считывателем NFC с помощью устройства PSOC5LP через SPI.
Теперь, когда у вас есть вся справочная информация, я задам свой вопрос.
Для этого конкретного метода чтения NXP мне нужно закодировать мой Cmd и Addr в CRC длиной 2 байта. Таблица данных, на которую я могу сослаться, ссылается на ISO/IEC 14443. Поиск в Google приводит меня к странице Википедии, которая затем показывает четыре раздела PDF. Я предполагаю, что мне нужен раздел 4 раздел протокола передачи. Единственная проблема заключается в том, что этот PDF-файл заблокирован стеной оплаты. Это намеренно??
В Интернете я нашел несколько примеров кода, которые могут помешать мне купить PDF за 170$, чтобы просто посмотреть на полином...
Пример кода 1 - я могу опубликовать ссылку на источник в комментариях. Нет представителя, чтобы сделать это в главном посте.
// Calculate an ISO 14443a CRC. Code translated from the code in
// iso14443a_crc().
func ISO14443aCRC(data []byte) [2]byte {
crc := uint32(0x6363)
for _, bt := range data
{
bt ^= uint8(crc & 0xff)
bt ^= bt << 4
bt32 := uint32(bt)
crc = (crc >> 8) ^ (bt32 << 8) ^ (bt32 << 3) ^ (bt32 >> 4)
}
return [2]byte{byte(crc & 0xff), byte((crc >> 8) & 0xff)}
}
Пример кода 2 - я могу опубликовать ссылку на источник в комментариях. Нет представителя, чтобы сделать это в главном посте.
void iso14443a_crc(byte_t* pbtData, size_t szLen, byte_t* pbtCrc)
{
byte_t bt;
uint32_t wCrc = 0x6363;
do {
bt = *pbtData++;
bt = (bt^(byte_t)(wCrc & 0x00FF));
bt = (bt^(bt<<4));
wCrc = (wCrc >> 8)^((uint32_t)bt << 8)^((uint32_t)bt<<3)^((uint32_t)bt>>4);
} while (--szLen);
*pbtCrc++ = (byte_t) (wCrc & 0xFF);
*pbtCrc = (byte_t) ((wCrc >> 8) & 0xFF);
}
А теперь перейдем к моему последнему вопросу со всей этой информацией... Можно ли предположить, что:
Полином CRC: 0x6363
Значение семени: 0x00FF
Визуальное представление можно увидеть здесь
2 ответа
Я нашел несколько полезных ресурсов при расчете CRC_A для ISO/IEC 14443:
- Онлайн калькулятор от Павла Жовнера
- Общий калькулятор CRC
- Libnfc содержит реализации для CRC_A и CRC_B как:
- iso14443a_crc в iso14443-subr.c
- iso14443b_crc в iso14443-subr.c
- Каждый метод также имеет вариант для добавления его в байтовый массив
Для потомков, вот реализация libnfc iso14443a_crc
:
void
iso14443a_crc(uint8_t *pbtData, size_t szLen, uint8_t *pbtCrc)
{
uint32_t wCrc = 0x6363;
do {
uint8_t bt;
bt = *pbtData++;
bt = (bt ^ (uint8_t)(wCrc & 0x00FF));
bt = (bt ^ (bt << 4));
wCrc = (wCrc >> 8) ^ ((uint32_t) bt << 8) ^ ((uint32_t) bt << 3) ^ ((uint32_t) bt >> 4);
} while (--szLen);
*pbtCrc++ = (uint8_t)(wCrc & 0xFF);
*pbtCrc = (uint8_t)((wCrc >> 8) & 0xFF);
}