DSP—2812、28335串行通信接口SCI
SCI(Serial Communication Interface),即串行通信接口,是一个双线的异步串口,即具有接收和发送两根信号线的异步串口,一般可以看作是UART(通用异步接收/发送装置)。
2812的SCI模块支持CPU与采用NRZ(non-return-to-zero 不归零)标准格式的异步外围设备之间进行数字通信。如果设计时我们的SCI使用的是RS232串行接口,那么,2812就能和其他使用RS232接口的设备进行通信。例如2812内部的两个SCI之间,或者2812的SCI和其他DSP的SCI之间均能实现通信。
2812内部具有两个相同的SCI模块,SCIA和SCIB,每一个SCI模块都各有一个接收器和发送器。SCI的接收器和发送器各具有一个16级深度的FIFO(First in fist out 先入先出)队列,它们还都有自己独立的使能位和中断位,可以在半双工通信中进行独立的操作,或者在全双工通信中同时进行操作。
一. 2812-SCI模块
SCI模块具有两个引脚,SCITXDA和SCIRXDA,分别实现发送数据和接收数据的功能,这两个引脚对应于GPIOF模块的第4和第5位,在编程初始化的时候,需要将GPIOFMUX寄存器的第4和第5位置为1,才能使得这两个引脚具有发送和接收的功能。SCIA可以产生两个中断,SCIRXINTA和SCITXINTA,即发送中断和接收中断。
二. SCI模块的特点
1 -- 具有4个错误检测标志:极性(parity)、溢出(overrun)、帧(framing)、中断(break)检测。
2 -- 多处理器模式下具有两种唤醒方式:空闲线方式和地址位方式。通常使用的时候很少遇到多处理器模式,我们采用的是空闲线方式。
3 -- 通信工作于半双工或者全双工模式。
4 -- 具有双缓冲接收和发送功能,接收缓冲寄存器为SCIRXBUF,发送缓冲寄存器为SCITXBUF。
5 -- 发送和接收可以通过中断方式来实现,也可以通过查询方式来实现。
6 -- 具有独立的发送中断使能位和接收中断使能位。
7 -- SCIA模块具有13个控制寄存器,值得注意的是,这些寄存器都是8位的寄存器,当某个寄存器被访问时,数据位于低8位,高8位为0,因此,把数据写入高8位将是无效的。
三. SCI模块发送和接收数据的工作原理
SCI有独立的数据发送器和数据接收器,这样能够保证SCI既能够同时进行,也能够独立进行发送和接收的操作。
SCI发送数据的过程如下:如图右半部分所示,在FIFO功能使能的情况下,首先,发送数据缓冲寄存器SCITXBUF从TX FIFO中获取由CPU加载的需要发送的数据,然后SCITXBUF将数据传输给发送移位寄存器TXSHF,如果SCI的发送功能使能,TXSHF则将接收到的数据逐位逐位的移到SCITXD引脚上。
SCI接收数据的过程如下:如图的左半部分所示,首先,接收移位寄存器RXSHF逐位逐位的接收来自于SCIRXD引脚的数据,如果SCI的接收功能使能,RXSHF将这些数据传输给接收缓冲寄存器SCIRXBUF,CPU就能从SCIRXBUF读取外部发送来的数据。当然,如果FIFO功能使能的话,SCIRXBUF会将数据加载到RX FIFO的队列中,CPU再从FIFO的队列读取数据
四. SCI数据格式
在进行通信的时候,一般都会涉及到协议,所谓协议就是通信双方预先约定好的数据格式,以及数据的具体含义。这种事先约定好的规则,我们就把它叫做通信协议。
在SCI中,通信协议体现在SCI的数据格式上。通常将SCI的数据格式称之为可编程的数据格式,原因就是可以通过SCI的通信控制寄存器SCICCR来进行设置,规定通信过程中所使用的数据格式。SCI使用的是NRZ的数据格式。
NRZ数据格式
- 1 -- 1个起始位
- 2 -- 1—8个数据位
- 3 -- 1个奇/偶/非极性位
- 4 -- 1—2个结束位
- 5 -- 在地址位模式下,有1个用于区别数据或者地址的特殊位(仅用于多处理器通信)
复制代码
真正的数据内容是1—8位,1个字符的长度。我们通常将带有格式信息的每一个数据字符叫做一帧,在通信中常常是以帧为单位的。SCI有空闲线模式和地址位模式,而在平常使用的时候,我们一般都是两个处理器之间的通信,例如2812和PC机或者2812和2812之间通信,这时候,更适合使用空闲线模式,而地址位模式一般用于多处理器之间的通信。在空闲线模式下,SCI发送或者接收一帧的数据格式如图示,其中LSB是数据的最低位,MSB是数据的最高位。
空闲线模式下SCI一帧的数据格式---具体的定义这些数据格式的寄存器是通信控制寄存器SCICCR
五. SCI通信波特率设置
所谓的波特率就是指每秒所能发送的位数。2812的每个SCI都具有两个8位的波特率寄存器,SCIHBAUD和SCILBAUD,通过编程,可以实现达到64K不同的速率。
波特率的计算公式 : ( 1 ≤ BRR ≤65535 )
( BRR=0 )
BRR=波特率选择寄存器中的值,从十进制转换成十六进制后,高8位赋值给SCIHBAUD,低8位赋值给SCILBAUD
LSPCLK=37.5M时,SCI常见的波特率
在进行通信的时候,双方都必须以相同的数据格式和波特率进行通信,否则通信会失败。例如2812和PC机上的串口调试软件进行通信时,2812采用了什么样的数据格式和波特率,那么串口调试软件也需要设定成相同的数据格式和波特率,反之也一样。
六. SCI发送和接收数据的机制
通常使用的有两种方式:一种是查询方式,另一种是中断方式。
查询方式:就是程序不断去查询状态标志位,看看SCI是不是已经做好了数据发送或者接收的准备。当数据发送时,需要查询的是位于SCI控制寄存器2(SCICTL2)的第7为TXREADY,发送器缓冲寄存器就绪标志。当这个位为1的时候,表明发送数据缓冲寄存器SCITXBUF已经准备好开始接收并发送下一个数据了。当数据写入SCITXBUF,TXREADY自动会清零,如果TXENA使能了,发送移位寄存器TXSHF就会把SCITXBUF里面的数据发送出去。当数据接收时,需要查询的是SCI接收状态寄存器(SCIRXST)中的RXRDY,接收器就绪标志。当从SCIRXBUF寄存器中已经准备好一个字符的数据,等待CPU去读时,RXRDY位就会置1。当数据被CPU从SCIRXBUF读出后,或者系统复位,都可以使RXRDY清0。
中断方式:如果需要使用中断,必须使能外设自己的中断、PIE中断和CPU中断。SCIA的发送和接收中断分别位于PIE模块第9组的第1和第2位,同时对应于CPU中断的INT9。当前面所述的TXRDY也是个中断标志位,当该位置1时,就会产生发送中断事件,如果各级中断都已经使能,则会响应SCI的发送中断函数。当接收中断标志位RXRDY置1时,就会产生接收中断标志。如果各级中断已经使能,则会响应SCI的接收中断。值得提出来的是,我们在讲中断这一章内容的时候讲过,外设中断的标志位一定要手动复位,在这里SCI是个例外,原因如下:当发送器缓冲寄存器SCITXBUF做好准备发送数据时,TXRDY置1,但是当CPU将数据写入SCITXBUF的时候,TXRDY自动会清0。而当接收器缓冲寄存器已经准备好数据等待CPU去读取时,RXRDY置1,当CPU将数据从SCIRXBUF读出时,RXRDY也会自动清0。这样也就是说发送和接收这两个中断标志位都是可以自动清零的,所以无需手动复位。这是和其他外设中断不一样的地方,注意查询函数位于主函数的for循环内,这样才能不断的去查询TXRDY和RXRDY的状态,但是很明显程序运行的效率比较低。但是查询方式较中断方式而言,比较简单。因此,可以建议使用如下的组合,数据接收采用中断方式,而数据发送采用查询方式。
|