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.

TMS320F28035: 28035 的 SCI FIFO接收中断是否有BUG?

Part Number: TMS320F28035

设置FIFO接收深度为4级, 发送深度0级;

用串口调试助手发送数据 01 03 00 00 00 02 C4 0B 共8个bytes, 示波器波形如下图

上图中,第一个为串口调试助手发送数据, 第二个波形为DSP回复数据.

注意看第一个波形持续时间为4.52ms, 波特率为19200, 可以计算1/19200*11*8=4.583ms,这与示波器波形相符,说明发送数据正确;如果是12个字节的话1/19200*11*12 = 6.875ms,这两个时间差示波器能轻易区分.

再看CCS监测数据

reDtat为接收数据,完全正确

但是 reciveCounter 为进接收中断次数,串口助手发送8个字节按理应该进中断为 8 / 4 = 2次, 监测数据为进了3次;re_data_counter = 12, 12 = 4 * 3, 接收了12个数据, 每进一次中断都读取了FIFO有几个数据再读取;如下面这段代码

dataNum = mo->SCIFFRX.bit.RXFFIL;

for (i = 0; i < dataNum; i++)
{
    md->reDtat[md->re_data_counter] = mo->SCIRXBUF.all;
    md->re_data_counter++;
}

很明显串口调试助手只发送了8个数据,按理FIFO尝试为4级的情况下只需进2次中断读8个字节;而实际28035却进了3次中断,读取了12个字节。并且示波器监测发送数据完全正确,28035读取数据也完全正确。但是进的中断次数却错了。

因此,在串口助手发送前我把reDtat[9]~reDtat[11]的数值手动改成其他数据,再用串口助手发送同样的数据,果然reDtat[9]~reDtat[11] 全部变为0。也就是说SCI在接收完毕后,在没有数据的情况下多进了一次中断,多接收了4个数据,且数据全为0.

目前, 我没有找到原因, 请各位大侠帮忙,如果需要我可以奉上代码.

  • 你好,内容比较多,我整理了一下,大概意思是说:

    F28035的SCI启用FIFO的情况下接收8个字节的消息进入了3次中断,而且最后一次中断接收的是全为00的4个数据。是这样吗?

    上面概述没问题的话可能还是要给出一下SCI & FIFO的配置代码查看一下。

  • LZ,我遇到了同样的问题。FIFO发送中断可以正常工作,接收中断总是无法接收到正常的数据

    初始化接收FIFO深度8

    	/**SCIFFRX: FIFO receive register
    	 * bit0-4.RXFFIL:8,RX FIFO深度,8 Byte,Modbus查询帧最小长度为8
    	 * bit5.RXFFIENA:1,RX FIFO 中断开启
    	 * bit13.RXFIFORESET:0,复位RX FIFO指针并保持复位
    	 */
    	sciRegs->SCIFFRX.all = 0x0028;

    接收中断:

    __interrupt void SCIbRxISR(void)
    {
    	SCIRxISR_Call(1);
    
    	ScibRegs.SCIFFRX.bit.RXFFOVRCLR = 1;
    	ScibRegs.SCIFFRX.bit.RXFFINTCLR = 1;
    	PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
    }

    /**
     * @brief 在FIFO接收中断调用,处理接收缓冲
     *
     * @param sciNo: SCI编号,0:SCI-A;!=0:SCI-B
     */
    void SCIRxISR_Call(Uint16 sciNo)
    {
    	if (sciNo > 1) 		return;
    
    	volatile struct SCI_REGS *sciRegs;
    	/** 根据sciNo决定使用哪组寄存器*/
    	sciRegs = sciNo ? &ScibRegs : &SciaRegs;
    
    	Uint16 i = 0;
    	Uint16 rxRemained = sciRegs->SCIFFRX.bit.RXFFST;
    	//设定RX接收8个字符才中断
    	while(rxRemained-- > 0)
    	{
    		SCI_RX_Buffer[sciNo][SCI_RX_Length[sciNo]++] = sciRegs->SCIRXBUF.all & 0xFF;
    	}
    	//设置标志,表明已经开始接收一帧了
    	SCI_RX_FirstChar[sciNo] = 1;
    }

    定时器1ms调用的函数:

    /**
     * @brief 在定时器(1ms)中定时调用此函数,
     * 用来判断接收超时,Modbus规定帧间隔3.5字符时间
     * Ttimeout = 3.5*11/波特率
     * 波特率9.6K	: T = 4ms
     * 波特率19.2K	: T = 2ms
     * 波特率115.2K	: T = 0.4ms
     * 这里程序为了处理简单,统一设定超时时间5ms
     * @param sciNo: SCI编号,0:SCI-A;!=0:SCI-B
     */
    void SCI_OnTimer(Uint16 sciNo)
    {
    	if(sciNo > 1) return;
    	volatile struct SCI_REGS *sciRegs;
    	/** 根据sciNo决定使用哪组寄存器*/
    	sciRegs = sciNo ? &ScibRegs : &SciaRegs;	
    	//已经接收了至少1个字符
    	if(SCI_RX_FirstChar[sciNo])
    	{
    		//接收超时
    		if(++SCI_RX_TimeCounter[sciNo] > SCI_RX_TIMEOUT)
    		{
    			SCI_RX_TimeCounter[sciNo] = 0;
    			SCI_RX_FirstChar[sciNo] = 0;
    			//先保存接收FIFO中的数据
    			Uint16 rxRemained = sciRegs->SCIFFRX.bit.RXFFST;
    			while(rxRemained-- > 0)
    			{
    				SCI_RX_Buffer[sciNo][SCI_RX_Length[sciNo]++] = sciRegs->SCIRXBUF.all & 0xFF;
    			}
    			//超时表示帧接收完毕,调用回调函数进行帧数据处理
    			if(pReceive_Callback[sciNo] != NULL)
    			{
    				(*pReceive_Callback[sciNo])(&SCI_RX_Buffer[sciNo][0],SCI_RX_Length[sciNo]);
    			}
    		}
    	}
    }

    串口调试助手发送8个字节

    第一次接入接收中断时,SCIFFRX.bit.RXFFST = 4(此值不固定,但总是不等于8),RXFFOVF=1,但是SCIRXBUF中连续4次读出的数据均不正确

    在接收超时处理函数中,SCIFFRX.bit.RXFFST = 3,能够完整接收串口助手发来的最后3个字节

    请问该如何处理接收FIFO中断呢?

  • 我这个问题处理方法找到了,将接收深度RXFFIL设置成4之后,就能够正常接收数据了。

    我昨天调试发送FIFO的时候也遇到同样的问题:刚开始想一次往FIFO中写入16个字节,后来改成8个字节,都不能正确发送数据。

    后来在发送中断中一次发送不多于4个字节,就可以了

    现在怀疑TI的文档中说的FIFO深度16是不准确的,很有可能16是指16bits,而非16bytes

  • 四级深度, 这个我的没问题

    我的问题是设置四级深度, 比如供8个字节按理只需进2次中断即可完成, 在第2次进中断的时候把接收使能关闭,同时关闭接收中断,但还是会第3次进中断, 这时又没有发数据,接收到的是四个0