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.
我最近在用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也没有发现问题点。请高手帮忙解释下,谢谢!
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
试下将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个数据)。