28335的SCI外设 以及与EPWM下溢中断的配合来完成一个数据帧的接收 控制程序与通讯程序配合
SCIA的CPU 结构
上图是SCIA 的CPU结构
三点:
- 使用GPIOMUX 功能将对应的GPIO 设置为 SCIA 功能
- SCIA 的时钟来自于系统时钟经过低速时钟预定标器分频以后 给SCIA
低速预分频系数是2 所以给SCIA 的时钟是 150MHZ/4=37.5MHz
(3) 必须使能SCI时钟, 即外设时钟控制寄存器 PCLKCR的SCIAENCLK=1;
波特率设置
F28335 的每一个SCI都具有两个8位波特率寄存器
SCIHBAUD SCILBAUD
波特率寄存器的值 BRR
假设 SCI_BAUD =115200
系统时钟是SYSCLKOUT =150MHz 低速时钟预分频系数是2
则低速外设时钟 是 150MHZ/4=37.5MHZ
39对应16进制 0X27
所以SCILBAUD=0X27
SCIHBAUD=0X00
SCI启动FIFO 功能时候的收发示意图
FIFO 译为"先入先出队列"
图SCI 之FIFO收发数据示意图
关键字 (1)发送缓冲寄存器 这些都是8位 注意
(2)发送移位寄存器
- 发送缓冲寄存器就绪标志位
SCI 发送数据的时,发送数据缓冲器从TX_FIFO 中取出来一个字节的数据
然后发送缓冲寄存器将数据发传送给发送移位寄存器TXSHF,
如过发送功能使能, 发送移位寄存器逐渐的将接收到的数据移位到SCITXD引脚上。
发送过程中的查询标志位是TXREADY 它位于SCICTL2 中的BIT7 该位为1 表示 发送缓冲寄存器准备好接收下一帧数据了。
数据写入SCITXBUF 后 该标志自动清零。
接收过程
关键字:
如果接收使能:才将接收移位寄存器RXSHF中的数据给接收缓冲寄存器,并存放进FIFO.
- 接收移位寄存器
- 接收缓冲寄存器
SCI接收数据的时候,接收移位寄存器 RXSHF 逐位接收 来自于SCIRXD引脚的信号。
若SCI接收功能使能, RXSGF将这些数据传输给接收缓冲寄存器SCIRXBUF
并放入FIFO 缓存当中,
接收过程中的查询标志是 RXRDY ,
他位于SCIR-XST 寄存器中的D6位 。
该位为1 表示 RXBUF 已经接收到一个数据, 可以立即读取,数据从SCIRXBUF 读出以后,该标志位清0 。
SCIA 的初始化
SCICCR 中设置了 (1)选择数据长度是8位
(2)关闭极性功能
(3)极性功能选择 偶校验
(4)停止位长度 1位
(5)工作模式是0 0是空闲线模式 1 是地址位模式
(6) 循环检测禁止
波特率 设置的是 115200
SCIFFTX 寄存器的设置
SCIFFRX 寄存器的设置
参考手把手 2812 书本
RXFFST bit8----bit12 共5位 反映了接收FIFO 中有多少个字节,
RXFFIL4---RXFFIL0 共5位 接收FIFO的中断级位, 当FIFO 状态位 与FIFO的级别位 匹配的时候 (大于 或者等于 )时 ,接收FIFO 产生中断 。
关于对DSP400 SCI通讯处理过程的描述
任务1
DSP作为从机接受数据的过程 。
假设主机51单片机 发送给DSP 的一个报文 的数据 是由于100个字节构成的。
关于对modbus的协议处理 现在先暂时不涉及
主机每间隔500ms 发送一个100个字节组成的消息帧
当然也有可能是上位机设定一些参数,可能就只发送一次,不是循环发送。
任务2 绘制出scia_task_fcn() 的流程图
该函数是在 DC_Control 的定时中断里面
一次读取接收FIFO里面的一个字节,需要注意的是
DSP接收主机发送的数据的时候,SCI外设会自己把接收到的数据按照字节存放进入FIFO里面,这部分是硬件自己完成的。
两个是并执行进行的,一方面你写的DSP通讯程序,在不停的读刷新数据,另一方面外设也在自己 不停的接收数据,
SCIFFRX寄存器的RXFFST 位表示了FIFO里面存在的字节数。
是一个动态平衡的过程。
而我在scia_task_fcn()中 就是读取接收FIFO里面的字节
一次读取一个字节,这个与硬件SCI外设接收主机发送的数据是同时的,不矛盾的,所以就会有判断是不是在接受中状态,是不是在空闲状态。
任务3
Scia_task_fcn()是在PIE EPWM 定时中断服务程序中的,9.6KHz
频率 大概每100us 读取一个FIFO接收区域的字节
同时 该中断服务程序中还有 TimingTimer() //用于时序的定时器。
Common Timmer() //通讯定时器
都没有用到定时器 是以EPMW中断的间隔 配合函数内部的计数器完成定时的
任务4 帧接收空闲转为帧接收中的状态
因为没有帧头和帧尾,所以当第一次判断到SCIRXFIFO的RXFFST不是0
即接收FIFO里面有字节数据,则直接开启静止时间计数 ,同时将接收状态从空闲改为接收中状态
在CommTimer()中 如果是帧接收状态 而且定时时间到 则进入帧接收结束标志。
任务5
帧的接收状态变为了帧接收结束以后 ,才能进入接收处理函数SCIRXProcess()中去 。
首先是对DSP接收到的消息帧 进行 CRC校验
最后的最后 再把这个过程叙述一遍
SCI通信与EPWM关系简单描述如下,同时静止时间计数commtimer()
也是以为 EPMWM 中断为时间基准的。
大致的通讯过程
转为帧接收结束标志的时候 实际接收FIFO中已经没有数据了,
接收FIFO 中没有数据 是在定时之前就完成了。
注意 数据桢接收结束的触发过程是:
SPI的接收FIFO里面如果有字节数的话,每接收一次就会重新定时一次定时器
如果FIFO里面如果为空了。 而且在接受中, 则会把接收标志在commtimer 里面变为
帧接收结束标志