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.

[参考译文] TMS570LS3137:如何保持 MibSPI 从器件发送7字传输组数据一致性?

Guru**** 2541030 points
Other Parts Discussed in Thread: TMS570LS3137

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1369275/tms570ls3137-how-to-maintain-mibspi-slave-transmit-7-word-transfer-group-data-coherency

器件型号:TMS570LS3137

工具与软件:

大家好、我正在将  TMS570LS3137 MIBSPI5用作从器件。  我们将 在一个传输组(单芯片选择生效)帧中传输7个16位字。  

每个 SPI 传输 从器件 发送7 16位从器件状态并且接收来自主器件的7 16位新命令。

主器件控制 SPI 事务的时序, 事务与从器件异步,使用 mibspiSetData()定期更新 TXRAM 缓冲区。

我们担心、当主器件在从器件更新 TXRAM 缓冲区中的7个数据字的过程中发送 SPI 事务时会发生什么情况。

我们担心前3个16位字可能会从从机发送到主机、然后从机状态数据会更新、帧的后4个字可能与从机状态发送数据的前3个字不一致。

虽然似乎每个16位字都被   单次移动到 TX 移位寄存器(根据《TMS570LS31x/21x 16/32位 RISC 闪存微控制器技术参考手册》的第25.2.2.1节、见下文)、我们如何确保我们的7个16位从传输组作为一个相干数据块进行传输?

谢谢。  

-乔

___________________

25.2.2.1写入 SPIDAT0或 SPIDAT1时的数据时序
•如果 TX 移位寄存器和 TXBUF 都为空、那么数据就直接被复制到 TX 移位寄存器中
寄存器。 对于带有 DMA 的器件、如果 DMA 被启用、一个发送 DMA 请求(TX_DMA_REQ)被
生成以导致提取下一个字。 如果使能了发送中断、则表明发送器已空
中断被生成。
•如果 TX 移位寄存器已满或处于移位过程中并且如果 TXBUF 已过期、则数据将
写入 SPIDAT0/SPIDAT1被复制到 TXBUF、TXFULL 标志同时设置为1。
•当一个移位操作完成时、来自 TXBUF 的数据(如果已满)被复制到 TX 移位寄存器中
TXFULL 标志清零、以指示可以提取下一个数据。 发送 DMA 请求
(如果使能)或发送器空中断(如果使能)将同时产生。

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

    您好、Joe!

    [quote userid="556383" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1369275/tms570ls3137-how-to-maintain-mibspi-slave-transmit-7-word-transfer-group-data-coherency 我们担心从机向主机发送前3个16位字,然后从机状态数据就会更新,并且帧的下面4个字可能与从机状态传输数据的前3个字不一致。

    我认为这不会发生。 根据我 对 Mibspi 的理解、它取决于 TGxCTRL 寄存器中的 TGENA 位。

    实际上、对于从端的数据传输、我们首先会调用"mibspiSetData"函数来将数据初始化为 MibSPI RAM、然后我们会调用 mibspiTransfer 函数、对吗?

    在这里、在这个 mibspiTransfer 函数中、我们将为相应的传输组启用 TGENA 位。

    例如、如果从器件正在更新  MibspiSetData 数据函数中的数据并且没有设置 TGENA 位、如果在这种情况下、主器件发送时钟并尝试从从器件接收数据、则 MibSPI RAM 中的数据将不会进行传输、而是全0或全1将获得传输、具体取决于拉电流状态。

    如果设置了上拉、则所有1都将被接收到主器件。

    注:
    复位后、该 TGENA 位最初将为0、但在我们通过设置该位进行首次传输后、它将仅处于设置状态、我们应在使用 mibspiSetData 执行数据初始化之前手动清除它。 如果我们没有将这个位复位(TGENA=1)、如果主器件在这种情况下发送时钟、那么 MibSPI RAM 中的数据将获得直接传输、我的意思是如果从器件更新3个8字节的字节、那么主器件将接收前3个字节的更新数据和接下来5个字节中的旧数据。

    因此、您可以使用 TGENA 控制来自从器件的数据、我的意思是、如果您接收全1、那么您可以考虑主器件侧未更新的从器件数据。 但这也不是一个好方法、因为如果从器件仅尝试发送全1、该怎么办。

    好方法是需要在最后的字节中添加一些校验和或 CRC。 如果 CRC 匹配、则主器件可以处理数据、如果 CRC 不匹配、则主器件可以再次向从器件请求数据。

    --
    谢谢。此致、
    Jagadish。

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

    感谢 Jagadish 的建议。  

    在《TMS570LS31x/21x 技术参考手册》第25.9.34节"TGX 控制寄存器(TGxCTRL)"中、关于 TGENA:

    "TGX 使能。
    如果正确的事件(TRIGEVTx)发生在所选源(TRIGSRCx)上、那么组传输
    如果没有较高优先级的 TG 处于主动传输模式、或者如果一个或多个较高优先级的 TG
    传输暂停模式。
    在传输正在进行时禁用 TG 将完成正在进行的字传输、但不会完成整个
    组传输。"

    如果从器件异步清零 TGENA、我们仍然可以 在传输过程中中断传输 group.in --导致在传输组的剩余部分中所有1都被发送给主器件。

    我们已在 传输组中定义了校验和、因此我们将计划使用它来丢弃不一致/校验和不匹配的任何帧。

    此致!