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.

TMS320F28069M: 接收FIFO的使用问题

Part Number: TMS320F28069M

SCICTL2 RXBKINTENA bit1=1 使能 接收/缓冲抑制中断

SCIFFRX RXFFIENA bit5=1  使能接收FIFO中断

上面两个寄存器同时置1,发现串口每次中断只接收一个字节数据,而不是想像的四个字节数据(若FIFO深度设为4级)进一次中断

若关闭SCICTL2 RXBKINTENA bit1=0 ,则串口助手不管发了多少字节数据,都不会进入中断;

请问FIFO模式使用到底是怎么回事呢

  • 你好,这个可能上传一下你这边的SCI部分的配置,单这两个寄存器看不出来什么问题。

  • 确实是配置问题 已经试出来了  谢谢

  • 好的,方便的话可以分享一下解决方案供其他工程师参考

  •   HAL_Obj *obj = (HAL_Obj *)handle;
      SCI_setCharLength(obj->sciAHandle,SCI_CharLength_8_Bits);     //SCICCR SCICHAR bit2:0=111 8bit数据传输
      SCI_setMode(obj->sciAHandle,SCI_Mode_IdleLine);               //SCICCR ADDRIDLE_MODE bit3=0 选择空闲线协议
      SCI_disableLoopBack(obj->sciAHandle);                         //SCICCR LOOPBKENA  bit4=0 自测模式关闭 官方例程是使能loop back
      SCI_disableParity(obj->sciAHandle);                           //SCICCR PARITYENA bit5=0 不允许奇偶校验
      SCI_setParity(obj->sciAHandle,SCI_Parity_Odd);                //SCICCR PARITY bit6=0 奇校验
      SCI_setNumStopBits(obj->sciAHandle,SCI_NumStopBits_One);      //SCICCR STOPBITS bit7=0 1bit停止位

      SCI_disableRxErrorInt(obj->sciAHandle);                       //SCICTL1 RXERRINTENA bit6=0 屏蔽接收错误中断
      SCI_enable(obj->sciAHandle);                                  //SCICTL1 SWRESET bit5=1 SCI软件不复位
      SCI_disableTxWake(obj->sciAHandle);                           //SCICTL1 TXWAKE bit3=0 sci发送不唤醒
      SCI_disableSleep(obj->sciAHandle);                            //SCICTL1 SLEEP bit2=0 禁用睡眠功能
      SCI_enableRx(obj->sciAHandle);                                //SCICTL1 RXENA bit0=1 SCI接收使能
      SCI_enableTx(obj->sciAHandle);                                //SCICTL1 TXENA bit1=1 SCI发送使能

      SCI_disableTxInt(obj->sciAHandle);                            //SCICTL2 bit0=0 禁止TXRDY中断

    #if defined(SCI_RxFifoIntEnable)
      SCI_disableRxInt(obj->sciAHandle);                            //SCICTL2 RXBKINTENA bit1=1 禁用 接收/缓冲抑制中断
    #else
      SCI_enableRxInt(obj->sciAHandle);                             //SCICTL2 RXBKINTENA bit1=0 使能 接收/缓冲抑制中断
    #endif

      obj->sciAHandle->SCIFFTX &=(~(1<<15));                        //SCIFFTX SCIRST bit15=0 复位SCI发送接收通道
    #if defined(SCI_RxFifoIntEnable)
      SCI_enableTxFifoEnh(obj->sciAHandle);                         //SCIFFTX SCIFFENA bit14=1 启用FIFO
      SCI_enableTxFifo(obj->sciAHandle);                            //SCIFFTX TXFIFORESET bit13=1 使能发送FIFO
    #else
      SCI_disableTxFifoEnh(obj->sciAHandle);                        //SCIFFTX SCIFFENA bit14=0 禁用FIFO
      obj->sciAHandle->SCIFFTX &=(~(1<<13));                        //SCIFFTX TXFIFORESET bit13=0 持续复位发送FIFO
    #endif

      SCI_clearTxFifoInt(obj->sciAHandle);                          //SCIFFTX TXFFINTCLR bit6=1  发送FIFO中断清除标志位,1=清除TXFFINT位
      SCI_disableTxFifoInt(obj->sciAHandle);                        //SCIFFTX TXFFIENA bit5=0  不使能发送fifo中断
      SCI_setTxFifoIntLevel(obj->sciAHandle,SCI_FifoLevel_Empty);   //SCIFFTX TXFFIL bit4:0=00000 发送FIFO深度设为0 最大为4

      SCI_clearRxFifoOvf(obj->sciAHandle);                          //SCIFFRX RXFFOVRCLR bit14=1 SCI接收FIFO溢出清除标志位,1,清除RXFFOVF
    #if defined(SCI_RxFifoIntEnable)
      SCI_enableRxFifo(obj->sciAHandle);                            //SCIFFRX RXFIFORESET bit13=1 重新使能接收FIFO
    #else
      obj->sciAHandle->SCIFFRX &=(~(1<<13));                        //SCIFFRX RXFIFORESET bit13=0 持续复位接收FIFO
    #endif
      SCI_clearRxFifoInt(obj->sciAHandle);                          //SCIFFRX RXFFINTCLR bit6=1  清除接收FIFO中断标志位

    #if defined(SCI_RxFifoIntEnable)
      SCI_enableRxFifoInt(obj->sciAHandle);                         //SCIFFRX RXFFIENA bit5=1  使能接收FIFO中断
      SCI_setRxFifoIntLevel(obj->sciAHandle,SCI_FifoLevel_4_Words); //SCIFFRX bit4:0=00000 接收深度最大设置为4
    #else
      SCI_disableRxFifoInt(obj->sciAHandle);                        //SCIFFRX RXFFIENA bit5=0  接收FIFO中断不使能
      SCI_setRxFifoIntLevel(obj->sciAHandle,SCI_FifoLevel_Empty);   //SCIFFRX bit4:0=00000 接收深度最大设置为0
    #endif


      obj->sciAHandle->SCIFFCT &=(~(1<<15));                        //SCIFFCT ABD bit15=0
      SCI_clearAutoBaudDetect(obj->sciAHandle);                     //SCIFFCT ABDCLR bit14=1 ABD标志位
      SCI_disableAutoBaudAlign(obj->sciAHandle);                    //SCIFFCT CDC bit13=0 禁用ABD对齐
      SCI_setTxDelay(obj->sciAHandle,0);                            //SCIFFCT FTXDLY bit7:0=0

      SCI_setBaudRate(obj->sciAHandle,SCI_BaudRate_115_2_kBaud);

      SCI_enable(obj->sciAHandle);                                  //SCICTL1 SWRESET bit5=1 SCI软件使能
      SCI_enableChannels(obj->sciAHandle);                          //SCIFFTX SCIRST bit15=1 SCI复位标志,SCI接收和发送FIFO功能继续工作

      return;
    }

    这个SCI配置兼顾了使用FIFO和不使用FIFO的实践

    接收都是使用中断方式,发送都是轮询方式

    SCI_RxFifoIntEnable是是否使用FIFO的一个条件宏,供大家参考