Other Parts Discussed in Thread: C2000WARE
Thread 中讨论的其他器件:C2000WARE
工具与软件:
我最近使用 FSI 通信在 两个器件之间进行高速通信(不启用 FSI 中断)。 我使用了 SYSCFG 工具来配置 FSI 模块。 具体配置如下图所示。


两种器件都启用了 FSI 发送和接收功能、以实现全双工。 在1ms 计时器中断集中、两个器件相互发送包含16段数据的数据帧。 在 while (1)循环中、两个器件都重复调用接收函数进行数据处理。
不过、在观察后、接收器件通常会遇到错误。 以下是用于发送和接收处理以及 FSI_RX 寄存器状态的代码片段。
void ComFSI_TxLoop() // In the 1ms Timer Interrupt
{
FSI_setTxSoftwareFrameSize(dFSI_TxBase, 16);
FSI_setTxFrameTag(dFSI_TxBase, FSI_FRAME_TAG0);
FSI_setTxFrameType(dFSI_TxBase, FSI_FRAME_TYPE_NWORD_DATA);
ComFSI.TxEventStatus = FSI_getTxEventStatus(dFSI_TxBase);
if(ComFSI.TxEventStatus & (FSI_TX_EVT_BUF_UNDERRUN | FSI_TX_EVT_BUF_OVERRUN))
{
FSI_resetTxModule (dFSI_TxBase, FSI_TX_MAIN_CORE_RESET);
}
FSI_clearTxEvents(dFSI_RxBase,ComFSI.TxEventStatus);
ComFSI.TxEventStatus = 0;
FSI_setTxUserDefinedData(dFSI_TxBase, ComFSI.TxUserData.all);
FSI_writeTxBuffer(dFSI_TxBase, ComFSI.TxData.Array, dFSI_TxWords, 0U);
FSI_startTxTransmit(dFSI_TxBase); // Start Transfer
}
void ComFSI_RxLoop() // In the While(1) Loop
{
ComFSI.RxEventStatus = FSI_getRxEventStatus(dFSI_RxBase);
if( ComFSI.RxEventStatus & (FSI_RX_EVT_FRAME_DONE | FSI_RX_EVT_DATA_FRAME) )
{
ComFSI.RecvDataFrameFlg = 1;
ComFSI.RxUserData.all = FSI_getRxUserDefinedData(dFSI_RxBase);
FSI_readRxBuffer(dFSI_RxBase, ComFSI.RxData.Array, dFSI_RxWords, 0);
}
else if( ComFSI.RxEventStatus & (FSI_RX_EVT_CRC_ERR | FSI_RX_EVT_TYPE_ERR | FSI_RX_EVT_EOF_ERR | FSI_RX_EVT_ERR_FRAME
| FSI_RX_EVT_OVERRUN | FSI_RX_EVT_UNDERRUN | FSI_RX_EVT_FRAME_OVERRUN) )
{
RxErrCnt ++;
FSIRX_init();
ComFSI_Init();
FSI_executeTxFlushSequence(dFSI_TxBase, dFSI_TxCLK_Prescalar);
}
FSI_clearRxEvents(dFSI_RxBase,ComFSI.RxEventStatus);
ComFSI.RxEventStatus = 0;
}

值得一提的是、这种类型的接收错误在开始通信后的一段时间内不会发生、但会在通信一段时间后触发、需要通过复位 FSI 模块来恢复。
此外、当我使用其他两个配置和代码相同的器件(F280025)进行 FSI 通信时、没有发生这种现象。 我使用了 F280025和 F280039、后一个仍然有接收问题。 我猜问题出在 F280039C、但我不确定具体问题是什么、因为我已查阅了有关 FSI 的相关信息
我希望任何人都能有所帮助。


