Запись на Mifare Ultralight C с библиотекой PN532 для Arduino Uno

Я использую пример кода для чтения из MIFARE Ultralight и записи в MIFARE Classic с определением в файле .h:

#define PN532_RESPONSE_INDATAEXCHANGE       (0x41)
#define MIFARE_CMD_WRITE                    (0xA0)

но когда я запускаю код ниже:

/**************************************************************************/
uint8_t PN532::mifareultralight_WritePage (uint8_t page, uint8_t *buffer1)
{
    /* Prepare the first command */
    pn532_packetbuffer[0] = PN532_COMMAND_INDATAEXCHANGE;
    pn532_packetbuffer[1] = 1;                      /* Card number */
    pn532_packetbuffer[2] = MIFARE_CMD_WRITE;       /* Mifare Write command = 0xA0 */
    pn532_packetbuffer[3] = page;                   /* Page Number (0..63 in most cases) */
    memcpy (pn532_packetbuffer + 4, buffer1, 4);        /* Data Payload */

    /* Send the command */
    if (HAL(writeCommand)(pn532_packetbuffer, 8)) {
        Serial.println(F("Go here 1"));
        return 0;
    }
    Serial.println(F("Go here 2"));
    /* Read the response packet */
    return (0 < HAL(readResponse)(pn532_packetbuffer, sizeof(pn532_packetbuffer)));
}

Результат будет таким:

Scan a NFC tag

write:  4A 1 0
read:   4B 1 1 0 44 0 7 4 C1 37 CA 2C 2C 80
ATQA: 0x 44SAK: 0x 0
Writing Mifare Ultralight
write:  40 1 30 4
read:   41 0 2 0 0 10 0 6 1 10 11 FF 0 0 0 0 0 0
write:  40 1 30 3
read:   41 0 0 0 0 0 2 0 0 10 0 6 1 10 11 FF 0 0
Tag capacity 0 bytes
write:  40 1 A0 5 1 2 3 4
Go here 2
Write failed 0

Не заходит в "Иди сюда 1", значит нет команды записи в ридер, кто знает почему?


person Bao Doan    schedule 18.03.2014    source источник


Ответы (1)


Та команда записи, которую вы используете, кажется неправильной. Вы используете код команды COMPATIBILITY_WRITE (0xA0), но передаете параметры команды WRITE.

Я предлагаю вам придерживаться команды WRITE:

+-----------+------+------+---------------------+
| WRAPPING  | CMD  | ADDR | DATA (1 PAGE)       |
+-----------+------+------+---------------------+
| 0x40 0x01 | 0xA2 | 0x05 | 0x01 0x02 0x03 0x04 |
+-----------+------+------+---------------------+

Или вы также можете использовать команду COMPATIBILITY_WRITE:

  1. Вы начинаете с отправки команды и адреса:

    +-----------+------+------+
    | WRAPPING  | CMD  | ADDR |
    +-----------+------+------+
    | 0x40 0x01 | 0xA0 | 0x05 |
    +-----------+------+------+
    

    Затем вы должны получить статус ACK/NAK от тега.

  2. Затем вы отправляете данные во втором кадре:

    +-----------+---------------------+------------------------------------------------------------+
    | WRAPPING  | DATA (1 PAGE)       | FILLER (3 EMPTY PAGES)
    +-----------+---------------------+------------------------------------------------------------+
    | 0x40 0x01 | 0x01 0x02 0x03 0x04 | 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
    +-----------+---------------------+------------------------------------------------------------+
    
person Michael Roland    schedule 18.03.2014
comment
Да, ты прав. Я сделал это успешно. Спасибо :) - person Bao Doan; 19.03.2014
comment
Привет, сейчас я занимаюсь аутентификацией, но я не знаю команду для аутентификации, можете ли вы объяснить шаги и команду для аутентификации? Я уже записал ключи аутентификации в тег NFC и заблокировал тег. buffer1[] = {0x07, 0x06, 0x05, 0x04}; buffer2[] = {0x03, 0x02, 0x01, 0x00}; buffer3[] = {0x0F, 0x0E, 0x0D, 0x0C}; buffer4[] = {0x0B, 0x0A, 0x09, 0x08}; nfc->mifareultralight_WritePage(0x2C, buffer1); nfc->mifareultralight_WritePage(0x2D, buffer2); nfc->mifareultralight_WritePage(0x2E, buffer3); nfc->mifareultralight_WritePage(0x2F, buffer4); - person Bao Doan; 30.03.2014