打印

DSP-F2812 SCI通信发送模块中FIFO增强特性的使用方法

[复制链接]
8163|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
GG_GG|  楼主 | 2012-8-1 12:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
SCI通信发送的过程中,有两种发送的方式供选择,一种是利用SCI模块的普通功能(即查询等待标志位的方式进行),另一种是利用F2812的增强特性FIFO功能进行数据的传送。比较这两种数据发送的方式发现,前一种查询等待的方式在发送一个字节的过程中会占用一个周期中的1ms时间(这是波特率为9600bps时候的情况),而后一种方式则基本不占用系统的周期等待时间,直接往Buf里面写数据就会自动的往外发送。

相关帖子

沙发
GG_GG|  楼主 | 2012-8-1 12:53 | 只看该作者
以下是FIFO功能的增前特性描述:



我在编程序的时候只用到增强特性中FIFO的发送功能,通过将SCIFFTX寄存器中的SCIFFEN位置1,使能FIFO模式。在任何操作状态下SCIRST都可以复位FIFO模式。

使用特权

评论回复
板凳
GG_GG|  楼主 | 2012-8-1 12:53 | 只看该作者
对寄存器的设置是

ScibRegs.SCIFFTX.all=0xE040; //1(写1表示SCI FIFO可以恢复发送或接收)/1(使能SCI FIFO增强功能)/1(重新使能发送FIFO操作)/00000(发送FIFO是空的)/0(没有TXFIFO中断)/1(清除TXFFINT标志位)/0(中断被禁止)/00000(中断级别为0)

ScibRegs.SCIFFCT.all=0x00; //禁止串口自动检测波特率

for(temp=1;temp<TXindex1;temp++)

{

ScibRegs.SCITXBUF=DateReceiveBuf[temp];

}

//然后FIFO就会把所要发送的数据都会自动的发送出去

ScibRegs.SCIFFTX.bit.SCIFFENA=0; //禁止FIFO功能,以确保利用回SCI的通信接收中断功能

上述的FIFO功能设置并不占用其它定时器中断的时间,这样可以有效的提高周期的资源利用率。提高了通信的效率。

对于第一种查询等待的方式,其中的设置是要等待一个字节完全的发送出去才能够进行其它模块的工作,这样的话是非常耗用时间和DSP的资源利用率的,而且其它模块的时间根本得不到保证,以下是我在调试时的一些相关设置:

ScibRegs.SCITXBUF=DateReceiveBuf[temp];

while(!((1<<6) & ScibRegs.SCICTL2.all)); //等待这个字节的数据完全的发送出去,该指令按照波特率为9600bps来算的话,发送一个字节的时间将耗时1ms,这样是很浪费资源的,其它模块的功能根本执行不了。

根据上述的比较会发现,利用FIFO的功能进行通信是非常合理的,而且资源利用效率高。

使用特权

评论回复
地板
阿尔法99| | 2012-8-23 11:53 | 只看该作者
由于FIFO只有16个字节的缓冲,如何控制写入的字数,如何启动发送呢?

使用特权

评论回复
5
sjz2008| | 2012-11-8 18:41 | 只看该作者
和4楼同问啊/

使用特权

评论回复
6
superman2012| | 2012-11-9 15:17 | 只看该作者
如果能把数据发与接收讲得更清楚就好了,嘿嘿

使用特权

评论回复
7
zhangmangui| | 2012-11-9 16:15 | 只看该作者
通过设置FIFO发送中断等级位:SciaRegs.SCIFFTX.bit.TXFFILIL=0;
设置FIFO接收中断等级位:SciaRegs.SCIFFRX.bit.RXFFIL=4;
例如SciaRegs.SCIFFRX.bit.RXFFIL=4;就是表明FIFO中有四个字节后产生接收中断,在接收中断中设置一个标志位,主函数里面查询标志位是否置位,如果置位则读取接收到的数据,接收如下:

interrupt void SCIRXINTA_ISR(void)     // SCI-A
{
        unsigned char i;           //ReceivedAChar;
        DINT;//关闭总中断

           // 数据接收
           //temp=SciaRegs.SCIFFRX.bit.RXFIFST;         //数据长度
    for(i=0;i<4;i++)
        {
                Receviced_data[i] = SciaRegs.SCIRXBUF.all;
        }
          
        flag=1;                                  //表示接受完成
        SciaRegs.SCIFFRX.bit.RXFIFORESET=0;      //将FIFO指针复位为0
        for(i=0;i<20;i++); //延时
        SciaRegs.SCIFFRX.bit.RXFIFORESET=1;      //退出复位状态
           SciaRegs.SCIFFRX.bit.RXFFINTCLR = 1;     // 清除接收中断标志
    SciaRegs.SCIFFRX.bit.RXOVF_CLR = 1;      //清除溢出中断标志
        PieCtrl.PIEACK.all |= M_INT9;            //响应中断
        EINT;   //开总中断
}

使用特权

评论回复
8
zhangmangui| | 2012-11-9 16:24 | 只看该作者
上面忘记说了,如果设置FIFO发送中断等级位:SciaRegs.SCIFFTX.bit.TXFFILIL=0; 如果不考虑自动波特率侦测的话就不需管发送中断,只需如下函数发送就是:
void Send_Char_SCIA(char temp)
{
        while(SciaRegs.SCIFFTX.bit.TXFFST !=0);
        SciaRegs.SCITXBUF=temp;
}
/*------------------------------------------*/
/*形式参数: char *String                   */
/*返回值:void                                                */
/*函数描述:发送一个字符串                                        */
/*------------------------------------------*/
void Send_String_SCIA(char *String)
{
        while(*String !='\0')
          {
     Send_Char_SCIA(*String++);
          }
}

使用特权

评论回复
9
sjz2008| | 2012-11-9 20:34 | 只看该作者
这几天调试f2812的串口通讯,主机用的是串口调试助手,A口和B口同样的FIFO使能设置,同样的初始化。可A口老是出错误。断点调试后发现寄存器SCIRXBUF里的SCIFFFE位老是置1.而B口就不会出现这样的错误。请问有人知道原因吗

使用特权

评论回复
10
sjz2008| | 2012-11-9 20:42 | 只看该作者
初始化程序如下:void SCIA_Init(Uint16 baud)
{
        SciaRegs.SCICCR.all = 0x0007;   //一个停止位,禁止自测试模式,无校验,8位字符长度
                                                                        //异步模式,采用空闲线协议
        SciaRegs.SCICTL1.all = 0x0003;  //使能TX,RX引脚和SCICLK
                                                                        //禁止RXERR,SLEEP,TXWAKE
        SciaRegs.SCICTL2.all = 0x0003;  //bit.TXINTENA=1;bit.RXBKINTENA=1;

       
        SciaRegs.SCIHBAUD.bit.SCIHBAUD =(baud>>8);
        SciaRegs.SCILBAUD.bit.SCILBAUD =(baud & 0x00FF);

        SciaRegs.SCIFFTX.all =0xE041;

        SciaRegs.SCIFFRX.all =0x6068;  //RXFFIL 中断级别 is 01000  8级FIFO
       
        SciaRegs.SCIFFCT.all =0x0000;

        SciaRegs.SCICTL1.all = 0x0023;  //使SCI退出复位状态

}
请高手指点下有没有问题啊???多谢了

使用特权

评论回复
11
算命师| | 2013-8-11 12:17 | 只看该作者
zhangmangui 发表于 2012-11-9 16:15
通过设置FIFO发送中断等级位:SciaRegs.SCIFFTX.bit.TXFFILIL=0;
设置FIFO接收中断等级位:SciaRegs.SCIFF ...

如果我把rxffil=2,然后程序是for(i=0;i<4;i++),然后往DSP中发送4个字节,那么我receviced_data会不会收到后面的两个字节?比如我往2812中发送 0x11 0x12 0x13 0x14,我的Rec_data中能不能看到0x13 0x14?

使用特权

评论回复
12
zhangmangui| | 2013-8-11 17:56 | 只看该作者
算命师 发表于 2013-8-11 12:17
如果我把rxffil=2,然后程序是for(i=0;i

这个具体没试过  2个字节就中断  进入中断服务程序   应该只能接收到2个字节  
查询方式就无所谓了

使用特权

评论回复
13
算命师| | 2013-8-11 19:14 | 只看该作者
zhangmangui 发表于 2013-8-11 17:56
这个具体没试过  2个字节就中断  进入中断服务程序   应该只能接收到2个字节  
查询方式就无所谓了 ...

对 现在就只能收到两个字节,后面两个就没踪影了

使用特权

评论回复
14
zhangmangui| | 2013-8-12 09:01 | 只看该作者
算命师 发表于 2013-8-11 19:14
对 现在就只能收到两个字节,后面两个就没踪影了

你在中断中接收可能意味着清了FIFO

使用特权

评论回复
15
济癫不癫| | 2013-8-16 12:45 | 只看该作者
学习了。。。。。。。。。。。

使用特权

评论回复
16
zhangmangui| | 2013-8-17 16:48 | 只看该作者
好参考价值

使用特权

评论回复
17
dianzicxw| | 2014-12-9 19:28 | 只看该作者
为什么我采用接受中断,串口调试助手发送八个字节,进去中断之后,只有收到第一个字节,而且后面的几个都是一样的!
for(i=0;i<4;i++)
        {
                Receviced_data[i] = SciaRegs.SCIRXBUF.all;
        }
Receviced_data[i]所有的都是一样的值!
请高手指点!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

893

帖子

7

粉丝