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

2019-03-24 11:35发布

是这样的,我发现我的2812这块板子上的SCI有问题,不知道你们遇到过吗?
1.我用的是SCI--FIFO;我接受9个char;发送不确定16char吧;我把接受总断打开了,如果接受9个就中断,发送总断关闭了。
2.我用的是485通信,因为除了用到RXTX 外,还会用到一个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条回答
meng219902
1楼-- · 2019-03-24 15:58
< 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<TxLen;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;


}

这是我的中断程序
meng219902
2楼-- · 2019-03-24 18:36
 精彩回答 2  元偷偷看……
meng219902
3楼-- · 2019-03-24 20:18
还有结束的时候也要有延迟 可以 两倍的形式
dontium
4楼-- · 2019-03-25 02:08
2812没搞过,但其它CPU的中断,进入后要清除标志,不然下一次就不再有中断了。
led2015
5楼-- · 2019-03-25 03:08
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章