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的状态,但是很明显程序运行的效率比较低。但是查询方式较中断方式而言,比较简单。因此,可以建议使用如下的组合,数据接收采用中断方式,而数据发送采用查询方式。
七. 多处理器通信
多处理器通信,顾名思义,就是多个处理器之间实现数据通信。一个简单的多处理器通信示意图如图6所示。在图中A、B、C、D之间都可以实现通信,实现表示处理器A和处理器B、处理器C、处理器D之间的通信。处理器A在同一时刻,只能和B、C、D之中的一个实现数据传输。当处理器A需要给B、C、D中的某一个处理器发送数据时,A-B,A-C,A-D这3条通路上都会出现相同的数据,如何确保这些数据被正确的处理器接收呢?
如果我们给A、B、C、D事先分配好地址,然后A发送出去的信息里含有地址信息,B或者C或者D,在接收到这个数据信息的时候,先进行地址的核对,如果地址不符合,则不予响应。如果地址符合,则立即读取数据。这就是多处理器通信的基本原理。
根据地址信息识别方法的不同,多处理器通信方式分为空闲线模式和地址位模式。
地址位多处理器通信格式
地址位多处理器通信 --- 当处理器A发出一串数据时,我们将其叫做数据块,由一个一个的帧构成。帧就是带有格式信息的字符数据。从图可以看到,某一个数据块中的第一帧是地址信息,第二帧是数据信息,然后留有一些空余空间之后,又有一个数据块,第一帧也是地址信息,后面是数据信息。我们可以看到,第一帧地址信息后面的一个位是1,而第2帧数据信息后面的一个位是0。我们把这一位称之为地址位,用于表示这个帧的数据时地址信息还是数据信息。像这样,在通信格式中加入地址位来判断信息是数据还是地址的方式叫做多处理器通信的地址位方式。
空闲线方式多处理器通信方式
空闲线方式多处理器通信 --- 块与块之间有一段比较长的空闲时间,这段时间要明显长于快内帧与帧之间的空闲时间。如果某个帧之后有一段10个位或者更长的空闲时间,那就表明新的数据块开始了。在某一个数据块中,第一帧代表地址信息,后面的帧为数据信息。也就是说,地址信息还是数据信息是通过帧与帧之间的空闲间隔来判断的。当帧与帧之间的空闲间隔超过10个位的时候,就表示新的数据块开始,而且其第一帧为地址信息。
空闲线模式中数据格式里没有额外的地址位,在处理10个字节以上的数据块时比地址位模式更为有效,被应用于典型的非多处理器SCI通信场合。而地址位模式由于有专门的位来进行识别地址信息,所以数据块之间不需要空闲时间等待,所以这种模式在处理一些小的数据块的时候更为有效,当然,我们也得看到,当传输数据的速度比较快,而程序执行速度不够快时,很容易中间会产生10位以上的空闲,这样其优势就更加不明显了