28335的SCI外设 以及与EPWM下溢中断的配合来完成一个数据帧的接收 控制程序与通讯程序配合

SCIA的CPU 结构

 

 

上图是SCIA 的CPU结构

 

三点:

  1. 使用GPIOMUX 功能将对应的GPIO 设置为 SCIA 功能
  2. 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)发送移位寄存器

  1. 发送缓冲寄存器就绪标志位

 

SCI 发送数据的时,发送数据缓冲器从TX_FIFO 中取出来一个字节的数据

 

然后发送缓冲寄存器将数据发传送给发送移位寄存器TXSHF,

如过发送功能使能, 发送移位寄存器逐渐的将接收到的数据移位到SCITXD引脚上。

 

发送过程中的查询标志位是TXREADY 它位于SCICTL2 中的BIT7 该位为1 表示 发送缓冲寄存器准备好接收下一帧数据了。

数据写入SCITXBUF 后 该标志自动清零

 

接收过程

 

关键字:

如果接收使能:才将接收移位寄存器RXSHF中的数据给接收缓冲寄存器,并存放进FIFO.

  1. 接收移位寄存器
  2. 接收缓冲寄存器

 

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 里面变为

帧接收结束标志

 

 

猜你喜欢

转载自www.cnblogs.com/bailongwei654321/p/12980855.html