《第6章TMS320F2812串行通信接口SCI.ppt》由会员分享,可在线阅读,更多相关《第6章TMS320F2812串行通信接口SCI.ppt(32页珍藏版)》请在三一办公上搜索。
1、第6章 TMS320F2812串行通信接口(SCI),学习重点F2812串口通信SCI特点及结构。SCI模块寄存器各位的含义及配置。基于C语言的SCI程序设计实例。,学习内容,SCI概述SCI 模块发送和接收数据的工作原理SCI 数据格式SCI 通信波特率SCI 发送和接收数据的机制多处理器通信SCI 的例程,1、SCI概述,SCI(Serial Communication Interface),即串行通信接口,是一个双线的异步串口,即具有接收和发送两根信号线的异步串口,一般可以看作是 UART(通用异步接收/发送装置)。F2812 的 SCI 模块支持 DSP 与采用 NRZ(non-ret
2、urn-to-zero 不归零)标准格式的异步外围设备之间进行数字通信。2812 内部具有两个相同的 SCI 模块,SCIA 和 SCIB,每一个 SCI 模块都各有一个接收器和发送器。SCI 的接收器和发送器各具有一个 16 级深度的 FIFO(First in fist out 先入先出)队列,它们还都有自己独立的使能位和中断位,可以在半双工通信中进行独立的操作,或者在全双工通信中同时进行操作。,串行通信的三种方式,根据信息的传送方向,串行通信可以分为单工、半双工和全双工三种,其各自的定义如下图所示。,SCI的CPU接口,SCI 模块具有两个引脚,SCITXDA 和 SCIRXDA,分别实
3、现发送数据和接收数据的功能,分别对应于 GPIOF 模块的第 4 和第 5 位,在编程初始化的时候,需要将 GPIOFMUX 寄存器的第 4 和第 5 位置为 1,才能使得这两个引脚具有发送和接收的功能,否则就是普通的 I/O 引脚。CPU 的系统时钟 SYSCLKOUT经过低速预定标器之后输出低速时钟 LSPCLK 供给 SCI。要保证 SCI 的正常运行,系统控制模块下必须使能 SCI 的时钟,也就是在系统初始化函数中需要将外设时钟控制寄存器 PCLKCR 的 SCIAENCLK 位置 1。SCI 可以产生两个中断,SCIRXINTA 和 SCITXINTA,即发送中断和接收 中断。,SC
4、I 模块的其他特点,2、SCI 模块发送和接收数据的工作原理,SCI 发送数据的过程:在 FIFO 功能使能的情况下,首先发送数据缓冲寄存器 SCITXBUF 从 TX FIFO 中获取由 CPU 加载的需要发送的数据,然后 SCITXBUF 将数据传输给发送移位寄 存器 TXSHF,如果 SCI 的发送功能使能,TXSHF 则将接收到的数据逐位的移到 SCITXD 引脚上。SCI 接收数据的过程:首先接收移位寄存器 RXSHF 逐位接收来自 SCIRXD 引脚的数据,如果 SCI 的接收功能使能,RXSHF 将这些数据传输给接收缓冲寄存器 SCIRXBUF,CPU 就能从 SCIRXBUF
5、读取外部发送来的数据。如果 FIFO 功能使能的话,SCIRXBUF 会将数据加载到 RX FIFO 的队列中,CPU 再从 FIFO 的队列读取数据。,3、SCI 数据格式,在 SCI 中传输的数据格式可以通过 SCI 的通信控制寄存器 SCICCR 来进行设置,规定通信过程中所使用的数据格式。SCI 使用的是 NRZ 的数据格式,如下表所示:,数据是 18 位,1 个字符的长度。将带有格式信息的每一个数据字符叫做一帧。SCI 有空闲线模式和地址 位模式,若是在两个处理器之间的通信,例如 2812 和 PC 机或者 2812 和 2812 之间通信,更适合使用空闲线模式,而地址位模式一般用于
6、多处理器之间的通信。,在空闲线模式下,SCI 发送或者接收一帧的数据格式如下图4 所示,其中 LSB 是数据的最低位,MSB 是数据的最高位。,具体的定义上图所示数据格式的寄存器是通信控制寄存器 SCICCR,其内容下图所示。,使 用 SCICCR 进行数据格式编程如下表所示:,使用 SCICCR 进行数据格式编程SciaRegs.SCICCR.bit.SCICHAR=7;/选择数据长度,为 8 个数据位SciaRegs.SCICCR.bit.PARITYENA=1;/开启极性功能,值为 0 的时候取消极性功能SciaRegs.SCICCR.bit.PARITY=0;/在开启极性功能的前提下,
7、该位值为 0 时选择偶极性,值为 1 时选择奇极性SciaRegs.SCICCR.bit.STOPBITS=0;/选择停止位,该位为 0 时有 1 个停止位,该位为 1 时有 2 个停止位。上述这几个语句,我们也可以合并成如下的语句:SciaRegs.SCICCR.all=0 x23;,4、SCI 通信波特率,SCI通信波特率就是指每秒所能发送的位数。2812 的每个 SCI 都具有 两个 8 位的波特率寄存器,SCIHBAUD 和 SCILBAUD,通过编程,可以实现达到 64K 不同的速率。波特率的 计算公式如下所示:,其中 BRR=波特率选择寄存器中的值,从十进制转换成十六进制后,高 8
8、 位赋值给 SCIHBAUD,低 8 位赋值给 SCILBAUD。注意:式 1 所示的波特率公式仅适用于1 BRR 65535,当 BRR=0 是,波特率如下:,波特率计算方法举例,例如外部晶振为 30M,经过 PLL 之后 SYSCLKOUT 为 150MHz,然后,当低速预定标器 LOSPCP 的值为 2 的时候,SYSCLKOUT 经过低速预定标器之后产生低速外设时钟 LSPCLK 为 37.5MHz,也就是说 SCI 的时钟为 37.5MHz。如果预设置SCI 的波特率为 19200,则将 LSPCLK 和波特率的数值代入式 1,便可得到:BRR=243.14,由于寄存器都是正整数,所
9、以省略掉小数后可以得到 BRR=243。将 243 转成 16 进制是 0 xF3,因此 SCIHBAUD 的值为 0,SCIHBAUD 的值为 0XF3。由于省略了小数,将会产生 0.06%的误差。当 LSPCLK 为 37.5M 时,对于 SCI 常见的波特率,其寄存器的值如下表所示:,在SCI通信时双方都必须以相同的数据格式和波特率进行通信,否则通信会失败。,5、SCI 发送和接收数据的机制,通常使用的有两种方式:一种是查询方式,另一种是中断方式。查询方式,就是程序不断去查询状态标志位,看看 SCI 是不是已经做好了数据发送或者接收的准备。当数据发送时,需要查询的是位于 SCI 控制寄存
10、器 2(SCICTL2)的第 7 位 TXREADY,发送缓冲寄存器就绪标志。当这个位为 1 的时候,表明发送数据缓冲寄存器 SCITXBUF 已经准备好开始接收并发送下一个数据了。当数据写入 SCITXBUF,TXREADY自动会清零,如果 TXENA 使能了,发送移位寄存器 TXSHF 就会把 SCITXBUF 里面的数据发送出去。当数据接收时,需要查询的是 SCI 接收状态寄存器(SCIRXST)中的 RXRDY,接收器就绪标志。当从 SCIRXBUF 寄存器中已经准备好一个字符的数据,等待 CPU 去读时,RXRDY 位就会置 1。当数据被 CPU 从 SCIRXBUF 读出后,或者系
11、统复位,都可以使 RXRDY 清 0。,使用查询方式发送或者接 收数据的程序结构如下:,调用主程序:/发送程序If(SciaTx_Ready()=1)SciaRegs.SCITXBUF=SCI_Senddata;/SCI_senddata 为需要发送的数据/接收程序if(SciaRx_Ready()=1)Sci_Receivedata=SciaRegs.SCIRXBUF.all;/SCI_Receivedata 用于存放接收的数据,使用查询方式发送或者接 收数据的程序结构如下:,/发送就绪标志状态查询函数int SciaTx_Ready(void)unsigned int i;if(SciaR
12、egs.SCICTL2.bit.TXRDY=1)i=1;/返回 1 说明发送器已经准备就绪,可以接收新的数据进行发送Elsei=0;return(i);,使用查询方式发送或者接 收数据的程序结构如下:,/接收就绪标志状态查询函数int SciaRx_Ready(void)unsigned int i;if(SciaRegs.SCIRXST.bit.RXRDY=1)i=1;/返回 1 说明数据接收已经就绪,等待 CPU 去读取数据Elsei=0;return(i);,通过中断方式进行SCI通信控制,如果需要使用中断,根据前面所学的三级中断的知识,必须使能外设自己的中断、PIE 中断和 CPU 中
13、断。SCIA 的发送和接收中断分别位 于 PIE 模块第 9 组的第 1 和第 2 位,同时对应于 CPU 中断的 INT9。前面所述的 TXRDY 是中断标志位,当该位置 1 时,就会产生发送中断事件,如果各级中断都已经使能,则会响应 SCI 的发送中断函数。当接收中断标志位 RXRDY 置 1 时,就会产生接收中断标志。如果各级中断已经使能,则会响应 SCI 的接收中断。特别注意:在前面章节中断内容的时候讲过,外设中断的标志位一定要手动复位,在这里 SCI 是个例外,原因如下:当发送器缓冲寄存器 SCITXBUF 做好准备发送数据时,TXRDY 置 1,但是当 CPU 将数据写入 SCIT
14、XBUF 的时候,TXRDY 自动会清 0。而当接收器缓冲寄存器已经准备好数据等待 CPU 去读取时,RXRDY 置 1,当 CPU 将数据从 SCIRXBUF 读出时,RXRDY 也会自动清 0。这是和其他外设中断不一样的地方。,使用中断方式发送或者接收的程序如下,Void main().InitPieCtrl();/*初始化 PIE 中断*/InitPieVectTable();/*初始化 PIE 中断矢量表*/*设置中断服务程序入口地址*/EALLOW;/This is needed to write to EALLOW protected registersPieVectTable.T
15、XAINT=/Enable Global realtime interrupt DBGM,使用中断方式发送或者接收的程序如下,/接收中断函数interrupt void SCIRXINTA_ISR(void)/SCI-APieCtrl.PIEACK.bit.ACK9=1;/释放 PIE 同组中断if(SciaRx_Ready()=1)Sci_Receivedata=SciaRegs.SCIRXBUF.all;/SCI_Receivedata 用于存放接收的数据EINT;/使能全局中断,使用中断方式发送或者接收的程序如下,/发送中断函数interrupt void SCITXINTA_ISR(v
16、oid)/SCI-APieCtrl.PIEACK.bit.ACK9=1;/释放 PIE 同组中断if(SciaTx_Ready()=1)SciaRegs.SCITXBUF=SCI_Senddata;/SCI_senddata 为需要发送的数据EINT;/使能全局中断,6、多处理器通信,多处理器通信,就是多个处理器之间实现数据通信。一个简单的多处理器通信示意图如下图 所示。,在图中 A、B、C、D 之间都可以实现通信。处理器 A 在同一时刻,只能和 B、C、D 之中的一个实现数据传输。当处理器 A 需要给 B、C、D 中的某一个处理器发送数据时,A-B,A-C,A-D 这 3 条通路上都会出现相
17、同的数据,那如何确保这些数据 被正确的处理器接收呢?,多处理器通信的基本原理,举例:如果您寄了一封信给远方的朋友,那邮递员如何准确的将信投递到您朋友家的邮箱的呢?因为您寄出的信封上写清楚了您朋友家的地址,邮递员将实际地址和信封上的地址核对,两者相符时,就 把信投进信箱了。根据这个原理,如果我们给 A、B、C、D主机事先分配好地址,然后 A 发送出去的信息里含有地址信息(B或者C或者D),在接收到这个数据信息的时候,先进行地址的核对,如果地址不符合,则 不予响应。如果地址符合,则立即读取数据。,SCI 在进行多处理器通信时,根据地址信息识别方法的不同,分为空闲线模式和地址位模式。,地址位模式,当
18、处理器 A 发出一串数据时,我们将其叫做数据块,由一个一个的帧构成,帧就是带有格式信息的字符数据。从图 7 可以看到,某一个数据块中的第一帧是地址信息,第二帧是数据信息,然后留有一些空余空间之后,又有一个数据块,第一帧也是地址信息,后面是数据信息。第 一帧地址信息后面的一个位是 1,而第 2 帧数据信息后面的一个位是 0。我们把这一位称之为地址位,用 于表示这个帧的数据时地址信息还是数据信息。像这样,在通信格式中加入地址位来判断信息是数据还 是地址的方式叫做多处理器通信的地址位方式。,空闲线方式下多处理器通信,在空闲线模式中,块与块之间有一段比较长的空闲时间,这段时间要明显长于快内帧与帧之间的
19、空闲时间。如果某个帧之后有一段 10 个位或者更长的空 闲时间,那就表明新的数据块开始了。在某一个数据块中,第一帧代表地址信息,后面的帧为数据信息。也就是说,地址信息还是数据信息是通过帧与帧之间的空闲间隔来判断的。当帧与帧之间的空闲间隔超过10 个位的时候,就表示新的数据块开始,而且其第一帧为地址信息。空闲线模式中数据格式里没有额外的地址位,在处理 10 个字节以上的数据块时比地址位模式更为有效,被应用于典型的非多处理器 SCI 通信场合。而地址位模式由于有专门的位来进行识别地址信息,所以数据块之间不需要空闲时间等待,所以这种模式在处理一些小的数据块的时候更为有效。,7、SCI 的例程,程序的
20、功能是当 PC 机上的串口调试软件发送数据给 2812 时,2812 的 SCI 先接收数据,然后将这些数据又发送回 PC 机,通过串口调试软件来进行显示。,例程中采用的波特率为 19200,数据位 8 位,无极性校验,停止位 1 位,所以我们在串口调试软件里也要做相同的设置,然后打开串口,将 16 进制复选框上的勾点掉,这样数据是按照 ASCII 码进行发送的。在发送数据框里输入想要发送的数据,然后点击手工发送。我们这里输入的是 hellodsp12345,点击发送之 后,接收框立即显示数据 hellodsp12345,说明 SCI 和 PC 通信成功,如图 10 所示。,通信时 CCS 中通过 watch window 观察到的 2812 接收到的数据,如图 11 所示。数组Sci_VarRx 是用来保存从 SCIRXBUF 中读取的数据。,将 Sci_VarRx 数组中显示的十进制数据转换为十六进制以后,可以得到下面的表格:,