F28335的SCI模块

F28335的SCI模块

标签: DSP


TMS320F28335内部有三个SCI模块,SCIA、SCIB、SCIC

外部只有两个输入输出引脚TXD、RXD:

  • SCIA对应GPIO28/29和GPIO35/36两组可选;
  • SCIB有四组管脚可以选择,分别是 O9/11,GPIO14/15,GPIO18/19,GPIO22/23;
  • SCIC对应的是GPIO62/63。

SCI模块主要寄存器

SCICCR 通信控制寄存器
SCICTL 控制寄存器 发送空标志位、接收和发送中断使能
SCIRXST 接收状态寄存器 接收数据的错误标志位、就绪标志位、接收被间断、帧格式错误标志位
SCIRXD sci异步接收引脚
SCITXD sci异步发送引脚
SCIHBAD/SCILBAUD 波特率发生器 由LSPCLK预分频时钟输入
TXINT 发送中断信号
RXINT 接收中断信号

SCITXBUF 发送缓冲器,存放要发送的数据,字符从SCITXBUF装载到TXSHF中会将RXRDY置位,表明SCITXBUF可接收 新的字符
TXRDY 发送器缓冲寄存器就绪标志位系统复位和软件复位可将此位置1.发送器(scitxbuf)为空时该位为1,写发送器该位变 低

TXSHF 发送移位寄存器,从SCITXBUF中接收数据,并通过SCITXD引脚发送出去
RXSHF 接收移位寄存器,从SCIRXD引 脚接收数据
SCIRXBUF 接收缓冲器,供CPU读取,外部输入首先载入到RXSHF中,然后装载到SCIRXBUF和SCIRXXEMU寄存器中。
SCIRXEMU 仿真缓冲寄存器

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

RXRDY 接收器就绪标志位 读SCIRXBUF寄存器、软件复位、系统复位都可将该位清零。
SCIFFRX FIFO接收寄存器
SCIFFTX FIFIO发送寄存器
SCIFFCT FIFO控制寄存器
SCIPRI 优先权控制寄存器

数据格式

通过对SCICCR通信控制寄存器进行配置,可选择不同的帧结构

典型数据帧格式
1位起始位
1-8位数据位(LSB低位先行)
1个奇/偶校验位
1位或2位停止位

通信格式

既可以使用单线(半双工)也可以使用双线(全双工)通信
接收器在接收到一个有效的起始位后开始工作,一个有效的起始位由持续时间多于4个 SCICLK周期的低电平信号标明。

SCI数据流

1.一个发送器(TX)的相关寄存器:发送数据缓冲寄存器(SCITXBUF)和发送移位寄存器(TXSHF)
数据流向为:发送数据–>SCITXBUF–>TXSHF—>SCITXD发送出去;
2.一个接收器(RX)的相关寄存器:接收数据缓冲寄存器(SCIRXBUF)和接收移位寄存器(RXSHF)
数据流向为:接收数据—>SCIRXD–>RXSHF–>SCITXBUF存取缓冲器;
接收数据直接通过接收数据缓冲器的变量即可。

以上的数据流都是在非FIFO模式下的,FIFO模式简单来说是设置了一个缓冲机制,设置一个数据的缓冲深度,当发送或接受数据存到设置的深度时,再进行发送或接收。

信号接收时序

1-RXENA使能,接收数据;
2- 数据到SCIRXD,检测起始位;
3-数据从移位寄存器RXSHF到缓冲寄存器SCIRXBUF,产生中断申请,RXRDY变高(1),已接收到一个新字符;
4-程序读缓冲寄存器,RXRDY=0;
5-下一次字节到达SCIRXD,检测启动位,清除;
6-RXENA变为低(0);
继续向移位寄存器转载数据,但不移入缓冲寄存器。
以上是中断接收,我们一般都是用中断接收,中断直接获取缓冲寄存器的中的数据即可;而查询接收则是通过查询RXRDY标志位来进行接收,为高则接收到新字符,读之后为0.

信号的发送时序

1-TXENA使能,发送数据,初始时缓冲寄存器SCITXBUF为空,TXRDY为高(1),TX EMPTY为高(1);
2-写数据到缓冲寄存器,不为空,TXRDY为低(0),EMPTY为低(0);
3-发送数据到移位寄存器TXSHF,缓冲寄存器为空,准备传送第二个字符到缓冲寄存器,3-TXRDY为高(1),中断请求;
4-TXRDY为高(1)时,程序写第二个字符到缓冲寄存器,这时SCITXD开始发送第一个字符;写入缓冲寄存器后,TXRDY为低(0);
5-发送完第一个字符,开始将第二个字符移入移位寄存器,移完5-TXRDY为高(1),开始发送第二个字符;
6-TXENA位变低,禁止发送数据,,结束当前字符的发送;
7-第二个字符发送完成,缓冲寄存器为空,准备发送下一个字符。
以上为中断发送,一般我们发送可以直接赋值给缓冲寄存器SCITXBUF即可。

transmitter由发送缓冲区和发送移位寄存器构成。我们要发送信息时,首先将信息进行编码(一般用ASCII码)成二进制流,然后将一帧数据(一般是8位)写入发送缓冲区(从这里以后程序就不用管了,剩下的发送部分由硬件自动完成),最后发送移位寄存器会自动从发送缓冲区中读取一帧数据,然后自动移位(移位的目的是将一帧数据的各个位分别拿出来)将其发送到Tx通信线上。

receiver由接收缓冲区和接收移位寄存器构成。当有人通过串口线向我发送信息时,信息通过Rx通信线进入我的接收移位寄存器中,然后接收移位寄存器自动移位并将该二进制位保存入我的接收缓冲区,接收完一帧数据后receiver会产生一个中断给CPU,CPU收到中断后即可知道receiver接收满了一帧数据,就会来读取这帧数据。
发送缓冲区和接收缓冲区是关键,发送移位寄存器和接收移位寄存器的工作都是自动的,不用编程控制的,所以我们写串口代码就是:首先初始化串口控制器(包括发送控制器和接收控制器),然后要发送信息时直接写入发送缓冲区,要接收信息时直接去接收缓冲区中读取即可。 软件工程师对串口操作的接口就是发送/接收缓冲区(实际就是寄存器,操作方式就是读写内存)。

SCI波特率计算

SCI内部串行时钟信号由低速外设时钟信号LSPCLK及波特率选择寄存器共同决定,SCI通过波特率选择寄存器中的16位值可以选择多达64k种不同的波特率。

BRR = SCIHBAUD + SCILBAUD

如果1<= BRR <=65535,那么SCI波特率=LSPCLK / ( (BRR+1) * 8 ),由此,可以带入你需要的波特率,既可以得到BRR的值;

如果BRR = 0,那么SCI波特率=LSPCLK/ 16

FIFO模式

FIFO模式及其作用

典型的串口设计,发送/接收缓冲区只有1字节,每次发送/接收只能处理1帧数据。这样在单片机中没什么问题,但是到复杂SOC中(一般有操作系统的)就会有问题,会导致效率低下,因为CPU需要不断切换上下文。

解决方案就是想办法扩展串口控制器的发送/接收缓冲区,譬如将发送/接收缓冲区设置为64字节,CPU一次过来直接给发送缓冲区64字节的待发送数据,然后transmitter慢慢发送,发送完再找CPU再要64字节数据。但是串口控制器本来的发送/接收缓冲区是固定的1字节大小的,所有做了个变相的扩展,就是FIFO。CPU先将64字节的数据放到FIFO中,然后启动FIFO模式,FIFO每次会自动往发送缓冲区中添加1字节数据,最后进行移位操作传输数据。

FIFO,就是first in first out,先进先出。FIFO其实是一种数据结构,这里这个大的缓冲区叫FIFO是因为这个缓冲区的工作方式类似于FIFO这种数据结构。

接收器与发送器是具有16级深度的FIFO。
如果使能了SCI的FIFO功能,则RXSHF会将数据直接加载到RX FIFO队列中,CPU再从FIFO队列中读取数据。同理,如果使能了SCI的FIFO功能,则TXSHF将直接从TX FIFO队列中获取需要发送的数据。

  • SCI FIFO发送流程
    将内存数据放置发送缓存当中
    ScibRegs.SCITXBUF=’A’;

    发送缓存中的数据自动存到FIFO当中
    ScibRegs.SCITXBUF中的数据会放入到发送FIFO中,最多16字节数据如果连续发送的字节数量大于16需要等待,否则发送的数据将会被覆盖

    发送FIFO将数据转到发送移位寄存器TXSHF当中
    FIFO会自动将数据发送到移位寄存器TXSHF中最终到TXD引脚

  • SCI FIFO接收流程
    数据到达RXD引脚之后,检测启动位
    TXSHF移位到接收FIFO当中
    当FIFO接收字节数量等于设置的接收FIFO深度ScibRegs.SCIFFRX.bit.RXFFIL = 8时产生一个中断

如果使能了接收中断将会产生一个中断

串口通信与中断的关系

SCI的中断

SCI模块可以产生两个中断:接收中断SCIRXINT,发送中断SCITXINT
接收器和发送器都可通过中断控制,接收器和发送器具有独立的中断使能位,当中断禁止时,中断标志位仍然正常反映中断事件,但发送中断请求。接收器相比于发送器具有更高的优先级。

串口通信分为发送/接收两部分,发送一般不需要中断即可完成发送,接收一般需要使用中断来接收。

发送方可以选择使用中断,也可以选择不使用中断。使用中断的工作情景是:发送方先设置好中断并绑定一个中断处理程序,然后发送方丢一帧数据给transmitter,transmitter耗费一段时间来发送这一帧数据,这段时间内发送方CPU可以去做别的事情,等transmitter发送完成后会产生一个TXD中断,该中断会导致事先绑定的中断处理程序执行,在中断处理程序中CPU会切换回来继续给transmitter放一帧数据,然后CPU切换离开;不使用中断的工作情景是:发送方事先禁止TXD中断(当然也不需要给相应的中断处理程序了),发送方CPU给一帧数据到transmitter,然后transmitter耗费一段时间来发送这帧数据,这段时间CPU在这等着(CPU没有切换去做别的事情),待发送方发送完成后CPU再给它一帧数据继续发送直到所有数据发完。CPU是怎么知道transmitter已经发送完了?原来是有个状态寄存器,状态寄存器中有一个位叫发送缓冲区空标志,transmitter发送完成(发送缓冲区空了)就会给这个标志位置1,CPU就是通过不断查询这个标志位为1还是0来知道发送是否已经完成的。

接收方可以选择使用中断,也可以选择不使用中断。使用中断的工作情景是:接收方先设置好中断并绑定一个中断处理程序,然后接收方会耗费一段时间从receiver中来接收一帧数据,这段时间内接收方CPU可以去做别的事情,等receiver接收数据完成后会产生一个RXD中断,该中断会导致事先绑定的中断处理程序执行,在中断处理程序中CPU会切换回来从receiver中读取数据,然后CPU切换离开;不使用中断的工作情景是:接收方事先禁止RXD中断(当然也不需要给相应的中断处理程序了),接收方会耗费一段时间从receiver中接收一帧数据,这段时间CPU在这等着(CPU没有切换去做别的事情),待接收方接收完成后CPU会继续等着直到所有数据接收完。CPU是怎么知道receiver已经接收完了?原来是有个状态寄存器,状态寄存器中有一个位叫接收缓冲区满标志,receiver接收完成(接收缓冲区满了)就会给这个标志位置1,CPU就是通过不断查询这个标志位为1还是0来知道接收是否已经完成的。

因为串口通信是异步的,异步的意思就是说发送方占主导权。也就是说发送方随时想发就能发,但是接收方只有时刻等待才不会丢失数据。所以这个差异就导致发送方可以不用中断,而接收方不得不使用中断模式

SCI串口编程例程

  • A.先初始化IO管脚 (以SCI-A为例,SCI-B、SCI-C的初始化方法一样,就是照着改对应的管脚就行)
//要使用SCI 外设则需开启相应时钟
EALLOW;
SysCtrlRegs.PCLKCR0.bit.SCIAENCLK = 1; // SCI-A
EDIS;
//开启SCI 时钟后,根据自己需求,使用哪个SCI 口就初始化对应的GPIO

void InitSciaGpio()    //初始化SCIA的GPIO管脚为例子
    {
   
       EALLOW;
    //根据硬件设计决定采用GPIO28/29和GPIO35/36中的哪一组。这里以35/36为例
    //定义管脚为上拉
    GpioCtrlRegs.GPBPUD.bit.GPIO36 
  • 12
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值