电子说
TRF7960系列是TI推出的载波为13.56MHz、支持ISO15693、ISO14443A/B和FeliCa协议的射频接口芯片。许多人更关心它能不能读写MF1卡片,就我的理解及实际验证,由于MF1在卡选择之前的操作是遵守ISO14443A协议的,之后的卡验证和卡数据读写都是NXP自己的保密协议,所以TRF7960可以对MF1卡执行到卡选择操作,或者通俗的说可以读MF1的卡片序列号,但不能对MF1卡读写数据,除非开发者自己知道NXP的加密协议并自己编写代码实现该协议。
在TI官方公开的TRF7960说明书中,有详细的参考电路及基于MSP430单片机的参考代码,参考这些资料做自己的开发板或者产品板基本上难度不大。MCU可以使用并口或SPI串口操作TRF7960,并口相对简单一些,SPI通信则有一些问题需要特别注意。
首先,TI给出的SPI参考代码使用的是MSP430的内置SPI接口,我们实际开发中因为单片机内部资源或引脚分配限制往往需要软件模拟SPI通讯。TRF7960的SPI协议规定:
不通讯的时候,片选NSS保持高电平,时钟CLOCK保持低电平,通讯的时候NSS保持低电平。
主机向TRF7960写一位数据时,在CLOCK为低电平期间根据数据的值设置MOSI数据线,然后CLOCK上升沿通知TRF7960可以接收数据,CLOCK下降沿后继续准备下一位要发送的数据,代码如下:
for(j=8;j >0;j--) { if(((*pbuf)&0x80)==0x80)TRF796X_MOSI_HIGH; else TRF796X_MOSI_LOW; TRF796X_SCK_HIGH; (*pbuf) < <= 1; TRF796X_SCK_LOW; }
主机从TRF7960读一位数据时,在CLOCK为高电平期间TRF7960根据数据的值设置MISO数据线,然后CLOCK下降沿通知MCU可以接收数据,CLOCK上升沿后继续准备下一位要发送的数据,代码如下:
for(j=8;j >0;j--) { TRF796X_SCK_HIGH; _NOP();_NOP(); TRF796X_SCK_LOW; (*pbuf) < <= 1; if(TRF796X_MISO_LOW)(*pbuf)+=1; }
其次,MCU可以使用Direct Command直接向TRF7960发送一字节的命令码,执行复位、进入省电模式、向卡片发送数据、调整接收电路增益等功能。Direct Command的SPI时序有一个特殊的要求,在发送完一字节的命令后,在SS拉高之前,CLOCK要多出一个上升沿,代码如下:
SLAVE_SELECT_LOW; for(j=8;j >0;j--) { if(((*pbuf)&0x80)==0x80)TRF796X_MOSI_HIGH; else TRF796X_MOSI_LOW; TRF796X_SCK_HIGH; (*pbuf) < <= 1; TRF796X_SCK_LOW; } _NOP(); _NOP(); TRF796X_SCK_HIGH; _NOP(); _NOP(); SLAVE_SELECT_HIGH; _NOP(); _NOP(); TRF796X_SCK_LOW;
最后,TRF7960向磁场中的卡片发送数据后,等待卡片回应,是否收到卡片回送的数据及是否反应超时等命令的执行情况都是通过中断机制来表示的。在NXP的射频芯片中,可以不使用芯片的中断引脚IRQ而是直接查询射频芯片的中断标志寄存器来获得各种事件发生的情况,但在TRF7960中不能使用这种方式,因为读一次TRF7960的中断标志寄存器将会把寄存器中的中断标志清除,所以电路中通常要使用IRQ引脚,可以用IRQ引脚使能MCU中断或直接查询IRQ引脚,从而得知TRF7960内部发生了中断事件,进而用SPI读取其中断标志寄存器获取详细的中断事件产生情况。
全部0条评论
快来发表一下你的评论吧 !