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.

[参考译文] TM4C1294NCPDT:在每次字节传输时都会插入 EK-TM4C1294XL SSI 等待状态

Guru**** 1565925 points
Other Parts Discussed in Thread: EK-TM4C1294XL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1330709/tm4c1294ncpdt-ek-tm4c1294xl-ssi-wait-states-are-inserted-at-every-byte-transfer

器件型号:TM4C1294NCPDT
主题中讨论的其他器件:EK-TM4C1294XL

您好!

我正在尝试优化 SPI 时序、我的目标是实现一个连续的时钟帧、字节之间没有任何暂停。
我使用 EK-TM4C1294XL 进行测试。

用户可通过下面的函数将 SSI 模块配置为主机模式:

  
    SSIConfigSetExpClk(SSI0_BASE, 120000000, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000, 8);


我的元件需要 SSI_FRF_MOTO_MODE_0 (空闲时钟为低电平、并在时钟的第一个边沿进行捕捉)
我使用 SSI0、它被配置为1MHz 时钟。

为了在配置后对其进行测试、我向 SPI FIFO 写入4个字节、以确保字节之间没有任何暂停:

HWREG(SPI0_BASE + SSI_O_DR) = 0;
HWREG(SPI0_BASE + SSI_O_DR) = 0;
HWREG(SPI0_BASE + SSI_O_DR) = 0;
HWREG(SPI0_BASE + SSI_O_DR) = 0;


我在 CLK 引脚上插入了一个示波器、用于观察字节流:



您可以在捕获图中看到、每个字节之间存在一个时钟暂停。

但是、如果我将格式更改为  SSI_FRF_MOTO_MOTO_1或   SSI_FRF_MOTO_MODE_3、则每个字节之间不会有停顿:



发现这一点后、我尝试了所有模式、似乎当相位为1时、每个字节之间存在一个 SPI 时钟暂停:
要恢复:

  • SSI_FRF_MOTO_MODE_0和   SSI_FRF_MOTO_MODE_2在每个字节之间暂停
  • SSI_FRF_MOTO_MODE_1和   SSI_FRF_MOTO_MODE_3 在每个字节之间不含暂停


文档中未指定每个字节之间存在暂停。
数据表中唯一指出存在暂停的部分是17.3.8 DMA Operation:

请注意:当双 SSI 或四 SSI 模式作为主机使用时、μ μDMA 的 SSICLK 频率大于系统时钟的1/6、在每个字节传输时就会插入等待状态

但是、我这里不使用 DMA。
请注意、我也尝试使用 DMA、但存在相同的行为。

您是否知道为什么在相位为1时流中有1个 SPI 时钟暂停?

此致。

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

    您好!

    chaojie guo said:
    发现这一点后、我试探了所有模式、似乎当 Phase 为1时、则每个字节之间有一个 SPI 时钟暂停:
    要恢复:

    • SSI_FRF_MOTO_MODE_0和   SSI_FRF_MOTO_MODE_2在每个字节之间暂停
    • SSI_FRF_MOTO_MODE_1和   SSI_FRF_MOTO_MODE_3 在每个字节之间不含暂停
    [/报价]

    该间隙是模式0和模式2设计所固有的。 您针对的是哪种类型的从器件和应用? 通常、从器件将等待主器件的 SPICLK 同步事务/使事务流化。 我想知道,如果存在一个小差距,哪种类型的奴隶不会工作。  

    有帧保持功能、不确定这是否有助于您的从设备。 它将在整个事务期间使 CS 保持有效状态。 当然、也可以手动使用 GPIO 来置位/控制 CS 信号。  

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

    您好!

    我的器件工作正常、它是一个 SPI 以太网芯片(NCN26010)、可通过高达25MHz 的时钟驱动该芯片。
    现在、我驱动它在1MHz 进行测试。

    在查看 SPI 时钟之后、我看到了间隙、它在传输时间方面不太理想。
    这里,在这种模式下,我失去了"时间"相比其他模式:

    例如、在这里、间隙释放时间用于传输另一个位、而不是暂停。

    因此、 当我传输 一个大约1500字节的完整以太网数据包时  、意味着在每  字节暂停一位的情况下、就每字节之间的"时间"暂停而言、1499位会丢失。

    这大约损失了12.5%的时间,因为这...

    所以我将不得不把时钟速度提高大约12.5%、"什么都不"、与不存在暂停的情况相比、在以太网芯片上获取相同的输出..

    你说" 该间隙是模式0和模式2设计固有的、 ",它是在哪里指定的?
    同一个芯片由 Raspberry 驱动、SPI 时钟内没有间隙、那么它是否为 Tiva SPI 限制?

    您是否有优化解决方案?

    此致

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

    您好!

     现在、我了解了消除间隙以获得最大吞吐量的原理。  

     这是一个很长的帖子、具有相同的讨论内容。 在这个帖子中的 Peter (接近线程末尾)有一些使用 QSSI 高级模式来消除间隙的代码片段。 请注意、他的代码只能删除由三个字节组成的24位流。 看看您是否可以在全部1500个字节中引用他的方法。 我在上一次答复中提到的帧保持功能也在他的代码中使用。

    https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/663485/tm4c129encpdt-qssi-hold-ssinfss-low-for-continuous-24-bit-transfer
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您指向该主题。
    我已在数据表中的所有地方查看过、阅读并重新读取它很多次、而没有任何线索!

    解决方案现在对我有用的转移是有效的。

    要恢复:

    这是一种黑客行为、它有效、但在数据表中不是定义的行为。

    如果使用 DMA、则必须使用手动 CS、因为您需要通过在传输的最后一个字节上稳定的特殊寄存器来结束传输、以便使 CS 无效、并且 DMA 无法自动执行该操作。

    解决方案驻留在这2行代码中(使用高级模式):

        SSIAdvFrameHoldEnable(SSI1_BASE);
        SSIAdvModeSet(SSI1_BASE, SSI_ADV_MODE_WRITE);

    但也有一个错误,说:



    因此 SSI1可能无法正常工作、因此最好使用 SSI0、SSI2或 SSI3。

    此致。