打印
[DSP编程]

SCI的一个程序

[复制链接]
2797|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nl900324|  楼主 | 2014-1-3 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
功能:向PC通过SCI串口发送一个方波的坐标点数据
问题:发送中断服务程序中,+长时间延迟,PC才能正常收到数据,延迟越短,接受到数据越少,不加延时4000个字节的数据,只能收到3,4个,冰天雪地跪求大神解答啊!!!!!!!
程序如下:
#include "DSP28x_Project.h"     // Device Headerfile and Examples Include File
void Scib_init();
interrupt void Scib_RXISR();
interrupt void Scib_TXISR();
int m,n,count=0;
char rdata[16];
struct Point
{
        int x;
        int y;
};
struct Point sdata_rect[2000];
void main(void)
{
        int i=0,flag=5;
        InitSysCtrl();
        InitScibGpio();
        DINT;
        InitPieCtrl();
        IFR=0x0000;
        IER=0x0000;
        InitPieVectTable();
        Scib_init();
        EALLOW;       
        PieVectTable.SCIRXINTB=&Scib_RXISR;
        PieVectTable.SCITXINTB=&Scib_TXISR;
        EDIS;
       
        PieCtrlRegs.PIECTRL.bit.ENPIE=1;
        PieCtrlRegs.PIEIER9.bit.INTx3=1;
        PieCtrlRegs.PIEIER9.bit.INTx4=1;
        IER|=M_INT9;
        //各种复位状态的清除
        ScibRegs.SCICTL1.bit.SWRESET=1;
        ScibRegs.SCIFFTX.bit.SCIRST=1;
        ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
        ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;
        //产生模拟方波数据
        for(i=0;i<2000;i++)
        {
                sdata_rect[i].x=i;
                if(i%200==0)
                {
                        flag=-flag;
                        sdata_rect[i].y=flag+10;
                }
                else
                {
                        sdata_rect[i].y=flag+10;
                }
        }
        EINT;
        ERTM;

        for(;;)
        {

        }       
               
}


void Scib_init()
{
        ScibRegs.SCIFFTX.bit.SCIRST=0;
        //8位数据,1位停止,无校验
        ScibRegs.SCICCR.bit.ADDRIDLE_MODE=0;
        ScibRegs.SCICCR.bit.PARITYENA=0;
        ScibRegs.SCICCR.bit.STOPBITS=0;
        ScibRegs.SCICCR.bit.SCICHAR=7;
        //2400波特率       
//        ScibRegs.SCIHBAUD=0x0007;
//        ScibRegs.SCILBAUD=0x00A0;
        //9600波特率
        ScibRegs.SCIHBAUD=0x0001;
        ScibRegs.SCILBAUD=0x00E7;
       
        //发送16级FIFO 接收1级
        ScibRegs.SCIFFTX.bit.TXFFIL=16;
        ScibRegs.SCIFFRX.bit.RXFFIL=1;
        //引脚传输使能
        ScibRegs.SCICTL1.bit.RXENA=1;
        ScibRegs.SCICTL1.bit.TXENA=1;
        //中断使能
        ScibRegs.SCIFFRX.bit.RXFFIENA=1;
        ScibRegs.SCIFFTX.bit.TXFFIENA=1;
        //使能FIFO
        ScibRegs.SCIFFTX.bit.SCIFFENA=1;
}

interrupt void Scib_RXISR()
{
        unsigned int temp,i;
        DINT;
        temp=ScibRegs.SCIFFRX.bit.RXFFST;
        for(i=0;i<temp;i++)
        {
                rdata[i]=ScibRegs.SCIRXBUF.bit.RXDT;
        }
        ScibRegs.SCIFFRX.bit.RXFIFORESET=0;
        ScibRegs.SCIFFRX.bit.RXFIFORESET=1;
        ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;
        ScibRegs.SCIFFRX.bit.RXFFINTCLR=1;
        PieCtrlRegs.PIEACK.all|=0x100;
        EINT;
}
interrupt void Scib_TXISR()
{
        char i=0;
        int j,k;
        DINT;
        if(count>=3999)
        {       
                PieCtrlRegs.PIEACK.all|=0x100;
                return;
        }
        for(i=0;i<16;i++)
        {
                //发送一个方波数据,包括x,y点
                if(count<2000)
                        ScibRegs.SCITXBUF=sdata_rect[count+i].x;       
                else
                        ScibRegs.SCITXBUF=sdata_rect[count-2000+i].y;
        }
        //这里!
        for(j=0;j<1000;j++)
                 for(k=0;k<200;k++);
        count?(count+=16):(count+=15);
        ScibRegs.SCIFFTX.bit.TXFIFOXRESET=0;  //指针清0
        ScibRegs.SCIFFTX.bit.TXFIFOXRESET=1;  //退出复位状态
        ScibRegs.SCIFFTX.bit.TXFFINTCLR=1;
        PieCtrlRegs.PIEACK.all|=0x100;
        EINT;
}

相关帖子

沙发
zhangmangui| | 2014-1-3 11:30 | 只看该作者
你把发送中断关了试试   然后在发送函数中判断发送标志  
是否发送完  发送结束后进行下一个字节的发送

使用特权

评论回复
板凳
zhangmangui| | 2014-1-3 11:31 | 只看该作者
还有    根据需求设置高一点的波特率

使用特权

评论回复
地板
nl900324|  楼主 | 2014-1-3 13:53 | 只看该作者
我进行测试后发现,必须等16级FIFO的数据全部发送完,才能写入下一个16个数
也就是延迟那以
while(ScibRegs.SCIFFTX.bit.TXFFST!=0);
//这一句换成>=1到16之间任意数都不行,都会导致覆盖,也就是说16级fifo必须完全清空
while(ScibRegs.SCICTL2.bit.TXRDY==0);
代替。
我发送4000个数据,大概要4s,和设置的9600波特率差不多

使用特权

评论回复
5
zhangmangui| | 2014-1-3 14:20 | 只看该作者
不用FIFO不知道效果怎么样

使用特权

评论回复
6
nl900324|  楼主 | 2014-1-3 14:27 | 只看该作者
为啥都不爱用FIFO,我看网上也都说28335的FIFO做的不好,不太明白

使用特权

评论回复
7
zhangmangui| | 2014-1-6 23:22 | 只看该作者
nl900324 发表于 2014-1-3 14:27
为啥都不爱用FIFO,我看网上也都说28335的FIFO做的不好,不太明白

我觉得还是没有用好的缘故  你好好研究一下   
给大家分享

使用特权

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

本版积分规则

7

主题

53

帖子

0

粉丝