Part Number:TMS320F28069M
SCICTL2 RXBKINTENA bit1=1 使能 接收/缓冲抑制中断
SCIFFRX RXFFIENA bit5=1 使能接收FIFO中断
上面两个寄存器同时置1,发现串口每次中断只接收一个字节数据,而不是想像的四个字节数据(若FIFO深度设为4级)进一次中断
若关闭SCICTL2 RXBKINTENA bit1=0 ,则串口助手不管发了多少字节数据,都不会进入中断;
请问FIFO模式使用到底是怎么回事呢
Green Deng:
你好,这个可能上传一下你这边的SCI部分的配置,单这两个寄存器看不出来什么问题。
,
Shaoxiong Guo:
确实是配置问题 已经试出来了 谢谢
,
Green Deng:
好的,方便的话可以分享一下解决方案供其他工程师参考
,
Shaoxiong Guo:
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的一个条件宏,供大家参考
,
Green Deng:
非常感谢!