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.

[参考译文] TMS320F280039C:当两个器件通过外部接线相互通信时会发生 FSI 通信错误

Guru**** 2943400 points

Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1423914/tms320f280039c-fsi-communication-error-occur-when-two-devices-communicate-with-each-other-with-external-wiring

器件型号:TMS320F280039C
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 的相关信息
我希望任何人都能有所帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    外部接线如下所示

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    HI 逻辑器件、

    这是自定义代码吗? 我建议您尝试 C2000ware 中的一些 FSI 示例、并查看是否有任何错误。

    谢谢!

    Susmitha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    另请参阅 以下链接中的"32.4.1建立通信链路"部分、了解如何在2个控制器之间进行同步。

    TMS320F28003x 实时微控制器技术参考手册(修订版 C)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Susmitha:

    感谢您的回答。 我在 C2000Ware 中尝试了两个示例、分别是 fsi_ex8_p2pconnection_rx 和 fsi_ex8_p2pconnection_tx、它们可以在不丢失数据包的情况下正常运行。

    然后、我检查了工程、发现当我检查寄存器的溢出位或欠载位时、Tx 模块由我复位。  当我在 FSI 通信过程中停止检查这两个位的状态时、 好像工作正常。 因此、我认为这可能是引发上一个问题的原因。  

    if(ComFSI.TxEventStatus & (FSI_TX_EVT_BUF_UNDERRUN | FSI_TX_EVT_BUF_OVERRUN))
    {
        FSI_resetTxModule (dFSI_TxBase, FSI_TX_MAIN_CORE_RESET);
    }

    在 TMS320F28003x 实时微控制器技术参考手册(修订版 C)中 、我发现这两个位的定义 似乎表明我写入或读取寄存器的速度太快。 但正如我之前所说的、我的 send 函数是在1ms 中断中调用的、因此理论上不应发生这种情况。

    在我的工程中、为什么即使在设置了这两个位后、FSI 模块仍能正常工作?

    谢谢!

    逻辑

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    HI 逻辑器件、

    很高兴听到您找出了问题、为什么会发生这种情况。

    通常、我们建议使用 FSI 中断从缓冲区进行写入。 FSI 的所有 C2000ware 示例都有  FSI 中断。

    使用计时器 中断 可能会导致问题。  请参阅31.3.2.4中有关超限和欠载错误的部分。

    TMS320F28003x 实时微控制器技术参考手册(修订版 C)

    谢谢!

    Susmitha