摘要:针对SPI总线接口缺乏标准协议的特点,提出了SPI器件之间通信的一般方法。论文阐述了ARM芯片内置SPI硬件控制器的工作原理和时序,并对射频芯片TRF7960x的工作模式与读写要求进行了分析。在此基础上,根据TRF796x的时序特性和访问要求,采用ARM芯片的硬件 SPI方式实现对TRF796x的读写访问与控制,并在RFID门禁系统中验证了通信结果。
关键词:SPI;ARM;TRF796x;时序
引言
SPI(同步串行外围接口)是由Motorola公司最早提出的,出现在其M68系列单片机中。它是一种全双工的同步串行接口,采用主一从模式架构,支持多Slave模式应用,但一般仅支持单Master。由于其简单实用,又不牵涉到专利问题,因此许多厂家的设备都支持该接口,被广泛应用于外设控制领域。 SPI接口是一种事实标准,并没有标准协议,大部分厂家都是参照Motorola公司的SPI接口定义来设计的。正因为没有确切的标准协议,不同厂家的 SPI器件接口在技术上存在着一定的差异,有的甚至无法直接互连。本文对SPI器件通信时容易忽略的问题进行了分析。
1 S3C2440A内置SPI接口与工作时序
S3C2440A是Samsung公司生产的ARM9内核芯片,该芯片内置了2个SPI硬件控制器,大大简化了与SPI器件的通信。从 Samsung公司提供的Datasheet中可以看出,其内置硬件SPI结构主要由4部分构成:时钟分频器、8位发送移位寄存器、8位接收移位寄存器、控制逻辑等。其与SPI接口相关的寄存器包括控制寄存器(SPCONn)、状态寄存器(SPSTAn)、引脚控制寄存器(SPPINn)、预分频寄存器 (SPPREn)、发送数据寄存器(SPTDATn)、接收数据寄存器(SPRDATn,n=0,1)。其SPI接口共有4根信号线,分别是从设备选择线(SS)、时钟线(SCK)、串行输出数据线(MO-SI)、串行输入数据线(MISO)。当S3C2440A作为Master时,SS信号由S3C2440A驱动输出,用于选择激活某从 SPI器件,只有当SS信号线为低电平时,对应Slave设备的SPI接口才处于工作状态。为了满足不同SPI器件的通信特性,S3C2440A内置的 SPI接口定义了4种数据传输的工作时序,这4种时序是由控制寄存器(SPCONn)的时钟极性控制位(CPOL)和时钟相位控制位(CPHA)联合进行配置的。从表1可以看出,SPI的工作时序主要是根据数据采样的时刻(上升沿或下降沿),以及在没有数据传输时SCK信号所保持的状态来划分模式的。
根据CPOL和CPHA设置的不同,S3C2440A内置SPI接口的4种工作时序如图1所示。需要注意的是,SPI通信的数据传输是以字节为单位进行的,且高位在前,低位在后,图1中的*LSB表示上一个传输字节的最低位,MSB*是指下一个传输字节的最高位。
2 射频芯片TRF796x
TRF796x是德州仪器(TI)公司生产的射频读写器芯片,是一个13.56 MHz集成模拟前端和数据帧RFID阅读系统。其内部可编程配置,外部控制器可直接访问其内部寄存器来调整读写器的各种参数,该芯片被广泛应用于近距离RFID系统。
TRF796x芯片与处理器之间的通信既可以通过8位并行口也可以通过SPI接口。当采用SPI接口时,TRF796x芯片总是以从设备运行。如果内部的硬件编/解码器被使用,TRF796x将启动12个字节的数据缓冲器FIFO来完成数据的传送和接收。有时候为了使处理器(如MCU)能实时的处理数据,TRF796x会旁路掉硬件编/解码器,采用直接传送和接收功能。TRF796x芯片的两种通信模式是相互排斥的,在应用中的某个时刻只能有一种通信方式被使用。表2中列出了TRF796x的通信方式,可以看出,要实现其SPI通信就必须先对引脚I/00~I/O2配置成不同的电平。当芯片被使能工作时就会检测这3个引脚的电平,从而进入相应的通信方式。
当选择了SPI带SS通信方式,SS信号为高时SPI处于复位状态。只有SS信号为低时,时钟信号才开始工作,串行数据输入(MOSI)在上升沿采样,在下降沿确认生效,当SS信号变为高电平时,通信终止。TRF796x的写操作通信如图2所示。
TRF796x的单个寄存器读操作包括一个写周期和一个读周期,在写周期过程中,MISO引脚上是无效的数据,其时序与写操作相同,也是上升沿采样,下降沿确认生效。在写周期和读周期之间,需要有半个时钟周期的极性转换时间。注意:对于任何读操作(单个读、连续读)来说,该时钟极性跳变必须被执行,否则不能够读到TRF796x寄存器的正确值。在读周期过程中,数据在下降沿采样,上升沿时确认生效,而MOSI引脚不应该有任何的跳变,就是说要始终保持高电平或低电平(即0x00或0xFF)。图3是TRF796x的读操作时序。
3 ARM与TRF796x通信的实现
S3C2440A的SPI接口传输方式有查询、中断、DMA三种,由于TRF796x有专门的IRQ中断引脚,所以本文选择ARM芯片 SPI接口的查询方式。S3C2440A作为Master,时钟频率通过SPPREn寄存器设置,其频率f=PCLK/[2(SPPREn的值+1)],f≤25 MHz。控制寄存器SPCONn应该根据具体的通信要求来设置。
对TRF796x的访问需要区分是写地址还是写命令,字节的最高位(MSB)决定了该指令是用于命令还是地址。具体的地址/命令字节位描述如表3所列。
从表3可以看出,如果是单个写寄存器操作,则发送字节最高3位为000;如果是连续写寄存器操作,则最高3位001;如果是读单个寄存器操作,则最高3位010;如果是写命令,则最高3位100;其他操作不再详述。
本文采用S3C2440A的SPI0接口与TRF796x通信,其连接图如图4所示。从I/O_0~I/O_2的引脚电平可以看出选择的是SPI带SS通信方式。其中,EN脚是TRF796x的工作使能引脚,I/O_4是SS脚。当SS置为低且查询到状态寄存器SPSTA0的最低位为1(说明SPI发送接收准备好),待发送的数据一旦写入到发送移位寄存器SPTDAT0中,SPI通信的发送和接收就会同时开始,一般是上升沿发送,下降沿接收。如果只想发送不想接收数据,可以不读取接收寄存器的内容;值得注意的是,如果只想接收数据,应该写数据0xFF或0x00到发送移位寄存器,然后才能从接收移位寄存器中读取数据。
下面通过非连续寄存器读操作来具体说明ARM与TRF796x是如何进行SPI通信的。图5是对TRF796x的非连续寄存器读操作的流程。
整个读操作流程是:
①初始化操作,置EN脚为高电平使能TRF796x工作,将GPE11~GPE13配置成SPI功能,配置S3C2440A作为Master,且选择查询工作方式,写SPPREN0寄存器来配置通信时钟频率。
②写地址,从图1和图3的时序可以看出,要读TRF796x的寄存器值,必须包含一个写地址周期和一个读数据周期。在写TRF796x的地址之前,必须先设置SPCON0的CPOL和CPHA都为O,这样通信双方的时序才能保持一致,而且要将地址字节的最高3位设为010,然后将地址字节写入发送移位寄存器SPTDAT0中,一旦地址字节发送完,TRF796x就会把相应地址的内容送到MISO脚上。
③读数据,在地址字节写入后,读数据之前,必须转换SCK的时钟极性,从图1可以看出,需要设置CPOL为0,CPHA为1,这样就满足了TRF796x的读时序要求。写数据0x00或0xFF到SPTDAT0中,接着就可以从SPRDAT0中读取数据。
非连续读操作的实现代码如下:
为了验证上述的程序,在按照图4连接电路后,可以选择读取TRF7960的09h、0Ah、0Bh寄存器单元的内容,这3个寄存器在系统上电时,分别默认内容为0x11、0x40、0x87。定义一个数组 Operation[O]=0x09;Operation[1]=0x0A;Operation[2]=0x0B;调用函数 SingleRead(Operation,3);即可得到3个寄存器的内容并存放在Operation数组中。在RFID门禁系统的开发中,就是采用了这种SPI通信方式实现了ARM对RFID阅读器芯片的访问控制。
结语
本文通过介绍ARM芯片与TRF796x之间的硬件SPI通信方式,说明了在进行SPI器件之间通信时应该注意的问题,强调工作时序在通信时的重要性,最后给出的程序在RFID门禁系统中得到了运用。论文研究对ARM与其他SPI器件之间的通信有一定的参考意义,只要根据SPI器件的工作时序进行稍加修改就能融会贯通。