This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请教关于SCI 发送FIFO Buffer的问题

Other Parts Discussed in Thread: TMS320F28335

我最近在用TMS320F28335的SCI模块开发一个MODBUS通讯,在程序调试过程中,我发现如下问题,请帮忙解答,谢谢先!

当TXFFIL配置为16,如下:

ScibRegs.SCIFFTX.all |= 0xC010;  //即TXFFIL = 16

当按照如下逻辑写发送Data到buffer时

....

Uint8 i;
PCtx_length-=uiPCTxDataPointer;
//Send data to buffer
if(PCtx_length>0)
{
if(PCtx_length>16) //Length is more than 16 bytes
{
for(i=0;i<16;i++)
{
//while(ScibRegs.SCICTL2.bit.TXRDY != 1); 若加上此句,含义为在此等所有的数据去发送,有误!
ScibRegs.SCITXBUF = u16PCModbusTxBuffer[uiPCTxDataPointer+i];
asm(" RPT #20 || NOP");
}
uiPCTxDataPointer+=16;
}
else //Length is less than 16 bytes,can finish transmitting this time
{
for(i=0;i<PCtx_length;i++)
{
ScibRegs.SCITXBUF = u16PCModbusTxBuffer[uiPCTxDataPointer+i];
asm(" RPT #20 || NOP");
}
uiPCTxDataPointer+=PCtx_length;
}
}

.....

然后使能FIFO发送中断,当我发送给DSP时,DSP回复的数据与期望的数据相比,丢了几个byte的数据。

电脑发送:3A 30 31 30 33 30 31 30 31 30 30 30 32 46 38 0D 0A

DSP回复:3A 30 31 30 31 37 45 46 45 44 33 42 30 46 42 0D 0A 

期望回复值:3A 30 31 30 33 30 31 30 31 37 45 46 45 44 33 42 30 46 42 0D 0A  //红底Data被丢掉

但当我把TXFFIL配置为8,每次发送中断来时,写8个byte到SCITXBUF(即将上面代码中的16改为8),DSP就能回复正确的值。

单步调试代码及翻看F28335 SCI datasheet也没有发现问题点。请高手帮忙解释下,谢谢!

  • Move to the C2000 forum

  • Thanks Eason!

    Could you help to explain the issue? thanks in advance!

  • 您好,我要用FIFO发送65个数据,但是只能发送17个,其余全部丢失,请问您能给指导一下吗

  • 把你的SCI寄存器配置代码及数据发送代码贴上来看下

  • ScicRegs.SCICCR.all =0x0007; // 1 stop bit, No loopback
    ScicRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
    // Disable RX ERR, SLEEP, TXWAKE
    ScicRegs.SCICTL2.bit.TXINTENA =1;
    ScicRegs.SCICTL2.bit.RXBKINTENA =1;
    ScicRegs.SCIHBAUD =0x0001; // 9600 baud @LSPCLK = 37.5MHz.
    ScicRegs.SCILBAUD =0x00E7;

    ScicRegs.SCIFFTX.all=0xC028;
    ScicRegs.SCIFFRX.all=0x0028;
    ScicRegs.SCIFFCT.all=0x00;
    ScicRegs.SCICTL1.all = 0x0023; // Relinquish SCI from Reset
    ScicRegs.SCIFFTX.bit.TXFIFOXRESET=1;
    ScicRegs.SCIFFRX.bit.RXFIFORESET=1;

    下面是发送代码

    Uint16 i;
    for(i=0; i< 65; i++)
    {
    ScicRegs.SCITXBUF = Power_send_buf[i] & 0xFF; // Send data
    }
    DELAY_US(1000000);

    ScicRegs.SCIFFTX.bit.TXFFINTCLR=1; // Clear SCI Interrupt flag
    PieCtrlRegs.PIEACK.all|=M_INT8; // Issue PIE ACK

  • 用串口调试只收到第一个,和最后16个,共17个字节,其余全部丢失

  • 试下将ScicRegs.SCIFFTX.all=0xC000;// 即先不使能FIFO的发送中断,等到发送完了,如果有需要的话,在使能中断;TXFFIL 设为0。

    还有往BUF里写数据最好以16个为单位写,写BUF的速度要快于SCI搬运的速度。

  • 我试了您给的建议,一个也发不出去了

  • 你的所有的数据发送都是在中断里?你之前的代码逻辑是SCI初始化完成后,进FIFO发送中断,然后发送你的数据。现在你把FIFO发送中断使能关掉了,进不了FIFO中断了,肯定发送不了数据了。如果你单独的想测试能否发送完整的数据的话,那你还是把FIFO发送中断使能,测试下。

  • 我其实也是在做modbus,先和四个从机设备通信,然后接收数据封装,再发到上次scada系统,现在刚开始做到通信这一块,我其实不想在把数据发送都做到中断里,但是不知道怎么在主程序实现,刚入门嵌入式开发,好多都不会,我看了您刚开始发的帖子,那个测试是可以的吗?我试了一次发现发送的都是0

  • 65个数据都可以丢出来了? 

    SCI初始化的时候,先不要使能FIFO发送中断,如果有数据要往外发送时,置标志位,采用定时轮询标志位的方式确定是否有数据要发送,如果有数据要发送的话,发送前16个数据(不够16个数据的,有多少发多少),然后在开中断(开中断前,查询中断标志位TXFFINT有置起,有置起,清掉),然后通过中断的方式发送剩余的数据(一次中断发送16个数据)。

  • 谢谢您大神,我现在发送成功了,但是在发送完一帧之后的数据就全是错误的了,能给个您的邮箱吗,以后有问题还希望您能指导一下