读卡器项目总结(二)— FM17520芯片使用

主要学习过程:

1)认识FM17520芯片功能特性、使用方法、接口通信编写、寄存器操作等。

2)封装软件应用函数,打包成库文件,提供应用层调用。

3)归纳:外设芯片一般应用方法


(一)关于芯片应用:

【知识点】首先,知道芯片能干什么?一般查阅芯片手册的首页就有:产品简介。其中包含着该芯片型号所代表的重要信息,我们能从中获取第一手资料。

在FM17520芯片手册里面,就可以知道该芯片是在非接触式卡片方面使用的,并且获知其基本特性(接口类型、通信距离及速度、功耗特性、内存容量、各种硬件特性等)

【知识点】其次,找到该芯片的结构框图,加深对芯片的理解。结构框图往往是可以提供了芯片的功能架构及其内不同组成之间的关系。

本次重框图下获知:芯片内部架构,通信接口、以及最为重要的寄存器组成。

【知识点】获取寄存器组成,对芯片的操作几乎都通过寄存器来实现,因为寄存器是嵌入式软件的直接操作对象。

而在FM17520芯片手册对寄存器进行了分类型处理,包括了1)命令和状态2)通讯3)配置4)测试,四大类型寄存器。

【知识点】主控芯片与外设芯片之间的通信接口,此步骤最为重要,之后我们对芯片的操作都是依赖于通信接口。

FM17520的接口类型有SPI、UART、I2C三种连接方式,芯片在上电期间就自动完成Host接口自动侦测。同时,接口部分都必须要细心阅读,在本次调试SPI通信的过程中,发现读或写寄存器操作都需要同时编写读写FIFO寄存器(比如说,读的过程中,需要写一个地址和写一个0x00的数据后连续读取两次)。

【知识点】由此可见,通信接口程序的编写要注意的有两点:其一,通信接口程序符合某通信接口类型的基本通信方式(SPI或I2C则按照其规范编写),其二,最终目的是与外设芯片进行的通信,也必须要符合外设芯片规定的通信方式。

【知识点】以上的通信接口是主控芯片与外设芯片之间的通信,外设芯片与卡片(M1S卡)之间的通信则是模拟电路接口与非接触式接口来控制的,外设芯片通过发射无线信息与卡片进行交换数据,最终达到我们跟卡片交换数据,完成整体通信。

在此需要说明的,涉及到的无线通信是需要软硬件共同调节的,比如控制发射驱动功率、距离等。这个过程是完成了通信接口程序的编写后进行。

【知识点】数据交换储存器(一般称为FIFO寄存器),数据交换是贯穿整个完整通信过程的。

FM17520的FIFO用于主控芯片与FM17520内部状态机之间的输入输出数据流的缓冲,实现一个8*64位的FIFO缓冲器。也就是说,我们一旦设置好模拟电路(无线部分),之后的操作都是根据我们编写通信接口函数来实现的。

【知识点】就如同单片机一样,外设芯片亦具备了外部中断请求系统。

在FM17520中,我们通过使用IRQ引脚,来标记外设芯片是否具有外部中断请求,一旦检测到IRQ引脚发生中断,我们就可以通过特定的IRQ寄存器来判断中断类型,从而获取不同的中断信息,进而作出相应的操作。

【知识点】嵌入式设备往往需要稳定、可靠、并且维持长时间可持续运行。使用外设芯片的同时,也需要设定外设芯片所处的工作状态来决定它的功耗特性。

FM17520具备三种功耗类型,同时也允许用户关闭射频功能来进一步降低功耗。

【知识点】关于外设芯片的指令集问题。

1)指令集是外设芯片自身独自决定 ,几乎每个外设芯片都有它们芯片内部确定了一套指令集。

2)指令集的一般应用:使用某个指令,加上合适的数据,就完成了一次基本的控数据传输操作。有时候,指令也可以不加数据,直接使用。具体需要看芯片手册的指令集介绍

【知识点】电气参数。本人本次仅站在软件测试的角度去学习电气参数。

FM17520的电气参数,提供我们硬件设计和软件测试的典型参数,软件调试过程中需要利用工具观察参数,在允许参数波动范围内即表明软件控制目的完成,否则重新设定。


(二)关于代码:

1)本次使用的是STM8S105作为主控芯片,所以使用ST公司的官方库。

2)提供关键代码,以示参考,需要整套代码的朋友可以私信。

/*******************************************************************************
** Function name: SPI_SendByte
** Descriptions:     SPI发送一个字节
** input parameters: data -> 要发送的字节
** output parameters: 无
** Returned value: 无
 ******************************************************************************/
void SPI_SendByte(u8 data)
{
        /* 等待上一次数据传输完成,防止覆盖接受数据 */
while ((SPI->SR & (uint8_t)SPI_FLAG_TXE) == RESET);
SPI->DR =(unsigned char)data;
}
/*******************************************************************************
** Function name:  spi_SetReg
** Descriptions: SPI写读卡芯片寄存器函数
** input parameters: ucRegAddr:寄存器地址
**                                  ucRegVal:要写入的值
** output parameters:无
** Returned value:TRUE
********************************************************************************/
uint8_t spi_SetReg(uint8_t ucRegAddr, uint8_t ucRegVal)
{
    CD_EnNSS();
    
    SPI_SendByte(0x00|(ucRegAddr<<1));/*发送目标寄存器地址*/
    SPI_SendByte(ucRegVal);/*写数据*/
    ucRegVal = SPI_ReceiveByte();/*根据芯片手册说明,此时也需要让MISO数据线上数据回传*/
    ucRegVal = SPI_ReceiveByte();/*并且重复一次*/
    
    CD_DisNSS();
    
    return TRUE;
}


你可能感兴趣的:(项目总结)