新闻中心

EEPW首页>嵌入式系统>设计应用> A/D转换器CS5550与单片机的接口程序设计

A/D转换器CS5550与单片机的接口程序设计

作者: 时间:2010-04-02 来源:网络 收藏

ATmegal6中与SPI相关的寄存器有3个: SPCR(SPI控制寄存器)、SPSR(SPI状态寄存器)、SPDR(SPI数据寄存器)。其中,SPCR寄存器设置SPI的中断、数据顺序、主/从模式及串行时钟的相关特性;而SPSR寄存器中包括有SPI中断标志位(SPIF)、写碰撞标志位和倍速模式选择位,SPSR中的SPIF位将在SPI串行数据发送完成时置“l”,若此时用户已使能SPI接口中断且全局中断被打开。则会产生SPI接口中断。应该指出的是,在SPI接口数据接收完成时该SPIF位不会被置“1”,即没有接收结束标志位。串行时钟的产生由硬件自动完成;每当有新数据写入SPDR寄存器中,SPI接口会自动产生SCK信号将SPDR中的数据发送出去,同时将读取的数据存入SPDR的缓冲寄存器中。
2.2软件设计
的所有操作都是通过读写ATmegal6的内部寄存器来完成的。在使用的SPI接口之前,要对其进行初始化。这里采用查询方式来发送数据,故将SPCR中的最高位SPIE置“0”,禁止中断。使能SPI接口(SPE=1)。因的数据传输为MSB首先发送,故使DORD=O。将ATmegal6选择为主机模式(MSTR=1)。选择SPI工作模式0(CPOL=0,CPHA=0)。配置串行时钟设置为单片机晶振频率的1/16(SPRl=0,SPR0=1)。综合以上对SPCR各位的分析,应配置SPCR=Ox5l。另外还要对SPI接口相应的引脚方向进行配置:定义MOSI为输出、MISO为输入(SPI主机模式下由硬件自动配置为输入),SCLK为输出、为输出,SPI接口初始化后就可以与通信。
由于直接采用单片机的SPI接口读写CS5550,字节中每一位的发送/接收均由硬件完成,这样可简化控制和数据采集程序:向CS5550发送命令字节时只需将其直接写入SPDR寄存器即可;而读取返回数据时只需读取SPDR寄存器即可。为使SPI通信能够可靠、稳定地运行,这里有两个问题需要注意:一个问题是在向SPDR寄存器写数据之前,应首先查询SPSR寄存器中的SPIF位,以确保发送中的数据不会被新写入的数据所破坏。用C语言编写程序时可以使用类似的“while(!SPSR_SPIF):”的形式等待数据发送结束;另一个问题是,由于ATmegal6单片机的SPI接口无接收结束标志位,在读取SPDR寄存器之前应插入延时程序以确保读回数据的完整性和准确性。该程序流程如图2所示。

本文引用地址://m.amcfsurvey.com/article/173394.htm

3 使用软件模拟SPI接口
在实际应用中,可能会出现所选用的单片机没有集成SPI接口或是SPI接口被其他功能所占用而又仍然需要使用SPI协议与外围器件通信的情况,这时就必须采用软件模拟的方式来实现SPI通信。一般来说,可以使用单片机的任何4个I/O接口与CS5550连接。但为便于与前一种方法(使用硬件SPI接口)进行比较,这里仍采用图1所示的电路连接方式。在编写SPI接口程序前,要对使用到的I/O端口进行配置:PB5为输出(MOSI),PB6为输入(MISO),PB7为输出(SCK),PB4为输出()。其中PB7端口初值为“0”,PB4端口初值为“l”。为了模拟SPI数据寄存器,这里定义3个unsigned char型变量SPI_transmit_buffer、SPI_receive_buffer和trans-mit_counter分别用来存放需要发送的数据、接收到的数据和已发送数据的位数。每一位数据的发送接收必须严格按照CS5550数据手册上的时序要求来编写,否则会造成数据传输错误。CS5550的读写时序如图3所示。



评论


相关推荐

技术专区

关闭