本帖最后由 lszisgood 于 2016-1-16 15:09 编辑
移植libnfc到 MQX RTOS1. 平台独立的近场通讯(NFC)库libnfc
libnfc是GNU公共许可正下发布的第一个免费的底层的NFC软件开发包和编程应用程序接口。所有人都完全免费使用的NFC软件工具开发包。libnfc支持所有的主流操作系统。libnfc库支持各种NFC硬件库,如dongles、flat 和 OEM设备等。libnfc当前支持ISO/IEC14443协议A、B,Felica、Jewel/Topaz标签和发起者和接收者的点对点数据交换。
2. MQX RTOS实时操作系统 NXP MQX实时操作系统的设计旨在提供一个基于组件的现代化微内核架构。MQXRTOS实时操作系统包含带有抢占式调度和快速中断响应功能的多任务处理内核、丰富的任务间通信和同步工具以及文件系统。它占用的空间较小并且可配置,能够为嵌入式应用节省存储器空间,最低配置仅占用6KB的ROM,包括内核、中断、信号量、队列和存储器管理器。MQX实时操作系统包含TCP/IP协议栈(实时通信系统)、嵌入式MS-DOS文件系统(MFS)、 支持个人医疗保健设备类(PHDC)的USB主机/设备协议栈以及任务感知型调试功能。MQX实时操作系统板级支持包可用于多个平台,包括Kinetis、ColdFire、Vybrid、i.MX和PPC。
3. NXP智能卡读写芯片PN532
PN532是一个高度集成的非接触读写芯片,它包含80C51微控制器内核,集成了13.56MHz下的各种主动/被动式非接触通信方法和协议。 PN532传输模块支持6种不同的工作模式: 读写器模式,支持ISO/IEC 14443A / MIFARE®机制 读写器模式,支持 FeliCa机制 读写器模式,支持ISO/IEC 14443B机制 卡操作模式,支持ISO 14443A / MIFARE®机制 卡操作模式,FeliCa机制 ISO/IEC18092,ECM340点对点 支持主机接口: -SPI接口 -I2C接口 -串行UART 4. 硬件测试环境FRDM_K64 + PN532
FRDM-K64F是一款超低成本开发平台,面向Kinetis K64、K63和K24 MCU。FRDM-K64F开发板搭载了Kinetis K64系列微控制器MK64FN1M0VLL12,120MHz主频,基于Cortex-M4F处理器,1 MB闪存,256 KB RAM,适合需要高存储器密度、低功耗和高处理效率的应用。该系列支持免晶振USB设计,能够降低系统成本,节约电路板空间。PN532模块设置为HSU(High Speed UART)模式,与FRDM-K64F的UART1连接,默认波特率为115200。

5. 移植libnfc到MQX RTOS
libnfc原则上支持所有主要的系统,支持包括有:Linux、Windows、Mac OSX 。libnfc提供了驱动抽象层,移植到嵌入式RTOS也非常方便。在libnfc/drivers目录包含了PN532硬件驱动接口,在libnfc/drivers/pn532_emdev.c文件中实现PN532 HSU串口接口函数。在libnfc/buses目录包含了操作系统平台相关的驱动接口,libnfc/buses/emdev.c文件中实现了MQX的串口接口函数。其他文件则无需进行改动,移植代码量不大。
void emdev_init(nfc_emdev *emdev) void uart_open(void) { { emdev->open = uart_open; int buad = 115200; emdev->receive = uart_receive; if(uart_dev == NULL) emdev->send = uart_send; { emdev->close = uart_close; uart_dev = fopen("ittye:", (char const *) IO_SERIAL_NON_BLOCKING); } if(uart_dev != NULL) { ioctl(uart_dev,IO_IOCTL_SERIAL_SET_BAUD, &buad); } } } 6. libnfc测试代码 libnfc提供了友好的接口函数,可以快速开发NFC相关应用。例如下面运行在MQXRTOS中的代码可以扫描全部在场强内的卡片。
void main_task
(
uint32_t initial_data
)
{
(void)initial_data; /* disable 'unused variable' warning */ printf("\r\n============== NFC PN532 Demo for MQX ============== \n");
emdev_init(&emdev);
while(1)
{
//initiator();
//target();
list_passive_targets();
_time_delay(5000);
}
_task_block();
}  7. 注意事项 当PN532上电复位后处于关断模式下,能够通过I2C、HSU和SPI接口自动唤醒。第一次发送const uint8_t pn532_wakeup_preamble[] = { 0x55, 0x55, 0x00, 0x00, 0x00};唤醒命令后要紧接着发送SAMConfiguration命令,否则PN532将会唤醒失败。
|