Sep.2008
2008年第09期ElectricalMeasurement&Instrumentation
AVR单片机与串行A/D的SPI接口设计*
王红亮,杨晓
(中北大学电子测试技术国家重点实验室仪器科学与动态测试教育部重点实验室,
太原030051)
摘要:为了解决信号采集系统的同步串行通讯问题,在理解AVR单片机SPI接口的通讯原理和方法的基础上,分析了AVR单片机SPI接口的工作过程,设计了AVR单片机和串行A/
D转换器的同步串行通讯接口,并用程序描述了SPI接口通讯的过程,实现了AVR单片机
通过SPI接口与串行A/D转换器之间的数据通讯。最后,用实验和数据分析验证了设计方案的可行性。
关键词:SPI接口;AVR单片机;串行A/D中图分类号:TP368.1
文献标识码:B
文章编号:1001-1390(2008)09-0046-03
ThedesignofSPIbetweenAVRmicrocontrollerandserialA/D
converter
WANGHong-liang,YANGXiao
(NationalKeyLaboratoryForElectronicMeasurementTechnology,KeyLaboratoryofInstrumentationScience&DynamicMeasurement(NorthUniversityofChina),Ministryof
Education,NorthUniversityofChina,Taiyuan030051,China)
Abstract:Thesynchronousserialcommunicationplaysanessentialpartinthedesignofdataacquisitionsystem.Inthisthesis,AVRmicrocontrollerischosentoconstructthesystem.BasedontheanalysisoftheAVR’sSPI,thesynchronousserialcommunicationsubsystemisdesignedandimplementedsuccessfullybetweentheAVR’sSPIandserialA/Dconverter.ThemainprogrammeispresentedtodescribetheworkingprocessofAVR’sSPIinterface.Intheend,thedatatransmissioniscorrectandeffective,whichprovesthecorrectnessofthedesign.
Keywords:SPI,AVRMicrocontroller,SerialA/DConverter
0
前
言
很适合用于单片机的测控系统[2]。
本文以AVR单片机AT90S8535和串行A/D转换器TLC2543为例,设计了AT90S8535与TLC2543之间的同步串行通讯接口,用单片机C语言描述了两者之间的通讯过程,实现了AT90S8535与TLC2543之间数据通讯,并且利用VB编写的处理软件对单片机所接收到的数据进行了波形验证。
同步串行通讯口(SPI)是工业标准的同步串行外设接口,其控制总线只需要4根控制线就可以扩展具有SPI的各种I/O器件[1],因此在工程控制领域有着广泛的应用。TLC2543串行A/D转换器是采用CMOS技术的12位逐次逼近式A/D转换器,它可以直接和具有SPI接口的单片机相连,接口非常简单。由于它是一款高速高精度、接口简单、价格低廉的12位串行A/D器件,
(50535030)*国家自然科学基金资助项目
1系统工作原理
系统按照图1所示的电路关系连接之后,可通过
-46-
总第45卷第513期电测与仪表Vol.45No.513
Sep.2008
2008年第09期ElectricalMeasurement&Instrumentation
对AVR单片机编程来实现其对串行A/D转换器据采集功能。其与外部器件的通讯接口就是同步串行(CS)、A/D转换结束标志(EOC)、输入输出接口:片选
(I/OCLOCK)、数据输入线(DATAINPUT)、数据时钟
(DATAOUTPUT)。除了EOC之外、其他的四根输出线
控制线依次与AT90S8535的SPI口的控制线相连(具体连接示意图参照图1),这样便可以实现单片机与A/D转换器之间的数据通讯[8]。
TLC2543的控制。在该系统中,AVR单片机的SPI接口
占据着主设备的地位,而TLC2543的SPI接口则属于从
设备。因此TLC2543要完全受AVR单片机的控制[3]。
在AVR单片机完成初始化配置之后,通过SPI口向TLC2543发送设置好的控制字,进而来控制
TLC2543对模拟信号进行转换,并将转换之后的数据再通过SPI接口发给AVR单片机。当AVR单片机接收到TLC2543发送过来的数据之后,再通过AVR单片机
的UART接口发送到计算机,供计算机的处理软件进行处理。
2.2SPI接口通讯相关寄存器的配置
同步串行通讯的通讯程序设计思想的实质就是在时序的配合下,通过对AVR单片机的SPI口三个寄存器的配置来实现数据通讯。这三个寄存器分别是:控制寄存器、状态寄存器和数据寄存器[6]。
控制寄存器(SPCR)可以设置SPI口工作时的中断、工作模式和时钟频率等,只要对控制寄存器进行某些赋值就可以实现相应的功能。
状态寄存器(SPSR)含有SPI中断标志位SPIF,当串行数据发送完成时,中断标志位将会置1,并产生中断。如果从机选择线SS被设置为输入且在SPI口是主机模
式时,该标志位将被置低,这时将会设置SPIF标志。SPIF位在执行相应中断向量时被硬件清除。
2数据通讯的电路设计及相关寄存器的配置2.1AVR单片机与TLC2543的电路设计
在设计通讯电路之前,为了保证AVR单片机的正常工作,首先要建立一个满足单片机正常工作的最小系统,电源输入、地以及为AVR单片机提供时钟的晶振[4]。有了这些基本的条件,我们才可以设计SPI口正常工作的外围通讯电路。
SPI口数据寄存器(SPDR)可以进行读/写,以便用于在寄存器文件和SPI移位寄存器之
间传递数据。
对SPSR和SPCR两个寄存器的判断和设置是能否准确实现同步串行通讯的关键所在。因此,在编写AVR单片机的SPI通讯程序的过程中,要特别熟悉这两个寄存器的功能赋值。
需要注意的是,状态寄存器的第7位SPIF
图1AT90S8535与TLC2543连接示意图在保证了单片机的最小系统之后,单片机与串行
位为SPI的中断标志位,若以查询方式来发送数据时,当串行数据发送完之后,SPIF位将会
自动置1,但是在数据接收的时候,当数据接收完之后,该位不会置位[7]。因此在调用接收数据的程序后,要加上一段延时来保证数据的准确接收。
A/D转换器之间数据通讯就可以利用SPI口来完成。
在同步串行通讯过程中,要求单片机和外设之间的工作时钟必须同步,这样才能达到数据同步传输的要求。
33.1
软件编程程序说明
本文的AT90S8535与TLC2543数据通讯程序是在
AVR单片机的SPI口有四条控制线:串行时钟(SCK)、主机输入/从机输出数据线(MISO)、主机输出/从机输入(MOSI)数据线和从机选择线(SS)[5]。SPI口工作时,在从机选择线(SS)使能的前提下,主机的SCK时钟脉冲在数据线上为数据交换提供必需的参
照时钟。
TLC2543串行A/D转换器具有11路模拟输入通道、10ms的转换速度,能提供较高精度且多通道的数
ICCAVR软件环境下完成编写的。
要实现串行A/D转换器的控制和通讯,就必须先对单片机的SPI口的寄存器进行初始化。首先设置SPI口的
(SPCR)赋SPCR寄存器,在本例中,直接对控制寄存器
值为0B01010000,其中,每一位的功能描述如下:
SPIE=0,禁止中断,以查询的方式来发送数据,每
-47-
总第45卷第513期电测与仪表Vol.45No.513
Sep.2008
2008年第09期ElectricalMeasurement&Instrumentation
当发送完一个数据之后,就查询状态寄存器中的SPIF位,当SPIF位置1时,表示一个数据已经发送完毕,这时可以将下一个数据放在数据寄存器中进行发送;
SPE=1:SPI使能;
DORD=0:数据的低位先传送;
MSTR=1:AT90S8535的SPI接口设置为主机模式;CPOL=0,CPHA=0:对应SPI的模式0;
SPR1=0,SPR0=0:对应工作频率为fosc/4,fosc指的是
晶振的工作频率[9]。
初始化控制寄存器之后,就可以对串行A/D转换器进行控制和通讯了。下面给出用C语言编写的通过
图2信号源信号与采集到的数据波形
(由计算机处理程序画出)的对比示意图
个停止位,故在一个信号周期内共要传输57600/100/
SPI口对TLC2543的控制和通讯程序:
PORTB&=~BIT(PB4);//片选使能delay_1ms();//延时
while(1)//开始控制A/D转换器进行转换,并把转化结果发给单片机
9=64帧数据,而本设计中使用的是16位采样精度,所以,每一个周期共采集了64/(16/8)=32点,图2的右图
中共有75个采集点,所以显示的周期应该为75/32=2.3个周期,与右图显示的波形频率基本上是吻合的。
4结论
{adcl=0;adch=0;
CtrlByte=0x0C;//操作码0x0C表示的是选中通道0,16位分辨率,
数据的高八位先传送,高八位传送结束之后,再进行数据的低八位传送
本系统采集的数据经过上位机软件进行波形重现,并与信号源的波形对比后发现,该系统具有转换准确、显示的波形失真度小、精度高等特点,同时也可以为其他具有SPI口的系统设计提供参考。
参
考
文
献
adch=SPI_TranByte(CtrlByte);//把命令字发给TLC2543,并且把上次模拟信号的转化结果的高八位赋值给adch
adcl=SPI_TranByte(CtrlByte);//把命令字发给TLC2543,并且把转化结果的低八位赋值给adcl
[1]杨俊春,孙,赵国良.AVR单片机的SPI口[J].应用科技,2005,(2):43-46.[2]高惠平.串行ADCTLC2543与单片机的接口重点[J].电子世界,2003,(5):35.
[3]李振军.ATMELAVR单片机SPI接口应用研究[J].湖南广播电视大学学报,2003,(4):90-91.
}
//向TLC2543发送命令字,并读回转换结果的函数unsignedcharSPI_TranByte(unsignedcharbData){
SPDR=bData;//发送命令字给TLC2543
while(!(SPSR&0x80));//判断命令字是否发送完毕returnSPDR;//读回上次模拟信号的转换的结果}
[4]丁化成等.AVR单片机应用设计[M].北京:北京航空航天大学出版社,2002.
[5]陈志彬,王仲初,崔文华.SPI接口芯片在单片机小系统中的应用[J].自动化与仪表,2001,(1):63~65.
在SPI_TranByte函数中,需要注意的是在向
[6]耿德根.AVR高速嵌入式单片机原理与应用[M].北京:北京航空航天大学出版社,2001.
TLC2543发送命令字的同时,TLC2543也将转换的结果放在了SPI口的数据寄存器中,只需把上次模拟信号转换的数据读回来即可,而SCK的工作时钟是由SPDR数据寄存器产生的,只要是SPDR含有一个数据(不管是什么数据),SPI口都会产生一个通讯时钟,以
供双方通讯时使用[10]。
[7]李玲,周小佳,唐秀辉,闫斌.AVR单片机接口设计[J].福建电脑,2006(5):11-12.
[8]杜开初.串行12位A/DTLC2543及其应用[J].世界电子元器件,2000,(10):37-39.
[9]金春林,邱慧芳,张皆喜.AVR系列单片机语言编程与应用实例[M].北京:清华大学出版社,2003.
3.2波形验证
图2是信号源的正弦信号和采集到的数据波形
[10]汪炼,韩震宇.基于AVR单片机的串口通讯[J].中国测试技术,2003,(3):52-53.作者简介:
王红亮(1978-),男,河南林州人,中北大学电子与计算机科学学院讲师。Email:wanghongliang@nuc.edu.cn
杨晓(1984-),男,河北衡水人,现是中北大学电子与计算机科学技术学院在读研究生,主要研究信号采集与信号处理。
(由计算机处理软件画出)对比示意图,左图是正弦信号在示波器上显示的波形,其工作的频率是100Hz,幅值为5V。计算机处理软件的界面上显示了75个采集点,波形的幅值为5V。串行通讯的波特率为57600bps。
由于AVR单片机在与计算机进行串行通讯的过程中,每一帧数据共有9位,其中包括8个数据位和一
Email:yangxiao1405@163.com
收稿日期:2008-03-25
(常会敏编发)
-48-
因篇幅问题不能全部显示,请点此查看更多更全内容