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.

[参考译文] TM4C1231E6PZ:从模式下的 SPI 通信

Guru**** 2511415 points
Other Parts Discussed in Thread: TM4C1231E6PZ

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1271434/tm4c1231e6pz-spi-communication-in-slave-mode

器件型号:TM4C1231E6PZ

团队成员:

 我的客户使用 TM4C1231E6PZ、我们有 一个问题要问。 TM4C1231E6PZ 芯片使用 SPI 通信并用作从器件。
如何判断主机已完成数据发送?  通过 DMA 在主从之间发送。
是否可以使用函数 uDMAChannelIsEnabled (MASTER_SSI_UDMA_RX_CHANNEL)和 SSIBusy (MASTER_SSI_BASE)确定它?

因为我们发现了以下问题:

程序代码如下:
tem1 =(_Bool)((uDMAChannelIsEnabled (MASTER_SSI_UDMA_RX_CHANNEL))||(uDMAChannelIsEnabled (MASTER_SSI_UDMA_TX_CHANNEL)))
if ((tem1 ==(_Bool) false))
{
uDMADisable ();
……………………


发现主 SPI 仍在发送数据、但"如果"为真、则从 SPI 关闭中断。
如`s 所示、请帮助确认客户的程序配置是否有问题? 请提供参考配置。 Tks ~ć

有关详细信息:

 

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

    您好!

    [quote userid="515753" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1271434/tm4c1231e6pz-spi-communication-in-slave-mode TM4C1231E6PZ 芯片使用 SPI 通信并用作从设备。
    如何判断主机已完成数据发送?  [/报价]

     作为一个受控器件时、它使用由主器件提供的 SPICLK 作为发送和接收数据的参考时钟。 从器件无法知道主器件要发送多少数据。 假设主器件要发送10个字的数据、它将在 MOSI 上生成 SPICLK 和数据。 接收 SPICLK 时、从器件将根据 MISO 发送从器件数据。 只有主器件知道它有10个字要发送、从器件知道。 主器件可以将信息嵌入到包含主器件将发送的数据字节数的标头字节中。 但这是一个由用户定义的系统级协议。  

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

    Tsal 您好:

     很多 tks 为评论。

     今天、我将拜访客户、深入了解有关此问题的更多详细信息。

     我想之前的描述中有一个错误。

    C2=MOSI  

    C1 = MISO

    C3 =主器件 SPI 的同步递增信号、当主器件完成 DMA TX 传输时、翻转 C3电压电平。 (但从 SPI 不处理此信号)

    c4=从主器件将检测 RX DMA 状态并执行以下步骤:(目标是确保从器件 SPI RX 和 TX DMA 已完成、则意味着 RX 已接收所有数据。)

    tem1 =(_Bool)((uDMAChannelIsEnabled (MASTER_SSI_UDMA_RX_CHANNEL))||(uDMAChannelIsEnabled (MASTER_SSI_UDMA_TX_CHANNEL)))
    if ((tem1 ==(_Bool) false))
    {
    uDMADisable ();
    ……………………

    //从检测到执行的时间是50us

    //翻转 C4电压电平

    当主器件 SPI 检测到 带有边沿触发的 C4信号反转,时、主器件 SPI 将开始使能 DMA 发送数据。 当它完成时, 翻转 C3电压电平,这样一个循环。

    因此, 基于同步逻辑的上述外部引脚,客户可以到达点对点全双工 TX/RX。

    但客户发现一些随机问题、即 在 MOSI 仍在传输时从 DMA 将提前禁用。

    在正常情况下,所有信号均 已完全接受。

    以下是从 SPI 的初始代码:

    e2e.ti.com/.../void-spi_5F00_init_2800_void_2900_.txt

    感谢您可以帮助评论 MISO 在传输过程中会丢失部分数据的原因。 又是个问题。

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

    tem1 =(_Bool)((uDMAChannelIsEnabled (MASTER_SSI_UDMA_RX_CHANNEL))||(uDMAChannelIsEnabled (MASTER_SSI_UDMA_TX_CHANNEL)))
    if ((tem1 ==(_Bool) false))
    {
    uDMADisable ();
    ……………………

    //从检测到执行的时间是50us

    //翻转 C4电压电平

    [/报价]

    您是否可以尝试 DMAChannelModeGet ()来确定传输是否完成? 它有什么不同?

    下面是使用 SSI0的示例。 您可能使用了不同的 SSI 模块。  

     如果(DMAChannelModeGet (UDMA_CHANNEL_SSI0RX | UDMA_PRI_SELECT)= UDMA_MODE_STOP)

    {

    uDMADisable ();
    ……………………

    //从检测到执行的时间是50us

    //翻转 C4电压电平

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

    Tsai 您好:

     酷! 这是一个很大的问题。

     对于系统级, DMAChannelModeGet () 和 uDMAChannelIsEnabled ()的主要区别是什么?  

     正如我所看到的,当传输完成后,DMAChannelModeGet  模式为  uDMA_mode_stop。

     对于 uDMAChannelIsEnabled () ,它 可以检查是否启用了特定的 uDMA 通道,当传输完成时,通道会自动禁用,因此  可以检查错误状态。  

     那么正如我看到的、它们都适合检测 DMA 状态、有什么我漏掉了吗?

     感谢您的评论。

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

    您好!

     当您使用  uDMAChannelIsEnabled 来确定通道的状态时、可能会在数据实际完全传输之前禁用通道。 例如、假设总共要传输100个字节、而剩下4个字节要传输。  由于 UDMA 知道这4个字节是最后4个字节、因此它可能在开始传输这些字节时立即禁用了通道。 但是、传输实际上需要一些周期才能完成。 这可能是您看到  uDMAChannelIsEnabled 中的值表示它已完成但传输仍在进行的原因。 我希望通过使用  udma_mode_stop、可以在更新通道状态之前实际等待传输完成。