DSP TMF320F2803x 串行通信接口SCI

一、概述

        SCI 是两线异步串行端口,通常称为 UART。 SCI 模块支持 CPU 与其他使用标准非归零(NRZ)格式的异步外围设备之间的数字通信。 SCI 接收器和发送器均具有 4 级深度 FIFO,以减少服务开销,并且各自具有自己的独立使能和中断位。 两者都可以独立运行以进行半双工通信,也可以同时运行以进行全双工通信。

        为了确保数据完整性, SCI 在中断检测、 奇偶校验、 超载、 和组帧错误方面对接收到的数据进行检查。可通过 16 位波特选择寄存器将位速率编程为不同的速度。

内部框图:

SCI 引脚:

  • SCITXD    --- SCI发送引脚(GPIO12)
  • SCIRXD    --- SCI接收引脚(GPIO7)

波特率可编程:

                          

#if (CPU_FRQ_150MHZ)

    //LSPCLK=CPU_FRQ_150MHZ/4=37.5MHZ
    //37.5M/(9600*8)=488
    //488-1=487=0x1E7
    ScicRegs.SCIHBAUD    =0x0001; // 9600baud

    ScicRegs.SCILBAUD    =0x00E7;

    #endif

    #if (CPU_FRQ_60MHZ)
    /LSPCLK=CPU_FRQ_60MHZ/4=15MHZ
    //15M/(9600*8)=195
    //195-1=194=0x1E7
    ScicRegs.SCIHBAUD    =0x0000; //9600 baud 

    ScicRegs.SCILBAUD    =0x00C3;

    #endif

增强型特性:

  • 自动波特率检测硬件逻辑电路;
  • 4 级发送/接收 FIFO;

 二、结构

                                                 SCI模块方框图

SCI 可编程数据格式: (标准数据贴格式8位,带地址位模式9位)

 使用 通信控制寄存器 SCICCR 编程数据格式:

 三、SCI 多机通信 

       多机通信格式允许一个处理器将数据块有效地发送到同一串行链路上的其他处理器。 在一条串行线上,一次只能进行一次传输。 换句话说,一次串行线路上只能有一个 Talker,即一次只有一个节点发送数据。

       发送节点(Talker) 发送的数据帧中第一个字节是一个地址字节(9位),该地址字节被所有接收节点(Listener)读取。 只有接收数据的地址字节与接收节点的地址字节相符时,才能中断接收节点。如果接收节点的地址和接收的地址不符合,接收节点将不会被中断,等待接收下一个地址字节。

        处理器根据使用的多处理器模式(空闲线模式或地址位模式),采用不同的方式识别地址字节。 例如:

  • 空闲线模式在地址字节预留一个静态空间, 此模式没有额外的地址/数据位,并且此模式在处理包含 10 个以上字节的数据块传输方面比地址位模式效率高。空闲线模式一般用于非处理器的 SCI 通信。
  • 地址位模式在每个字节中增加了一个额外的位(即地址位)以区分地址和数据。 此模式在处理许多小数据块时效率更高,因为与空闲模式不同,它不必在数据块之间等待。 但是,在高速传输速度下,程序速度不够快,无法避免传输流中的 10 位空闲。
     

通过 ADDR / IDLE MODE 位(SCICCR,位3)可以通过软件选择多处理器模式。 两种模式都使用 TXWAKE 标志位(SCICTL1,位3),RXWAKE 标志位(SCIRXST,位1)和 SLEEP 标志位(SCICTL1,位2)来控制这些模式的 SCI 发送器和接收器功能。


在两种多处理器模式中,接收步骤如下:

  • 收到地址块后,SCI端口将唤醒并请求中断(必须使能 SCICTL2 的位 1 RX / BK INT ENA 位才能请求中断)。 它读取该块的第一帧,其中包含目的处理器的地址。
  • 通过中断检测接收的地址启动软件例程,然后比较存储在内存中的器件地址字节和接收到数据的地址字节。
  • 如果检查表明该块已寻址到设备CPU,则CPU清除SLEEP位并读取其余块。 如果不是,软件例程将退出,并且SLEEP位仍然置1,并且直到下一个块开始才接收中断。
     

四、空闲线多处理器模式

4.1 操作步骤:

  • 接收到块起始信号后,SCI 被唤醒;
  • 处理器识别下一个 SCI 中断;
  • 中断服务子程序将收到的地址与接收节点的地址进行比较。
  • 如果 CPU 的地址与接收到的地址相符,则中断服务子程序清除 SLEEP 位,并接收块中剩余的数据;
  • 如果 CPU 的地址与接收到的地址不符,则 SLEEP 位仍保持在置位状态,直到检测到下一个数据块的开始,否则 CPU 都不会被 SCI 端口中断,继续执行主程序。
     

 

4.2 有两种方式来发送块起始信号:

  • 法1:特意在前后两个数据块之间增加 10 位或更多的空闲时间
  • 法2:在写入 SCITXBUF 寄存器之前,SCI 端口首先将 TXWAKE 位(SCICTL1,位3)设置为 1。 这将自动发送 11 位的空闲时间。 在这种方法中,除非必要,串行通信线路不会空闲。 (在设置TXWAKE之后发送地址之前,要向 SCITXBUF 写入一个无关的数据,以保证能够发送空闲时间。)
     

 4.3 发送块开始信号

在块传送过程中需要采用下列步骤发送块起始信号:

  • 写 1 到 TXWAKE;
  • 写一个数据字(内容不重要)到 SCITXBUF 寄存器(发送数据缓冲寄存器)来发送一个块起始信号。(当快起始信号被发送时,写入的数据字被禁止,且在块起始信号发送后被忽略)。当 TXSFH(发送移位寄存器)再次空闲时,SCITXBUF 寄存器中的内容被转移到 TXSHF,TXWAKE 的值被转移到 WUT,然后 TXWAKE 位被清除。由于 TXWAKE 置 1,在前一帧发送完停止位后,起始位、数据位和奇偶校验位被发送的 11 位空闲位取代。
  • 写入一个新地址到 SCITXBUF 寄存器。在传送开始信号时,必须先将一个无关的数据写入 SCITXBUF 寄存器,从而使 TXWAKE 位的值能被转移到 WUT 中。由于 TXSHF 和 WUT 都是双缓冲,在无关数据字被转移到 TXSHT 寄存器后,才能再次将数据写入 SCITXBUF。
     

 4.4 接收操作

收器的操作和 SLEEP 位无关,然而在检测到一个地址帧之前,接收器并不对 RXRDY 位和错误状态位置位,也不申请接收中断。

五、 地址位多处理器模式

 

在地址位协议(ADDR/IDLE MODE位= 1)中,所有帧的最后一个数据位后具有一个额外的位,称为地址位,用以区分地址帧和数据帧。 地址位在该块的第一帧中设置为1,在所有其他帧中设置为0。地址位多处理器模式的数据传输和数据块之间的空闲周期无关。

5.1 发送一个地址

TXWAKE 位的值被放在地址位。在发送过程中,当 SCITXBUF 寄存器和 TXWAKE 分别转载到 TXSHF 寄存器和 WUT 中时, TXWAKE 位清 0,且 WUT 的值位当前帧的地址位的值。因此,发送一个地址需要完成如下操作:

  • TXWAKE 置 1,且将合适的地址值写入 SCITXBUF 寄存器。当该地址值被转移到 TXSHT 寄存器后又被移出时,它的地址位被作为 1 发送。这样串行总线上其他处理器就读取这个地址
  • 当 TXSHT 和 WUT 加载后,向 SCITXBUF 和 TXWAKE 写入新值(由于 TXSHT 和 WUT 是双缓冲,所以能被立即写入)
  • TXWAKE 位保持 0,发送块中无地址的数据帧。

一般情况下,地址位格式应用于 11 个或更少字节的数据帧传输。这种格式在所有发送的数据字节中增加了 1 位(1 代表地址帧,0 代表数据帧);通常 12 个或更多字节的数据帧传输使用空闲线格式。


六、示例程

//SCI通信 初始化IO
GpioCtrlRegs.GPAMUX1.bit.GPIO7 = 2; // GPIO12<-> SCI_TX
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 2; // GPIO7 <-> SCI_RX

//初始化PIE中断向量表,(使用中断方式接收上位机数据)
EALLOW;   //寄存器EALLOW保护

PieVectTable.SCIRXINTA=&ISR_SCI;//SCI接收中断//初始化PIE中断向量表

EDIS;   //禁止写如EALLOW保护的寄存器

//初始化SCI
//1位停止位
SciaRegs.SCICCR.bit.STOPBITS = 0x0;
//8字节数据
SciaRegs.SCICCR.bit.SCICHAR = 0x7;
//No parity
SciaRegs.SCICCR.bit.PARITYENA = 0x0;
// 禁止Loop模式
SciaRegs.SCICCR.bit.LOOPBKENA = 0x0;
// 添加地址为
SciaRegs.SCICCR.bit.ADDRIDLE_MODE = 0x0;
//使能RX接收端
SciaRegs.SCICTL1.bit.RXENA = 0x1;
//使能TX接收端
SciaRegs.SCICTL1.bit.TXENA = 0x1;
//禁止接受错误中断功能
SciaRegs.SCICTL1.bit.RXERRINTENA = 0x0;
//禁止睡眠模式
SciaRegs.SCICTL1.bit.SLEEP = 0x0;
//允许接收中断使能
SciaRegs.SCICTL2.bit.RXBKINTENA = 0x1;
//禁止发送中断使能
SciaRegs.SCICTL2.bit.TXINTENA = 0x0;

SciaRegs.SCIHBAUD    =0x0001;
SciaRegs.SCILBAUD    =0x0086;
// Relinquish SCI from Reset
SciaRegs.SCICTL1.bit.SWRESET = 0x1;

/使能中断
EALLOW;//保护,防 止破坏性写入Edit allow
PieCtrlRegs.PIEIER9.bit.INTx1 = 1; // SCI中断使能;
EDIS;//Edit disable

PieCtrlRegs.PIEACK.all = 0xFFFF; //写1清零,允许所有PIE都能被响应
IER = M_INT9;
EINT;//开中断

中断向量表:

 

 

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值