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.

[参考译文] TMS570LS0914:SPI 消息的传输被中断

Guru**** 2539500 points
Other Parts Discussed in Thread: TMS570LS1224

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/923086/tms570ls0914-transmission-of-an-spi-message-is-interrupted

器件型号:TMS570LS0914
主题中讨论的其他器件:TMS570LS1224

在我的应用中、我使用 Mibspi5传输6 * 8位消息数据包。 我观察到、消息的传输会中断。 在我的示例中、首先发送5个字节、仅在大约2ms 后发送剩余字节。

传输未完全完成的情况如何?

该图显示了传输的信号。 最后一个段显示最后一个字节在很晚的时候发出。

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

    在这里、我有另一个中断时间较短的示例。

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

    从第二张图片中、我注意到在短时间间隔后首先传输了4个字节(第一个+第二个+第三个+第四个)、然后传输了2个字节(第六个+第七个或第五个+第六个)。 但您传输了5个字节+ 2个字节、并且一个字节(第5个字节或第7个字节)丢失。 我的理解是否正确?

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

    您好!

    始终发送6字节的数据包。 在图片上可以看到6个字节、其中首先发送的是前4个字节(第一个+第二个+第三个+第四个字节)。 只有在短暂中断后、另两个(第5个+第6个)才会发生。

    在此传输过程中不会丢失任何字节。 但是、字节之间有一个暂停。

    此致

    康斯坦蒂

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

    您好、再说一次、

    在每次传输之前、中断应使用_disable_interrupt_()停用;发送后立即从 sys_core.h 中通过_enable_interrupt_()再次打开中断;

    为了进行测试、我创建了一个 while 循环、其中禁用了中断并且只发送了一条消息。 显然、我仍然能够通过 mibspi5中断接收响应。

    那么、没有使用函数_disable_interrupt_()禁用中断;?

    此致

    Konstanty Kuczynski

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

    您好 Konstanty、

    很抱歉我没有仔细阅读您的消息。 尽管有7个字。 SPI 本质上是同步的、因此每个字之间的小间隙不应导致问题。  

    有几个因素可能会影响延迟:

    如果 CSHOLD 未置位、则 CS 建立时间(C2TDELAY+2 VCLK 周期)和保持时间(C2ELAY VCLK 周期)。 最短建立时间为 2VCLK 周期

    2.如果启用 WDELAY,则2个字之间的延迟为(WDELAY+2 )*VCLK 周期

    如果未启用 WDELAY、则如果 CSHOLD 未置位、两个字之间至少有2VCLK 周期延迟。

    disable_interrupt_()将在 CPU 级别禁用 IRQ 和 FIQ。 当字从 SPIDAT 或 TXBUF 寄存器复制到移位寄存器时、TXINTFLG 仍应置位。 但 在调用_enable_interrupt_()之前不会生成 IRQ 或 FIQ 中断。

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

    您好 QJ、

    我必须添加一些描述不是很正确的内容。 我使用 SPI4发送消息、使用 MibSPI5接收消息。

    我再次检查了配置。 CSHOLD 被置位且 WDELAY = 0。  VCLK 频率为60MHz、这意味着一个周期持续16.67ns。

    设备在短距离内没有问题(例如从第二张图片中)。 但是、传输期间的2ms 中断会导致问题、从而使器件不响应此消息并检测到错误。

    我刚刚禁用了所有其他中断(定时器中断除外)作为测试。 在传输过程中、仍然会有2ms 中断的消息。

    是否还有其他可能导致问题?

    此致

    Konstanty Kuczynski

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

    如果 CSHOLD=1、且 WDELAY=0、  则消息之间的延迟  是 由 SPI 传输中的开销引起的。 您是否使用轮询模式进行数据传输?

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

    是的、我使用轮询方法。

    此时开销意味着什么? 我如何避免这种情况?

    此致

    Konstanty Kuczynski

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

    您好!

    spiTransmitData()函数也发送数据和接收数据。 我刚刚检查了 spiTransmitData()中 while ()循环的反汇编代码,我认为开销不应该是那么长(2ms)。

    突出显示的指令将数据写入 SPI_DAT1寄存器以进行传输。

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

    您好!

    我只是在 TMS570LS1224 Launchpad 上运行测试、 2个字之间的延迟小于1us (CSHOLD=0)

    HCLK=160MHz;VCLK=80MHz、并且 SPI 波特率= 1mbps;charlen=16;data=0xaaa5、0xaaa5、0xaaa5、 (笑声)

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

    您好!

    感谢您的支持。

    通常(大部分)消息之间的距离也很小。

    如果这是系统中中断消息发送的另一个中断,我仍然不明白为什么我不能通过调用_disable_interrupt_()来避免这种情况。 如果我在传输期间关闭中断、则不会再发生中断。 或者我是否理解不正确?

    针对我们的应用进行了最小调整的 tran想念 函数如下:

    静态 SPI_STATUS_t SPI_TMS570LS_transmitPolling (const SPI_CommInterfaceConfig* comConfig、uint8_t length、const uint16_t * dataTx)
    {
    SPIRegister* spiRegister = SPI_TMS570LS_getChannel (comConfig->spiChannel);
    volatile uint32_t dataRx;
    
    uint32_t transmitData =((uint32_t) comConfig->format << 24U)|((uint32_t) comConfig->chipSelect << 16U)|
    (((uint32_t) SPI_TMS570LS_DELAY_COUNTER_ENABLE << 26)|((uint32_t) SPI_TMS570LS_CHIP_SELECT_HOLD_CONFIG << 28);
    
    uint8_t nrOfData = comConfig->dataLength;
    if (comConfig->dataLength ==0)
    {
    nrOfData =长度;
    }
    
    while (nrOfData!= 0U)
    {
    if ((spiRegister->FLG & 0x000000FFU)!=0U)
    {
    中断;
    }
    
    if (nrOfData = 1U)
    {
    transmitData &=~(1U <<SPI_TMS570LS_CS_HOLD_ACTIVE_ACT_POS_POS);//在最后一次传输后禁用 CS
    }
    
    spiRegister->DAT1 =(transmitData & 0xFFFF0000u)|(uint32_t)*数据发送;//发送数据
    dataTx++;
    
    uint16_t TIMEOUT = spiWaitForTransactionFinished (spiRegister、0xFF);
    if (超时==0U)
    {
    中断;
    }
    
    dataRx = spiRegister->BUF; //清除接收缓冲区
    nrOfData--;
    }
    
    返回 SPI_TMS570LS_evalateFailureState (spiRegister、(uint8_t)(spiRegister->FLG & 0xFFU));
    } 

    此致

    Konstanty Kuczynski

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

    您好 Konstanty、

    代码看起来不错。 您可以使用 PMU 来测量超时函数使用的 CPU 周期。 我觉得不应该花那么长的时间、我的测试延迟很短。