浅谈ARM与TLV5637的模拟SPI接口的设计
扫描二维码
随时随地手机看文章
引 言
SPI 是英文Service Provider Interface的缩写。中文意思是服务提供商接口。满足某种服务标准的供应商提供的符合该标准的应用程序接口,SPI应该和该服务的API标准是兼容的,应用程序一般应该是基于API编写,除非是SPI中包含API中没有提供的功能而又必须使用。SPI的处理流程大同小异,以目前使用最多的SPI-4为例来说明SPI的原理。它在发送接口和接收接口都有各自的数据通道和流控状态信息通道,其数据通道和流控状态信息通道是独立的并且是点对点通信。数据是以包的形式发送,根据数据包中的内嵌地址可支持高达256个端口,以下分别说明基本协议及数据通道和流控状态信息的处理过程。
1 SPI串口通信格式
SPI接口协议要求接口设备按主一从方式进行配置,总线上可以连接多个可作为主机的控制器、具备SPI接口的输入/输出设备,但同一时间内总线上只能允许一个设备充当主机。通常,SPI接口包括4种信号:
MISO串行数据输入,也称主入从出。
MOSI 串行数据输出,也称主出从入。
SCK 串行时钟,由主机提供给从机。
SS 从机片选信号。
在时钟SCK的作用下,SPI主机发送寄存器的内容顺序移位输出给SPI从机。同时,SPI从机也将其数据寄存器的内容移位输出给主机。图1为其工作原理示意图。
2 基于ARM的SPI接口模拟
LPC2378是Philips公司生产的ARM7系列芯片。该芯片是一款支持实时仿真和嵌入式跟踪的16/32位 ARM7TDMI-S微控制器,具有三级流水线指令处理结构。LPC2378具有5个32位的GPIO端口。对GPIO口的控制可以通过操作以下GPIO 寄存器来实现:
FIODIR 快速GPIO端口方向控制寄存器;
FIOMASK 快速GPIO端口屏蔽寄存器;
FIOPIN 快速GPIO端口状态寄存器;
FIOSET 快速GPIO端口置位寄存器;
FIOCLR 快速GPIO端口清零寄存器。
SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。SPI有三个寄存器分别为:控制寄存器SPCR,状态寄存器SPSR,数据寄存器SPDR。外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。SPI总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCLK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,低位在后,为全双工通信,数据传输速度总体来说比I2C总线要快,速度可达到几Mbps。
发送数据的实现代码如下:
GPIO模拟SPI接口接收数据的流程和发送的不同之处在于读取MISO信号而非设置MOSI电平。限于篇幅,对其不予赘述。接收数据的实现代码如下:
上述的发送和接收代码只是基本的实现,对于不同的SPI器件需要在每次操作后加入不同的延时以满足该器件信号建立和保持的时序要求。
3 对TLV5637的访问
TLV5637是TI公司一款双通道的10位电压输出D/A转换器件。该器件具有3个信号线:SCLK、DIN和CS,支持对TMS320系列的SPI,以及QSPI和Microwave串行端口的无缝连接。图3为TLV5637和SPI接口的连接示意图。
图4为TLV5637的时序图。如图所示,TLV5637的数据采样是在SCK时钟的上升沿发生,而且该器件只支持16位的数据格式。
可以看出,16位的数据包含两个部分:编程位和数据位。SPD为速度控制位,1表示快速,0表示慢速;PWR为功率控制位,1表示掉电模式,0表示工作模式;R1和R0为寄存器选择位。表1为TLV5637的寄存器写入选择表。
表1中的写控制寄存器即设置参考电压,数据位的低两位表示参考电压的相关信息。其中,“00”和“11”表示参考电压取自外部,“0l”表示参考电压为1.024 V,“10”表示参考电压为2.048 V。输出电压的幅度由下式决定:
CODE为所写入的电压数据值,REF为所设定的参考电压。此外,在写入电压数据时,12位的数据只保持高10位有效,低2位可以忽略。TLV5637的写函数如下:
经过验证,可以通过GPIO口模拟的SPI接口对TLV5637的输出电压进行精确设置,而且其输出满足系统的电压误差要求。
结 语
本文提出了利用ARM芯片LPC2378的GPIO接口来仿真SPI接口的方法,同时实现了对串行D/A转换芯片TLV5637的模拟SPI接口访问。该方法具有一定的普遍意义,只要稍加改动,便可以应用于各种类型的微处理器。
QICK