TI中文支持网
TI专业的中文技术问题搜集分享网站

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

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

Eason Wang:

Move to the C2000 forum

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

xiangwei meng:

回复 Eason Wang:

Thanks Eason!

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

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

rui liu4:

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

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

xiangwei meng:

回复 rui liu4:

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

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

rui liu4:

回复 xiangwei meng:

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

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

rui liu4:

回复 rui liu4:

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

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

xiangwei meng:

回复 rui liu4:

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

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

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

rui liu4:

回复 xiangwei meng:

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

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

xiangwei meng:

回复 rui liu4:

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

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

rui liu4:

回复 xiangwei meng:

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

赞(0)
未经允许不得转载:TI中文支持网 » 请教关于SCI 发送FIFO Buffer的问题
分享到: 更多 (0)