《武汉工程大学学报》 2009年05期
87-89
出版日期:2009-05-28
ISSN:1674-2869
CN:42-1779/TQ
ADS1255同LPC2138的接口设计
0引言LPC2138是基于一个支持实时仿真和嵌入式跟踪的32/16位ARM7TDMI CPU的微控制器,并带512 kB嵌入的高速Flash 存储器.128 位宽度的存储器接口和独特的加速结构使32 位代码能够在最大时钟速率下运行.对代码规模有严格控制的应用可使用16 位Thumb模式将代码规模降低超过30%,而性能的损失却很小.较小的封装和极低的功耗使LPC2138 可理想地用于小型系统中,如访问控制和POS 机.宽范围的串行通信接口和片内32kB 的SRAM 使LPC2138 非常适用于通信网关、协议转换器、软modem、声音辨别和低端成像,为它们提供巨大的缓冲区空间和强大的处理功能.多个32 位定时器、2 个10 位8 路ADC、10 位DAC、PWM 通道和47 个GPIO 以及多达9 个边沿或电平触发的外部中断使它们特别适用于工业控制和医疗系统[1].ADS1255是德州仪器(TI)BurrBrown 产品线推出针对工业应用、具有业界最高性能的24位、数据输出速率最高可为30K采样点/秒(SPS) 的模数转换器(ADC).其由模拟多路开关(MUX)、输入缓冲器(BUF)、可编程增益放大器(PGA)、四阶ΔΣ调制器再加一个可编程数字滤波器组成,完美组合了一流的无噪声精度、数据速率以及多种功能,为设计人员提供了全套高精度测量解决方案,非常适用于包括科学仪器、工艺控制、医疗设备与秤重设备等要求苛刻的工业应用领域[2].1LPC2138和ADS1255的SPI接
口特点SPI(Serial Peripheral Interface串行外设接口)总线系统是一个同步串行外设接口,允许CPU与各种外围接口器件以串行方式进行通讯,交换信息.外围接口器件包括简单的TTL移位寄存器、AD、DA转换器、实时时钟、存储器以及LCD、LED显示驱动器等.SPI系统可直接与各个厂家生产的多种标准SPI外围器件直接接口,它使用四条线:串行时钟线(SCK),主机输入从机输出数据线(MISO),主机输出从机输入数据线(MOSI)和低电平有效的从机选择线(SS)[3].由于SPI系统总线只需3~4数据和控制线即可扩展具有SPI各种IO 器件,而并行总线扩展方法需8 根数据线、8~16 位地址线、2~3 控制线,因而SPI总线的使用可以简化电路设计, 提高设计的可靠性.LPC2138是荷兰飞利浦开发的一款基于ARM7内核的嵌入式处理器,最高时钟可以达到60M,它具有两个SPI接口:SPI0(SPI)和SPI1(SSP).1.1SPI0的特点单个完整和独立的SPI 控制器;遵循串行外设接口(SPI)规范;同步、串行、全双工通信;组合的SPI 主机和从机;最大数据位速率为输入时钟速率的1/8.1.2SPI1的特点兼容Motorola SPI、4线TI SSI和National半导体的Microwire总线;同步、串行通信;主机或从机操作;8帧收发FIFO,每帧4~16位.1.3ADS1255的SPI接口ADS1255 采用四线制(时钟信号线SCLK、数据输入线DIN、数据输出线DOUT和片选线CS).ADS1255只能工作在SPI 通讯的从模式下,可以通过各种主控制器来控制ADS1255 片上的寄存器,通过串口读或写这些寄存器.串口通讯时必须保持CS 为低电平. 在SPI 传送过程中,数据被同步地发送和接收,SCLK和DIN、DOUT同步移动,SCLK 信号要尽量保持干净以免发生数据丢失.DIN 结合SCLK 用来向ADS1255发送数据,在SCLK的下降沿有效;DOUT结合SCLK用来从ADS1255 读取数据,在SCLK 的上升沿有效.DIN和DOUT 也可以通过一条双向信号线与主控制器相连,但这种情况下一定不能用RDATAC命令来读取数据,在空闲时,DOUT处于高阻态[4].2LPC2138和ADS1255的SPI硬
件接口设计24位的AD转换芯片ADS1255采集的外部多路模拟输入信号,外部环境比较复杂,输入的模拟信号如果直接接入控制单元,会对控制芯片LPC2138的干扰较大,所以本硬件设计采用了高性能数字隔离器件ADUM1400,它对输入、输出电信号有良好的隔离作用,并且性能优于普通的光耦.LPC2138通过其SPI得到ADS1255采集的AD数据,然后负责数据处理.基于ADS1255和LPC2138芯片的以上特点,硬件接口设计如图1所示.图1硬件接口原理图
Fig.1Hardware interface schematic选择ADS1255同LPC2138的SPI0口连接,并将ADS1255的/DRDY脚(数据转换完成管脚),接到LPC2138的外部中断0(EXIN0),因为一片ADUM1400只能支持4个I/O,但是这里有SCLK,MOSI,MISO,SSEL,EXINT0五个引脚要进行隔离,所以要用两片ADUM1400,因为SPI接口本身比较简单,所以上面只给出了一个简化图.第5期樊季林,等:ADS1255同LPC2138的接口设计
武汉工程大学学报第31卷
3软件设计LPC2138不仅仅只负责采集AD数据,还要负责处理AD数据,并将其送到LCD显示,同时还要处理用户输入指令等等其他任务.软件设计部分主要介绍AD数据采集程序的设计.首先对CPU的SPI和外部中断进行一个初始化,然后设置ADS1255和LPC2138数据传输的格式,并对ADS1255内部一些寄存器进行必要的初始化.最后开启外部中断0,等待中断的到来,有中断就读取AD数据,并显示,没有就循环等待.AD数据采集流程图如图2所示.图2AD数据采集流程图
Fig.2Flow chart of AD data acquisition对CPU的初始化,主要是配置IO口的功能为SPI0,设置SPI的时钟为500K或更高,设置数据传输方式(CPHA=1,CPOL=0),设置外部中断0的触发方式为边沿触发,极性为高电平,也就是上升沿触发,然后对ADS1255的内部寄存器根据需要进行配置,例如不用的IO设置为输出模式,以降低功耗.初始化配置完毕后,打开CPU总中断和外部中断0的开关,最后等待中断,如果在中断中读取了数据,就根据下面的表格来处理和显示数据.24位AD的输入参考电压是2.5 V(Uref=2.5 V),它的电压转换范围为-5 V到+5 V,输入电压同输出代码的对应关系如表1所示.表1输入电压与输出代码转换表
Table 1Conversion form between input voltage and output code
输入的模拟电压(AINPAINN)完美的输出代码>=+2Vref/PGA0x7FFFFF+2Vref/PGA(2^23-1)0x00000100x000000-2Vref/PGA(2^23-1)0xFFFFFF<=-2Vref*2^23/PGA(2^23-1)0x800000PGA是ADS1255内部放大器的放大倍数,可以编程控制,在SPI初始化的时候设置,本文采用默认设置为1,也就是不使用内部放大器,读者可以根据自己的需要设置,是否使用该内部放大器.下面给出了LPC2138的SPI接口初始化的的一段代码.该代码主要是设置SPI的传输速率和配置ADS1255内部寄存器.其中ARMInitSPI()函数中的参数SPIFrq是用于设定SPI传输速率.主要的软件代码:void ARMInitSPI (SPIFreq){PINSEL1 &=0xfffffffc; IO0DIR &=0xfffffeff;PINSEL0 &=~0xff00;PINSEL0 |=0x1500;if (SPIFreq>PCLK/8) SPIFreq=PCLK/8;SPI_SPCCR=PCLK/SPIFreq; SPI_SPCCR &=~0x01;}ADS1255Init(void){EnableADS1255CS();CheckADS1255DRDY();WRADS1255Reg(STATUS,0x06);WRADS1255Reg(MUX,0x10);WRADS1255Reg(ADCON,0x00);WRADS1255Reg(DRATE,0x92);WRADS1255Reg(IO,0x00);}AD数据的采集利用了外部中断0,所以在中断服务子程序中主要完成数据的采集,每中断一次,CPU就读取3个字节的数据,先读取高字节,然后依次读取中间字节和低字节.置位中断标志,然后跳出中断.回到主程序后,中断标志来判断是继续循环等待还是读取新的AD数据并显示.下面的给出读取AD数据的一段代码,ADReadData函数中返回的是读取的AD数据.这个函数在中断服务子程序中被调用[5].
uint32 ADReadData (void)
{ uint8 TmpByte; uint32 Data; SPI_SendByte(ADS1255_CMD_RDATA); TmpByte=SPI_SendByte(0xAA); Data=((uint32) TmpByte) << 16; TmpByte=SPI_SendByte(0xAA); Data |=((uint32) TmpByte) << 8; TmpByte=SPI_SendByte(0xAA); Data |=TmpByte; return Data&0x00ffffff;
}4结语ADS1255是一款高精度、高性能的无噪声的AD,所以在应用时,有许多的细节需要注意.a. 首先对于SPI0时钟的设置,LPC2138的SPI0的时钟,最大为CPU输入时钟速率的1/8,但是笔者认为时钟不宜设置过高,否则影响AD数据的读取.笔者将此时钟设置为500K,用户可以根据自己的需要更改.b. 对CPOL和CPHA的设置很重要,DIN结合SCLK向ADS1255发送数据,在SCLK 的下降沿有效;DOUT结合SCLK用来从ADS1255读取数据,在SCLK的上升沿有效.所以设置CPOL=0,CPHA=1.c. ADS1255具有检测连接至输入端外部传感器的完整性的电路,但是ADS1255在正常工作时,一定要关闭传感器检测功能.d. ADS1255有2个通用数字I/O 口D0、D1,所有的I/O 口都可以通过IO寄存器设置为输入或输出,不用的IO 引脚可以作为输入接地,也可以设置为输出,这样有利于减小电源的消耗.