Realizujte čtečku NFC karet standardu ISO/IEC 14443. Použijte NFC modul založený na PN532 a pomocí vhodné sběrnice jej propojte s deskou 32F429IDISCOVERY. Pro zobrazení přijatých dat použijte vestavěný LCD displej.
Cílem tohoto projektu bylo vytvořit zařízení schopné komunikovat s RFID kartami, pracujícími na frekvenci 13,56 MHz. Dále mělo být zajištěno zobrazení dat na displej.
V projektu byly využity dvě hardwarové platformy:
Vývojová deska s procesorem od ST a s jádrem ARM Cortex-M4 má vestavěný LCD displej, vhodný pro zobrazení dat. Displej je dotykový-rezistivní a deska je vybavena dedikovaným obvodem STMPE811 pro jeho ovládání. Z těchto důvodů byla tato deska vybrána jako Master zařízení pro tento projekt.
Řídícím obvodem použitého NFC modulu je PN532 od NXP, zakoupený na Ebay. Na desce je vytvořena PCB anténa pro kmitočet 13,56 MHz a celé zařízení dokáže zajistit komunikaci s NFC kartou (modulace a demodulace, synchronizace atd.). Pro komunikaci s externími zařízeními jsou k dispozici sběrnice I2C, SPI a HSU, po kterých obvod komunikuje prostřednictvím datových rámců. Pro projekt byl tento modul vybrán jako Slave zařízení.
Pro konfiguraci periferií Master desky byl použit program STM32CubeMX, programování probíhalo v prostředí EmBitz. Pro práci byly využity HAL knihovny od STMicroelectronics.
Základním úkolem bylo nejprve zajistit komunikaci mezi Master a Slave deskou. Pro komunikační rozhraní byla vybrána sběrnice SPI. Parametry přenosu byly dány firmwarem obvodu PN532 a podle nich byla konfigurována periférie SPI4 v programu STM32CubeMX. Pro ověření funkčnosti byl použit příkaz GetFirmwareVersion, pro který je známa očekávaná odpověď. Výpis odpovědi byl realizován přímo do okna prostředí EmBitz pomocí semihostingu. Následující kód ukazuje způsob odeslání příkazu a výpisu odpovědi:
... // frame for command Transmit[0]= 0x01; //Data write byte Transmit[1]= 0x00; Transmit[2]= 0x00; Transmit[3]= 0xff; Transmit[4]= PN532_COMMAND_GETFIRMWAREVERSION; Transmit[5]= 0xfe; Transmit[6]= 0xd4; Transmit[7]= 0x02; Transmit[8]= 0x2a; Transmit[9]= 0x00; switch(HAL_SPI_Transmit(&hspi4, (uint8_t *)Transmit, B_SIZE, 5000)) { case HAL_OK: printf("Transmission OK\n"); HAL_SPI_Receive(&hspi4, (uint8_t *)Receive, B_SIZE, 5000); printf("Received:\n"); for (uint8_t i = 0; i < B_SIZE; i++) { printf(" %2X", Receive[i]); fflush(stdout); } break; case HAL_TIMEOUT: printf("Timeout\n"); break; case HAL_ERROR: printf("Error\n"); break; default: break; }
Bohužel se nepodařilo zprovoznit komunikaci mezi Master a Slave deskou, ani při explicitním zadání rámce příkazu (viz kód) nebyla odpověď obvodu podle očekávání. Další části projektu realizovány nebyly a celkové vypracování je nedostačující.