1、1,SCI(Serial Communication Interface),即串行通信接口,是一个双线的异步串口,即具有接收和发送两根信号线的异步串口,一般可以看作是UART(通用异步接收/发送装置),1. SCI模块简介,2,我们在使用2812开发的时候,经常会遇到这样的情况,例如做电机控制时需要显示AD采样之后得到电机电压、电流、转速等数据,当然,我们可以使用液晶屏来显示,还有一种很好的方法就是将这些数据通过某种协议将它们上传给PC机,由PC机上的软件进行显示,监测,又例如某些项目中需要PC机发送预先设定的指令来控制2812中程序的运行方式。那2812怎么样才能和PC机之间实现数据的传输呢
2、?今天,我们就和大家来一起学习最为常用的一种方法SCI。,3,4,5,SCI发送数据的过程如下:如图右半部分所示,在FIFO功能使能的情况下,首先,发送数据缓冲寄存器SCITXBUF从TX FIFO中获取由CPU加载的需要发送的数据,然后SCITXBUF将数据传输给发送移位寄存器TXSHF,如果SCI的发送功能使能,TXSHF则将接收到的数据逐位逐位的移到SCITXD引脚上。,SCI接收数据的过程如下:如图的左半部分所示,首 先,接收移位寄存器RXSHF逐位逐位的接收来自于SCIRXD引脚的数据,如果SCI的接收功能使能,RXSHF将这些数据传输给接收缓冲寄存器SCIRXBUF,CPU就能从S
3、CIRXBUF读取外部发送来的数据。当然,如果FIFO功能使能的话,SCIRXBUF会将数据加载到RX FIFO的队列中,CPU再从FIFO的队列读取数据。,6,3. SCI数据格式,我们在进行通信的时候,一般都会涉及到协议,所谓协议就是通信双方预先约定好的数据格式,以及数据的具体含义。,在SCI中,通信协议体现在SCI的数据格式上。通常将SCI的数据格式称之为可编程的数据格式,原因就是可以通过SCI的通信控制寄存器SCICCR来进行设置,规定通信过程中所使用的数据格式。SCI使用的是NRZ的数据格式,NRZ数据格式包括了如下表所示的内容:,7,通信控制寄存器SCICCR,其内容如图5所,8,
4、4.SCI通信波特率,前面我们学习了SCI在通信时采用的数据格式的问题,那么SCI是以什么样的速度去发送这些数据的呢?这个速度就是由波特率来决定的。所谓的波特率就是指每秒所能发送的位数。2812的每个SCI都具有两个8位的波特率寄存器,SCIHBAUD和SCILBAUD,通过编程,可以实现达到64K不同的速率。波特率的计算公式如下所示:,其中BRR=波特率选择寄存器中的值,从十进制转换成十六进制后,高8位赋值给SCIHBAUD,低8位赋值给SCILBAUD。,值得注意的是,式中所示的波特率公式仅仅适用于, 1BRR65535。,9,当BRR=0是,波特率如下:,我们在用时一般可以通过下表:,1
5、0,5.SCI发送和接收数据的机制,下面让我们一起来了解一下SCI模块在发送数据和接收数据时所采用的机制。我们通常使用的有两种方式:一种是查询方式,另一种是中断方式。,1 查询方式:就是程序不断去查询状态标志位,看看SCI是不是已经做好了数据发送或者接收的准备。当数据发送时,需要查询的是位于SCI控制寄存器2(SCICTL2)的第7位TXREADY,发送器缓冲寄存器就绪标志。当这个位为1的时候,表明发送数据缓冲寄存器SCITXBUF已经准备好开始接收并发送下一个数据了。当数据写入SCITXBUF,TXREADY自动会清零,如果TXENA使能了,发送移位寄存器TXSHF就会把SCITXBUF里面
6、的数据发送出去。当数据接收时,需要查询的是SCI接收状态寄存器(SCIRXST)中的RXRDY,接收器就绪标志。当从SCIRXBUF寄存器中已经准备好一个字符的数据,等待CPU去读时,RXRDY位就会置1。当数据被CPU从SCIRXBUF读出后,或者系统复位,都可以使RXRDY清0。,11,2 除了查询方式之外,SCI的发送和接收还可以通过中断进行控制。如果需要使用中断,根据我们前面所学的三级中断的知识,必须使能外设自己的中断、PIE中断和CPU中断。,TXRDY也是个中断标志位,当该位置1时,就会产生发送中断事件,如果各级中断都已经使能,则会响应SCI的发送中断函数。当接收中断标志位RXRD
7、Y置1时,就会产生接收中断事件。如果各级中断已经使能,则会响应SCI的接收中断。,12,我们在讲中断这一章内容的时候讲过,外设中断的标志位一定要手动复位,在这里SCI是个例外,原因如下:当发送器缓冲寄存器SCITXBUF做好准备发送数据时,TXRDY置1,但是当CPU将数据写入SCITXBUF的时候,TXRDY自动会清0。而当接收器缓冲寄存器已经准备好数据等待CPU去读取时,RXRDY置1,当CPU将数据从SCIRXBUF读出时,RXRDY也会自动清0。这样也就是说发送和接收这两个中断标志位都是可以自动清零的,所以无需手动复位。这是和其他外设中断不一样的地方,希望大家能够注意,SCI中断与其它中断的不同,13,查询函数位于主函数的for循环内,这样才能不断的去查询TXRDY和RXRDY的状态,但是很明显程序运行的效率比较低。但是查询方式较中断方式而言,比较简单。因此,可以建议使用如下的组合,数据接收采用中断方式,而数据发送采用查询方式。,