[求助] 老话题--2812--FIFO--求助

meng219902   2014-4-24 15:58 楼主
是这样的,我发现我的2812这块板子上的SCI有问题,不知道你们遇到过吗?
1.我用的是SCI--FIFO;我接受9个char;发送不确定16char吧;我把接受总断打开了,如果接受9个就中断,发送总断关闭了。
2.我用的是485通信,因为除了用到RX\TX 外,还会用到一个IO引脚来控制485收发的。但是我发现如果我打开接受中断和发送中断,只能进行一次,即:接受中断---》发送中断,然后就再也进不去了,我怀疑是控制485收发IO的问题,转换不过来,(在发现过程中我还以为是清除FIFO,是FIFO复位的寄存器没有清位(ScibRegs.SCIFFRX.bit.RXFIFORESET),还有就是FIFO重启(ScibRegs.SCIFFTX.bit.SCIRST)有问题,这两个我都试了还是不好使),所以我选择了在接受中断中放入“发送”,这样我试了,还是有问题,就是接受一两次就不接受了,我怀疑是FIFO直针接受完了,没有归为,我就:
                      ScibRegs.SCIFFRX.bit.RXFIFORESET = 0;
                      delay_int();
                     ScibRegs.SCIFFRX.bit.RXFIFORESET = 1;
但是还是那样,我又在每次接收发送后加入了:
                     ScibRegs.SCIFFTX.bit.SCIRST=0;
                    delay_int();
                    ScibRegs.SCIFFTX.bit.SCIRST=1;
这样才无线的进入接受中断,也没有遇到我上面所谓的收发IO的影响。
但是我看了一下程序,我就想问,非得加入:
   ScibRegs.SCIFFTX.bit.SCIRST=0;
   delay_int();
   ScibRegs.SCIFFTX.bit.SCIRST=1;
不可吗?这样不会消耗时间吗?我怎么感觉会因为重新启动耗费很多时间呢?
我感觉只要把RXFIFORESET这个寄存器复位一下就可以了,为什么还不好使,费用重新启动呢???
3.我用的传输协议是modbus的,可以用中断进行握手吗???我怎么感觉时间上不够呢?(上位机接受到数据后在10ns(我猜的,我感觉就那么短的时间)之内我把接受的数据处理好在发出去就可以握手了,但是我明显感觉我写的程序根本达不到标准,我那一个延迟都够了)。
在别人用28335就可以达到握手,我记得我用28335的时候也没有那么麻烦啊?怎么。。。。是我弄错了,还是2812就得这么处理呢?

对于我们这台系统来说,我的要求就是把cpld发上来的数据通过modbus给上位机,采样也就10K左右,我不明白为什么上位机工程师非要让我把那个程序弄成握手的,我就想问,如果我握了手,一直做这个动作吗??我的dsp采样的工作,计算的工作都不做了吗?我现在工作在上位机一直是握手失败后100ms的重新尝试握手的过程中(也就是我只能每个100ms收发一次,我让上位机工程师把这个时间调小点,1ms或者更小,他说这个是报错重新握手的时间,不能用这样来实现正常的工作,还得在我这边改,我只能保持沉默,我真的不想改了)

求帮助

回复评论 (5)

interrupt void SCIRXINTB_ISR(void)     // SCI-B
{
        int i,j;
        Uint16 scib_rx_buf[10];
        SCIB_RX_BUF[RxLen++] = (ScibRegs.SCIRXBUF.all)&0x04;
        for(j=0;j<8;j++)
        {
                scib_rx_buf[j] = ScibRegs.SCIRXBUF.all;
                if(j<7)
                {
                        SCIB_RX_BUF[RxLen++]= scib_rx_buf[j];
                        scib_rx_buf[j]=0;
                }
        }

        Modbus_scan();    //modbus算法
            delay_int();

        for(j=0;j         {
                 ScibRegs.SCITXBUF = SCIB_TX_BUF[j];
                 while(ScibRegs.SCICTL2.bit.TXRDY!=1);

        }
                        TxLen=0;
                        delay_int();
      
        ScibRegs.SCIFFTX.bit.SCIRST=0;
        delay_int();
        ScibRegs.SCIFFTX.bit.SCIRST=1;

    ScibRegs.SCIFFRX.bit.RXOVF_CLR = 1;
    ScibRegs.SCIFFRX.bit.RXFFINTCLR = 1;
           PieCtrlRegs.PIEACK.all = 0x0100;  //响应中断
    GpioDataRegs.GPADAT.bit.GPIOA6 = 0;  //选通串口接收功能
        for(i=0;i<10;i++)
        delay_int();
    RxLen=0;


}

这是我的中断程序
点赞  2014-4-24 15:58
算了 我放弃在中断了,还是在主函数里面写吧。。。我成功了,没有任何。对了记住接受 发送的时候,要有一个延迟  我是100*100的延时   19200   
点赞  2014-5-4 09:23
还有结束的时候也要有延迟 可以 两倍的形式
点赞  2014-5-4 09:24
2812没搞过,但其它CPU的中断,进入后要清除标志,不然下一次就不再有中断了。
点赞  2014-5-4 21:35
你的中断延时要这么做?不过也可以尝试下的。
点赞  2014-5-6 23:57
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复