是这样的,我发现我的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或者更小,他说这个是报错重新握手的时间,不能用这样来实现正常的工作,还得在我这边改,我只能保持沉默,我真的不想改了)
求帮助
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;
}
这是我的中断程序
算了 我放弃在中断了,还是在主函数里面写吧。。。我成功了,没有任何。对了记住接受 发送的时候,要有一个延迟 我是100*100的延时 19200
2812没搞过,但其它CPU的中断,进入后要清除标志,不然下一次就不再有中断了。