SCI模块

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

SCI模块
SCI即一种通用异步通信接口UART,SCI采用异步通信方式,只需要发送和接收两根线,通信双方微处理器使用各自的时钟,适用于对另外的设备长距离的低速率通信。

在DSP中,SCI就是UART 通信。

一位一位的按顺序传送带通信方式。

F28335处理器共提供了3个SCI接口,在原有功能基础上增加了通信速率自动检测和FIFO缓冲等新功能,为了减少串口通信时CPU的开销,F28335的串口支持16级接收和发送FIFO。

SCI的接收器和发送器可以使用双级缓冲传送数据,并且SCI接收器和发送器有各自独立的中断和使能位。

为了保证数据的完整,SCI模块对接收到的数据进行间断,极性,超限和帧错误的检测。

SCI采用硬件对通信数据进行极性和数据格式检查,通过对16位的波特率控制寄存器进行编程,可以配置不同的SCI通信速率。

SCI的数据格式:
ADD DAIA:仅在地址模式下使用。

作为区分数据和地址的附加位。

可以使用SCI通信控制寄存器(SCICCR)配置SCI通信采用的数据格式。

因为接收器使用帧同步,外部发送和接收器不需要使用串行同步时钟,时钟由器件本身提供。

SCI接收器的缓冲器有SCIRXBUF和SCIRXEMU两个。

这两个寄存器的内容相同,读SCIRXEMU寄存器不会对RXRDY清零,而读SCIRXBUF寄存器将对RXRDY清零。

1.普通模式信号接收。

●标志位RXENA(SCICTL1,位0)变高,使能接收器接收数据。

●数据到达SCIRXD引脚后,检测起始位。

●数据从RXSHF寄存器移位到接收缓冲器(SCIRXBUF),产生
一个中断申请,标志位RXRDY(SCIRXST,位6)变高表示已
接收一个新字符。

●程序读SCIRXBUF寄存器,标志位RXRDY自动被清除。

●数据的下一个字节达到SCIRXD引脚时检测启动位,然后清除。

●位RXENA变低,禁止接收器接收数据。

继续向RXSHF转载
数据,但不移入到接收缓冲寄存器。

2.普通模式发送信号
●TXENA(SCICTL1,位1)置位,使能发送器工作;
●写SCITXBUF寄存器,从而发送器不再为空,TXRDY变低;
●发送器将数据装载到TXSHF中,此时TXRDY为高,发送器
可接收第二个字节,并触发中断;
●在TXRDY变高后,向SCITXBUF写入第二个字节,TXRDY
将重新变低;
●发送器完成第一帧数据的发送,SCITXBUF中第二个字节被装
载到TXSHF中;
●TXENA置低,禁止发送器工作;
●第二帧数据发送完毕。

SCI FIFO功能
所谓的FIFO就是先进先出的意思。

SCI工作在FIFO模式下一般是因为所传输的信息并不是以一个帧为单位,而是以多个帧组成的一个包为信息单位的。

在中断中,你读FIFO接收寄存器读到的数据是首先接收到的数据,再读一次的话读到的是接收到的第二个数据。

而16深度的话就是最多能保存最近的16个接收数据,如果接收数据超过16个的话会产生相应的溢出。

普通模式发送数据即以查询等待的方式在发送一个字节的过程中会占用一个周期中的1ms时间(这是波特率为9600bps时候的情况),要等待一个字节完全的发送出去才能够进行其它模块的工作,这样的话是非常耗用时间和DSP的资源利用率的,而且其它模块的时间根本得不到保证。

而FIFO模式中发送数据的方式则基本不占用系统的周期等待时间,直接往Buf里面写数据就会自动的往外发送。

使用FIFO可以一次性写入多个数据,如果使用16级,要是发送160个数据只需要发送10次就可以发送完成。

对于FIFO堆栈深度的设定只影响中断产生事件的频率。

FIFO深度是指有多少数据存入到FIFO中时会产生中断请求事件,FIFO的深度设定时当然要大于所定义的数据格式的位数,数据位数一定的情况下,深度越大所发生的中断请求频率越低。

FIFO队列接收有一个缺点就是,接收的数据包格式的帧数不能改变,如果是5个字节就必须都是5个字节。

如果一会是5个字节,一会是3个字节。

那3个字节的数据包会和下一个数据包的前两个字节产生一次中断,由于不同数据包的信息不同这样软件不易处理。

空闲线方式多处理器通信---块与块之间有一段比较长的空闲时间,这段时间要明显长于快内帧与帧之间的空闲时间,在某一个数据块中,第一帧代表地址信息,后面的帧为数据信息。

也就是说,地址信息还是数据信息是通过帧与帧之间的空闲间隔来判断的。

当帧与帧之间的空闲间隔超过10个位的时候,就表示新的数据块开始,而且其第一帧为地址信息。

空闲线模式中数据格式里没有额外的地址位。

SCI FIFO中断标志和使能逻辑位
程序:
1.初始化程序:
void InitSci(Uint16 num,Uint16 bps)
{
volatile struct SCI_REGS *Scireg; //定义结构体变量
Uint16 BRR_val;
Uint16 data=0;
if(num==0) Scireg=&ScibRegs; //设置num变量来确定使用哪个SCI模块
else Scireg=&ScicRegs;
Scireg->SCICCR.all =0x0007; 字节长度为8位,选择空闲线模式。

屏蔽自测模式
Scireg->SCICTL1.all =0x0003; 接收使能,发送使能
//RxErrInt:SCI接收中断使能位;非SLEEP;TXW AKE:1:发送模式唤醒,空闲线模式或地址位模式0:不唤醒,在空闲线模式下,向该位写1然后写数据到SCITXBUF产生一个11位数据长度的空闲时间。

BRR_val = (37500000/bps/8)-1;
//设置波特率BRR=(LSPCLK/SCI异步波特率/8)-1;
Scireg->SCIHBAUD =(BRR_val>>8);
Scireg->SCILBAUD =(BRR_val);
Scireg->SCICTL2.all =0x0003; //使能RXRDY/BRKDT中断,使能TXRDY中断;
Scireg->SCICTL2.bit.RXBKINTENA=1; //接收缓冲/抑制中断使能Scireg->SCICTL2.bit.TXINTENA =0; //屏蔽TXRDY中断
Scireg->SCICTL1.all =0x0023; 0010 0011
//接收使能,发送使能,非睡眠状态,软件复位无效
while(Scireg->SCIRXST.bit.RXRDY == 1)
//SCI接收就绪标志位1:新数据可读,0:没有新数据可读data = Scireg->SCIRXBUF.all;
//数据接收缓冲寄存器赋值给data;
}
2.发送数据程序
void UartSndByte(Uint16 num,Uint16 data) //单字节查询发送{
if(num==0) //num用来判断哪个SCI模块使能
{
while(ScibRegs.SCICTL2.bit.TXRDY==0);
//等待发送缓冲寄存器准备就绪
ScibRegs.SCITXBUF=data;
while(ScibRegs.SCICTL2.bit.TXRDY==0);
}
else if(num==1)
{
while(ScicRegs.SCICTL2.bit.TXRDY==0);
ScicRegs.SCITXBUF=data;
while(ScicRegs.SCICTL2.bit.TXRDY==0);
}
}
3.接收数据程序
Uint16 UartRcvByte(Uint16 num) //单字节查询接收
{
Uint16 data=0;
if(num==0) //num用来判断哪个SCI模块使能
{
while(ScibRegs.SCIRXST.bit.RXRDY != 1);//等待接收缓冲寄存器准备就绪
data = ScibRegs.SCIRXBUF.all;
}
else if(num==1)
{
while(ScicRegs.SCIRXST.bit.RXRDY != 1);
data = ScicRegs.SCIRXBUF.all;
}
return data;
}。

相关文档
最新文档