ZHCAA38E August 2021 – January 2023 TMS320F280021 , TMS320F280021-Q1 , TMS320F280023 , TMS320F280023-Q1 , TMS320F280023C , TMS320F280025 , TMS320F280025-Q1 , TMS320F280025C , TMS320F280025C-Q1 , TMS320F280033 , TMS320F280034 , TMS320F280034-Q1 , TMS320F280036-Q1 , TMS320F280036C-Q1 , TMS320F280037 , TMS320F280037-Q1 , TMS320F280037C , TMS320F280037C-Q1 , TMS320F280038-Q1 , TMS320F280038C-Q1 , TMS320F280039 , TMS320F280039-Q1 , TMS320F280039C , TMS320F280039C-Q1 , TMS320F280040-Q1 , TMS320F280040C-Q1 , TMS320F280041 , TMS320F280041-Q1 , TMS320F280041C , TMS320F280041C-Q1 , TMS320F280045 , TMS320F280048-Q1 , TMS320F280048C-Q1 , TMS320F280049 , TMS320F280049-Q1 , TMS320F280049C , TMS320F280049C-Q1 , TMS320F28384D , TMS320F28384S , TMS320F28386D , TMS320F28386S , TMS320F28388D , TMS320F28388S , TMS320F28P650DH , TMS320F28P650DK , TMS320F28P650SH , TMS320F28P650SK , TMS320F28P659DH-Q1 , TMS320F28P659DK-Q1 , TMS320F28P659SH-Q1
有四种触发数据传输的方法,包括软件触发、外部触发 (EPWMx-SOCA/B)、使用 DMA 和硬件直通特性。对于软件触发方法,将 1 写入到 TX_FRAME_CTRL.START 寄存器位中或使用 driverLib 函数“FSI_startTxTransmit()”将开始传输。如果使用外部触发(例如 EPWMx-SOCA),则一旦发生外部触发信号,就会发送数据。
由于可以在每次通过 FSITX 或 FSIRX 模块完成数据帧发送或接收时生成 DMA 触发,因此它提供了一种方便的方法来传输和存储数据,尤其是海量数据。此处提供了使用 DMA 进行 FSI 通信的配置示例。
必须将 TX_OPER_CTRL_LO.START_MODE 设置为 0x2,这意味着向帧标签/用户数据字段写入数据可以触发传输,然后在 FSITX 上启用 DMA 事件:
FSI_setTxStartMode(FSITXA_BASE, FSI_TX_START_FRAME_CTRL_OR_UDATA_TAG);
FSI_enableTxDMAEvent(FSITXA_BASE);
需要使用两个连续的 DMA 通道来分别填充发送缓冲区和帧标签/用户数据字段。 依次使用两个通道,可以在设置帧标记和用户数据后,立即开始按照 TX_OPER_CTRL_LO.START_MODE 寄存器位中的配置进行传输。在示例代码中,使用了 DMA CH1 和 DMA CH2。此外,还务必注意,由于 FSI 发送缓冲区是一个 16 字的循环缓冲区,因此必须对超过 16 个字的数据启用饱和控制,否则超过 16 个字的数据会出现长度溢出。
DMA_configWrap(DMA_CH1_BASE, DMA_TRANSFER_SIZE_IN_BURSTS, 0, dest_WrapSize, 0);
此处,dest_WrapSize 表示在目标地址绕回之前要传输的脉冲数,因此 dest_WrapSize 应该为 16/nWords。这可以实现为使 DMA 连续向发送缓冲区馈送数据(由 FSITX 触发,DMA 连续模式启用)。
FSIRX 的配置与 FSITX 非常相似,不同之处在于,对于 RX 缓冲区和标签以及用户数据,DMA 通道没有顺序要求。在示例项目中,使用了 DMA CH3 和 DMA CH4。
利用硬件直通特性,可以在每个节点器件接收传入数据包的同时传输该数据包。这样一来,与其他触发模式不同,每个器件不必等到接收到数据包之后,就可以将其传输到菊花链中的下一个器件。有关此特性的更多详细信息,请参阅 F280039C 器件 TRM。要启用此特性,需要设置 TX_OPER_CTRL_LO.TDM_ENABLE 和 TX_OPER_CTRL_LO.SEL_TDM_IN 寄存器字段。或者,可以使用下面的 driverLib 函数。
FSI_enableTxTDMMode(FSITXA_BASE);
FSI_enableRxTDMMode(FSITXA_BASE);