SCI(串行通信接口)
- 一、SCI概述
- 二、SCI工作原理
- 三、SCI相关寄存器
-
- [(1)SCI 通信控制寄存器(SCICCR)](#(1)SCI 通信控制寄存器(SCICCR))
- [(2)SCI 控制寄存器 1(SCICTL1)](#(2)SCI 控制寄存器 1(SCICTL1))
- [(3)SCI 波特率设置寄存器(SCIHBAUD、SCILBAUD)](#(3)SCI 波特率设置寄存器(SCIHBAUD、SCILBAUD))
- [(4)SCI 控制寄存器 2(SCICTL2)](#(4)SCI 控制寄存器 2(SCICTL2))
- [(5)SCI 接收状态寄存器(SCIRXST)](#(5)SCI 接收状态寄存器(SCIRXST))
- (6)数据接收缓冲寄存器(SCIRXEMU、SCIRXBUF)
- (7)数据发送缓冲寄存器(SCITXBUF)
- [(8)SCI 发送 FIFO 寄存器(SCIFFTX)](#(8)SCI 发送 FIFO 寄存器(SCIFFTX))
- [(9)SCI 接收 FIFO 寄存器(SCIFFRX)](#(9)SCI 接收 FIFO 寄存器(SCIFFRX))
- [(10)SCI FIFO 控制寄存器(SCIFFCT)](#(10)SCI FIFO 控制寄存器(SCIFFCT))
- (11)优先级控制寄存器(SCIPRI)
- 四、SCI配置步骤
-
- [(1)使能 SCI 外设时钟及初始化对应](#(1)使能 SCI 外设时钟及初始化对应)
- [(2)SCI 工作方式及参数设置](#(2)SCI 工作方式及参数设置)
- [(3)SCI 发送字节函数](#(3)SCI 发送字节函数)
- [(4)SCI 接收字节函数](#(4)SCI 接收字节函数)
- 五、实验
一、SCI概述
1.简介
SCI(Serial Communication Interface)串行通信接口,接收和发送有各自独立的信号线,但不是同一个时钟,所以是进行串行异步通信接口,一般可以看作是 UART(通用异步收发器),经常和RS232 接口连接。
RS232是一种数据终端设备(DTE)与数据通信设备(DCE)之间的物理接口标准,其规定在 TXD 和 RXD 数据线上:逻辑 1 为-3~-15V 的电压,而逻辑 0 为 3 ~15V 的电压
通常 DSP 引脚输入/输出使用 TTL 电平,而 TTL 电平的 1 和 0 的特征电压分别是 2.4V 和 0.4V,适用于板内数据传输。TTL 电平与 RS232 电平之间要互相转换
2.28335的SCI资源
F28335的内部具有3个相同的SCI模块:SCIA、SCIB和SCIC。每个SCI模块都各有一个接收器和发送器,接收器用于实现数据的接收功能,发送器用于实现数据的发送功能。
SCI的接收器和发送器各自都具有一个16级深度的FIFO(类似缓冲队列)队列,它们还都有自己独立使能位和中断位,可以在半双工通信中进行独立操作,或者在全双工通信中同时进行操作。
以SCIA为例,如下图结构:

上图的名词解释如下表:
(1)SCI模块具有两个引脚:发送引脚SCITXD和接收引脚SCIRXD。SCITXD可以实现数据的发送,SCIRXD可以实现数据的接收。
(2)外部晶振通过F28335的PLL模块倍频之后产生了CPU的系统时钟SYSCLKOUT,然后SYSCLKOUT经过低速时钟预定标器之后输出低速外设时钟LSPCLK提供给SCI模块 。要保证SCI的正常运行,系统控制模块必须使能SCI时钟,只有使能了,LSPCLK才供给SCI,也就是在系统初始化函数中需要将外设时钟控制寄存器PCLKCR0的SCIAENCLK 位置1 。
(3)SCI模块具有4种错误检测标志,分别是极性错误(parity)、超时错误(overrun)、帧错误(framing)、间断(break)检测。
(4)SCI模块具有双缓冲接收和发送功能,接收缓冲寄存器为SCIRXBU F,发送缓冲寄存器SCITXBUF 。
(5)从图可以看到,SCI模块可以产生两个中断**:SCIRXINT和SCITXINT,即接收中断和发送中断**,具有独立的发送中断使能位和独立的接收中断使能位,故发生中断时可以用中断方式进入,也可以用查询方式
(6)SCIA模块具有13个寄存器,值得注意的是,SCI的这些寄存器都是8位的。当某个寄存器被访问时,数据位于低8位,高8位为0,因此,如果将数据写入高8位将是无效的
二、SCI工作原理
1.传输速率及时钟配置
SCI数据传输速率,就是指设备每秒所能发送的二进制数据的位数。
F28335的每个SCI模块都具有2个8位的数据传输速率寄存器,SCIHBAUD 为高8位和SCILBAUD 为低8位,通过编程,可以实现达到64K种不同的速率。
SCI模块通信的数据传输速率与数据传输速率选择寄存器之间的关系下
{ B R R = L S P C L K 波特率 ∗ 8 − 1 ( 0 < B R R < 65536 ) 波特率 = L S P C L K 16 ( B R R = 0 ) ) \left\{ \begin{aligned} BRR=\frac{LSPCLK}{波特率*8}-1(0<BRR<65536)\\ 波特率=\frac{LSPCLK}{16}(BRR=0)) \end{aligned} \right. ⎩ ⎨ ⎧BRR=波特率∗8LSPCLK−1(0<BRR<65536)波特率=16LSPCLK(BRR=0))
其中,BRR为SCI数据传输速率选择寄存器中的值,从十进制转换成十六进制后,其高8位赋值给SCIHBAUD,低8位赋值给 SCILBAUD。
LSPCLK为低速时钟信号,时钟结构如下:

如图,SCI需要通过LOSPCP寄存器分频,分频逻辑如下:
SCI时钟配置举例:
假设SYSCLKOUT为150MHz,将LOSPCP配置为4,则由上表即对SYSCLKOUT四分频,得到LSPCLK为37.5MHz,假设所需波特率为19200bps,由公式解的BRR为243.15即243,故此时需要将BRR的低位SCILBAUD赋值为0xF3,高位赋值为0,特别需要注意的是:
在进行串口通信的时候,双方设备都必须以相同的数据格式和数据传输速率进行通信
常见串口传输速率与BRR寄存器对应如下表:
2.SCI工作原理
(1)SCI发送/接收数据工作原理
如下图,左边为接收数据,右边为发送数据

a.接收数据:
(1)当其他处理器发出的数据到达SCIRXD引脚后,SCI开始检测数据的起始位。
(2)当SCIXD引脚检测到起始位,便开始将随后的数据逐位地移至RXSHF寄存器。
(3)如果SCI控制寄存器SCICTL1的位RXENA为1 ,也就是如果使能了SCI的接收操作,当RXSHF寄存器中的数据满后,便将这个8位的数据并行移入接收缓冲寄存器SCIRXBUF,接收缓冲寄存器就绪标志位RXRDY 被置位,表示已经接收了一个新的数据,等待CPU来读取,此时还会产生一个SCI的接收中断申请信号。
(4)CPU通过程序读取SCIRXBUF寄存器中的数据后,RXRDY标志位被自动清除。至此,完成了一个数据的读取。
(5)如果SCI控制寄存器SCICTL1的位RXENA为0,也就是如果没有使能SCI的接收操作,则从图15-3可以看到,当外部数据到达引脚SCIRXD时,数据还是会被逐位移入RXSHF寄存器,但是不会从RXSHF寄存器移入SCIRXBUF寄存器中。
(6)如果使能了SCI的FIFO功能,则RXSHF会将数据直接加载到RX FIFO队列中,CPU再从FIFO队列读取数据,这样减少了CPU的开销,提高了效率。
b.接收数据:
(1)CPU通过程序将数据写入SCITXBUF寄存器,这时候发送器不再为空,发送缓冲寄存器就绪标志位TXRDY被清除。
(2)如果使能了SCI的FIFO功能,发送移位寄存器TXSHF将直接从TX FIFO队列中获取需要发送的数据。
(3)SCI将数据从SCITXBUF发送到TXSHF寄存器,这时SCITXBUF寄存器为空,可以将下一个数据写入该寄存器了,发送缓冲寄存器就绪标志位TXRDY被置位,并发出发送中断请求信号。
(4)当数据移入发送移位寄存器 TXSHF后,如果SCI控制寄存器 SCICTL1的位TXENA为1,也就是如果使能了SCI的发送操作,则移位寄存器将数据逐位移到引脚TXRDY上。至此,完成一个数据的发送。
C.标志位作用过程:
当接收缓冲寄存器SCIRXBUF内有数据时,表示接收缓冲寄存器已经就绪,等待CPU来读取数据,其标志位RXRDY为高当CPU将数据从SCIRXBUF读取后,RXRDY被清除,变为低。
当发送缓冲寄存器为空时,表示发送缓冲寄存器就绪,等待CPU写入下一个需要发送的数据,其标志位TXRDY为高,当CPU将数据写入SCITXBUF后,TXRDY被清除,变为低
3.SCI的工作模式及FIFO队列
FIFO是一个小型的数据队列(Buffer),临时存储即将发送或刚刚接收到的串行数据。数据按照"先进先出"的顺序被处理,即最早进入缓冲区的数据会最先被取出
F28335的SCI可以工作在标准SCI模式,也可以工作在增强的FIFO模式。当DSP上电复位时,SCI模块工作在标准SCI模式,此时FIFO功能是被禁止的,相应地,和FIFO功能相关的寄存器SCIFFTX(FIFO发送寄存器)、SCIFFRX(FIFO接收寄存器) 和 SCIFFCT (FIFO控制寄存器)都是无效的。
通过将 SCI FIFO 发送寄存器 SCIFFTX 的位 SCIFFEN置1,使能FIFO模式。将SCIFFTX 的位SCIRST置1,可以在任何状态下复位FIFO模式,SCI FIFO将重新开始发送和接收数据。
(1)SCI的FIFO工作过程:
在标准 SCI模式下,发送只有发送缓冲器 SCITXBUF,接收也只有接收缓冲器SCIRXBUF。
在FIFO模式下,发送缓冲器和接收缓冲器都是两个16级的FIFO队列,发送FIFO队列的寄存器是8位宽,而接收FIFO队列的寄存器是10位宽。
以发送为例,在标准SCI模式下,8位的SCITXBUF作为发送FIFO和发送移位寄存器TXSHF间的缓冲
器,当移位寄存器的最后一位被移出后,SCITXBUF才从FIFO加载CPU写好的需要发送的数据;而在FIFO模式下,SCITXBUF将不被使用,发送移位寄存器TXSHF将直接从FIFO加载需要发送的数据,而且加载数据的速度是可编程的,可编程延时功能的好处在于可以协调和慢速设备之间的串行通信,其实现过程为:
通过SCI FIFO控制寄存器 SCIFFCT的位FFTXDLY[7:0] 可以确定TXSHF从FIFO加载数据的速度,就是隔多久加载一个数据。这种延时是以SCI模块数据传输速率的时钟周期为基本单元的,8位的FFTXDLY可以定义最小延时0个数据传输速率时钟周期到最大延时256个数据传输速率时钟周期。如果将延时设定为最小延时,也就是0个数据传输速率时钟周期,则SCI模块的FIFO加载数据没有延时,实现连续的发送数据。如果将延时设定为N个数据传输速率时钟周期,则SCI模块发送完一个数据后,TXSHF将隔N个数据传输速率时钟周期再从FIFO加载数据进行发送。
发送和接收 FIFO 都有 状态位 TXFFST 和 RXFFST 。
TXFFST位于寄存器SCIFFTX[12:8],共5位。RXFFST位于寄存器SCIFFRX[12:8],共5位。
这两个状态位的作用是 在任何时间可以标识FIFO队列中有用数据的个数。
当TXFFST被清零时,发送FIFO队列的复位位TXFIFO RESET也被清零,发送FIFO的指针复位为0,可以通过将 TXFIFO RESET置位来重新启动FIFO队列的发送操作。同样,当RXFFST被清零时,接收FIFO队列的复位位RXFIFO RESET也被清零,接收FIFO的指针复位为0,可以通过将RXFIFO RESET 置位来重新启动FIFO队列的接收操作。
4.SCI的数据帧格式及工作方式
(1)数据格式
可以通过SCI的通信控制寄存器SCICCR来进行设置,规定通信过程中所使用的数据格式。F28335的SCI模块使用的是NRZ数据格式,其包括了:
(1)1个起始位;
(2)1~8个数据位;
(3)1个奇/偶/非极性位;
(4)1~2个结束位;
(5)多处理器通信的地址位模式下,有1个用于区别数据或者地址的特殊位。
如下图,数据位有8位,将带有格式信息的每一个数据字符叫作一帧。

SCI的数据帧包括1个起始位、1~8个数据位、1个可选的奇偶校验位和1或2个结束位。每个数据位占用8个SCI的时钟周期SCICLK,也就是LSPCLK,如图:

SCI的接收器在收到一个起始位后开始工作,如果SCIRXD引脚检测到连续的4个SCICLK周期的低电平 ,SCI就认为接收到了一个有效的起始位,否就需要寻找新的起始位。
对于每个帧中起始位后面的数据位,CPU采用多数表决的机制来确定该位的值,具体的做法是:在每个数据位第4~第6个SCICLK周期进行采样,如果3次采样
中有2次以上的值相同,那么这个值就作为该数据位的值。
(2)工作方式
SCI在进行多处理器通信时,根据地址信息识别方法的不同,多处理器通信方式分为空闲线模式和地址位模式
A、地址位模式
当处理器A发出一连串数据信息时,将这串数据叫作数据块。数据块是由一个个帧构成的。
从图可以看到,某一个数据块中的第一帧是地址信息 ,接下去的帧是数据信息,然后,在一些空闲周期之后,又有一个数据块,块中的第一帧也是地址信息,后面帧是数据信息。在块内**,第一帧地址信息后面的一个位是1,代表此帧是地址信息**,
而第2帧数据信息后面的一个位是0,代表此帧是数据信息 。这个位就叫作地址位,用于表示某个帧的数据是地址信息还是数据信息。像这样在通信格式中加入专门的地址位来判断帧是数据信息还是地址信息的方式叫作多处理器通信的地址位模式。

B、空闲线模式
空闲线模式中,没有专门表示帧是数据或者地址的地址位。块与块之间有一段比较长的空闲周期,这段时间要明显长于块内帧与帧之间的空闲周期。
在某一个数据块中,第一帧代表地址信息,后面的帧代表数据信息。可见,在空闲线模式下,地址信息还是数据信息是通过帧与帧之间的空闲周期来判断的。当帧与帧之间的空闲周期超过10位的时候,就表示新的数据块开始了,而且块中的第一帧是地址信息
总结:
空闲线模式中数据格式里没有提供额外的地址位,在处理10字节以上的数据块时比地址位模式更为有效,被应用于典型的非多处理器SCI通信场合。地址位模式由于有专门的位来识别地址信息,所以数据块之间不需要空闲周期等待,所以这种模式在处理一些小的数据块的时候更为有效,当然,当传输数据的速度比较快,而程序执行速度不够快时,很容易块与块之间产生10位以上的空闲,这样其优势就不明显了。
5.SCI的中断
SCI有两种中断,分别是发送中断TXINT和接收中断RXINT,根据SCI工作的模式不同其中断也不同,中断逻辑如下图

(1)标准模式
如图,当SCIFFTX寄存器的SCIFFENA位为0时,也就是FIFO功能未被使能时,SCI工作于标准SCI模式。
接收中断:
对于接收操作,当RXSHF将接收到的数据写入SCIRXBUF,等待CPU来读取时,接收缓冲器就绪标志位RXRDY被置位,表示已经接收了一个数据,同时产生了一个接收中断RXINT的请求信号。如果SCI控制寄存器SCICTL2的使能位RX/BKINTENA为1,也就是接收中断已经使能,那么SCI将向PIE控制器提出中断请求。
出错中断:
当SCI接收出现错误(RX ERROR)时,或者当SCI接收出现间断(RX BREAK)时,都会产生接收中断RXINT的请求信号。
当极性错误(parity)、超时错误(overrun)、帧错误(framing)、间断(break)检测这4种错误检测标志位中任何一个标志位被置1时,SCI的接收错误标志RX ERROR就会被置1,同时产生一个接收中断RXINT的请求信号。如果SCI控制寄存器SCICTL1的位RXERR INT ENA为1,也就是接收中断已经使能,那么SCI将向PIE控制器提出中断请求。当SCI从丢失第一个结束位开始,如果SCIRXD引脚上连续的保持至少10位的低电平,则SCI认为接收产生了一次间断,此时SCI接收状态寄存器SCIRXST的位BRKDT被置位,即间断检测标志位被置位,同时产生一个接收中断RXINT的请求信号。如果SCI控制寄存器SCICTL2 的位RX/BKINTENA为1,也就是接收中断已经使能,那么SCI将向PIE控制器提出中断请求。
发送中断:
对于发送操作,当发送缓冲寄存器SCITXBUF将数据写入发送移位寄存器TXSHF后,SCITXBUF为空,发送缓冲器就绪标志位TXRDY被置位,表示CPU可以将下一个需要发送的数据写到SCITXBUF中,同时产生了一个发送中断TXINT的请求信号。如果SCI控制寄存器SCICTL2的位TXINTENA为1,也就是发送中断已经使能,那么SCI将向PIE控制器提出中断请求。
(2)FIFO模式
当SCIFFTX寄存器的SCIFFENA位为1时,也就是FIFO功能被使能时,SCI工作于增强的FIFO模式。
接收中断:
对于接收操作,前面已经介绍过,接收FIFO队列有状态位RXFFST,表示接收FIFO中有多少个接收到的数据 。同时,SCI FIFO接收寄存器SCIFFRX 还有一个可编程的中断级位RXFFIL。当RXFFST的值与预设好的RXFFIL相等时,接收FIFO就会产生接收中断RXINT信号,如果SCIFFRX寄存器的位RXFFIENA
为1,也就是FIFO接收中断已经使能,那么SCI将向PIE控制器提出中断请求。
举例:假设通过编程,将RXFFIL位设置为8,那么当FIFO队列中接收到8个数据时,RXFFST的值也为8,正好和RXFFIL的值相等,这时候接收FIFO就产生了接收中断匹配事件。
同工作于标准SCI模式类似,接收FIFO的接收中断RXINT也是复用的,当SCI接收
出现错误(RX ERROR)时,也会产生接收中断RXINT的请求信号。
发送中断:
对于发送操作,发送FIFO队列有状态位TXFFST,表示发送FIFO中有多少个数据需要发送。同时SCI FIFO发送寄存器SCIFFTX也有一个可编程的中断级位TXFFIL。当TXFFST的值与预设好的TXFFIL相等时,发送FIFO就会产生发送中断TXINT信号,如果SCIFFTX 寄存器的位TXFFIENA为1,也就是FIFO发送中断已经使能,那么SCI将向PIE控制器提出中断请求。
比如,假设通过编程,将TXFFIL位设置为8,那么当FIFO队列中还剩8个数据需要发送时,TXFFST的值也为8,正好和TXFFIL的值相等,这时候发送FIFO就产生了发送中断匹配事件。复位后,发送FIFO的中断触发级位TXFFIL默认的值为0x0000,即0,也就是说,FIFO队列中数据全部发送完毕后产生发送中断请求。
中断相关位总结
三、SCI相关寄存器

SCI寄存器如上表,下面对每个位作用概括
(1)SCI 通信控制寄存器(SCICCR)

(2)SCI 控制寄存器 1(SCICTL1)



(3)SCI 波特率设置寄存器(SCIHBAUD、SCILBAUD)
具体的配置操作在第二章第一节已给出

(4)SCI 控制寄存器 2(SCICTL2)

(5)SCI 接收状态寄存器(SCIRXST)


(6)数据接收缓冲寄存器(SCIRXEMU、SCIRXBUF)
接收到的数据从 RXSHF 传送到 SCIRXEMU 和 SCIRXBUF。传送完成以后 RXRDY位置位,表明接收的数据已被读取。
两个寄存器的数值完全一样,它们有各自独立的地址,但是共用一个物理存储空间。他们唯一的区别就是,读取 SCIRXEMU的数据不会清除 RXRDY 位,而读取 SCIRXBUF 会清除 RXRDY 位。因此一般读取 SCI接收的数据都是读取 SCIRXBUF 寄存器。SCIRXEMU 寄存器主要用于仿真时,因为
它可以不清除 RXRDY 标志位而不断读取接收到的数据。在系统复位时 SCIRXEMU被清空。

(7)数据发送缓冲寄存器(SCITXBUF)
需要发送的数据将被写入该寄存器,数据使用右对齐方式。要发送的数据从该寄存器中传送到 TXSHF 移位发送寄存器后 TXRDY 置位,表明该寄存器可以写入下一个需要发送的数据。若 TX INT ENA 置位,数据发送可以触发中断

(8)SCI 发送 FIFO 寄存器(SCIFFTX)

(9)SCI 接收 FIFO 寄存器(SCIFFRX)


(10)SCI FIFO 控制寄存器(SCIFFCT)

(11)优先级控制寄存器(SCIPRI)

四、SCI配置步骤
(1)使能 SCI 外设时钟及初始化对应
时钟:
c
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A
EDIS;
GPIO配置:
这部分官方的函数已经封装好了,直接调用就行,也可以自己配置,如下:
c
void InitSciaGpio()
{
EALLOW;
/* Enable internal pull-up for the selected pins */
// Pull-ups can be enabled or disabled disabled by the user.
// This will enable the pullups for the specified pins.
GpioCtrlRegs.GPBPUD.bit.GPIO36 = 0; // Enable pull-up for GPIO36 (SCIRXDA)
GpioCtrlRegs.GPBPUD.bit.GPIO35 = 0; // Enable pull-up for GPIO35 (SCITXDA)
/* Set qualification for selected pins to asynch only */
// Inputs are synchronized to SYSCLKOUT by default.
// This will select asynch (no qualification) for the selected pins.
GpioCtrlRegs.GPBQSEL1.bit.GPIO36 = 3; // Asynch input GPIO28 (SCIRXDA)
/* Configure SCI-A pins using GPIO regs*/
// This specifies which of the possible GPIO pins will be SCI functional pins.
GpioCtrlRegs.GPBMUX1.bit.GPIO36 = 1; // Configure GPIO36 for SCIRXDA operation
GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 1; // Configure GPIO35 for SCITXDA operation
EDIS;
}
(2)SCI 工作方式及参数设置
包括数据格式、波特率、使能发送、接收功能等
c
//Initalize the SCI FIFO
SciaRegs.SCIFFTX.all=0xE040;//连续发送、FIFO使能、重新使能发送FIFO、发送FIFO为空
SciaRegs.SCIFFRX.all=0x204f;
SciaRegs.SCIFFCT.all=0x0;
// Note: Clocks were turned on to the SCIA peripheral
// in the InitSysCtrl() function
SciaRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
// No parity,8 char bits,
// async mode, idle-line protocol
SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
// Disable RX ERR, SLEEP, TXWAKE
SciaRegs.SCICTL2.all =0x0003;
SciaRegs.SCICTL2.bit.TXINTENA =1;
SciaRegs.SCICTL2.bit.RXBKINTENA =1;
SciaRegs.SCIHBAUD =scihbaud; // baud set @LSPCLK = 37.5MHz.
SciaRegs.SCILBAUD =scilbaud;
// SciaRegs.SCICCR.bit.LOOPBKENA =1; // Enable loop back
SciaRegs.SCICTL1.all =0x0023; // Relinquish SCI from Res
(3)SCI 发送字节函数
c
void UARTa_SendByte(int a)
{
while (SciaRegs.SCIFFTX.bit.TXFFST != 0);
SciaRegs.SCITXBUF=a;
}
void UARTa_SendString(char *msg)
{
int i=0;
while(msg[i] != '\0')
{
UARTa_SendByte(msg[i]);
i++;
}
}
(4)SCI 接收字节函数
c
while(SciaRegs.SCIFFRX.bit.RXFFST !=1);// wait for XRDY =1
ReceivedChar = SciaRegs.SCIRXBUF.all;
五、实验
实现效果:由PC用串口助手向DSP发送一个8位数,DSP接收到后再发送回来
初始化:
c
#include "SCI.h"
#include "DSP2833x_Sci.h"
void SCI_Init(void)
{
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A
EDIS;
InitSciaGpio();
//FIFO配置
SciaRegs.SCIFFTX.all=0xE040;//连续发送、FIFO使能、重新使能发送FIFO、发送FIFO为空
SciaRegs.SCIFFRX.all=0x204F;//FIFO接收寄存器配置
SciaRegs.SCIFFCT.all=0x0;//FIFO控制寄存器
//SCI通信控制寄存器
SciaRegs.SCICCR.all =0x0007; //1停止位、无奇偶校验、无自测、空闲线模式、8位数据
//SCI控制寄存器
SciaRegs.SCICTL1.all =0x0003; //发送中断/缓冲寄存器使能
SciaRegs.SCICTL2.all =0x0003;//接收中断/缓冲寄存器使能
SciaRegs.SCIHBAUD =0x01; // baud set @LSPCLK = 37.5MHz.
SciaRegs.SCILBAUD =0xE7;
SciaRegs.SCICTL1.bit.SWRESET = 1; // 最后使能SCI
}
void UARTa_SendByte(int a)
{
while (SciaRegs.SCIFFTX.bit.TXFFST != 0);
SciaRegs.SCITXBUF=a;
}
void UARTa_SendString(char *msg)
{
int i=0;
while(msg[i] != '\0')
{
UARTa_SendByte(msg[i]);
i++;
}
}
主函数:
c
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include "LED.h"
#include "SCI.h"
#include "LED.h"
void main()
{
Uint16 ReceivedChar;
char *msg;
InitSysCtrl();
SCI_Init();
InitPieCtrl();
IER=0x0000;
IFR=0x0000;
InitPieVectTable();
msg = "Hello World!\r\n";
UARTa_SendString(msg);
while(1)
{
while(SciaRegs.SCIFFRX.bit.RXFFST !=1);// wait for XRDY =1
ReceivedChar = SciaRegs.SCIRXBUF.all;
msg = "You send number is: ";
UARTa_SendString(msg);
UARTa_SendByte(ReceivedChar);
UARTa_SendString("\r\n");
}
}