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.

[参考译文] TM4C1290NCZAD:如何清除 Tx FIFO

Guru**** 2928980 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/1019634/tm4c1290nczad-how-to-clear-the-tx-fifo

器件型号:TM4C1290NCZAD
Thread 中讨论的其他器件:EK-TM4C1294XL

你(们)好

关于 TM4C1290的 SSI、如何清除 Tx FIFO? 当 TM4C 用作 SPI 从器件时、它将从主器件接收数据并发回数据。 主器件有时需要复位、因此从器件 Tx FIFO (TM4C 侧)中剩余一些数据。 下一次主器件必须发送多个虚拟字节来清除从器件的 Tx FIFO。

现在,客户使用另一种方法,他们按如下方式重置 SPI 模块,但他们发现第一个字节仍然是从上次接收到的字节,这使他们感到困惑。(原因是什么?)

代码:

      ROM_SSIDisable (SSI2_base);

      ROM_SSIConfigSetExpClk (SSI2_base、120000000、SSI_FRF_MOTO_MOTO_1、SSI_MODE_SLAVE、120000、 16);

      ROM_SSIEnable (SSI2_base);

 

因此、我们可能需要您深入了解、以解释上述情况的原因并阐明如何清除 TM4C 的 SPI Tx FIFO。谢谢。

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

    您好、Shafeng、

    [引用 userid="420898" URL"~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1019634/tm4c1290nczad-how-to-clear-the-tx-fifo ]现在,客户使用另一种方式,按如下方式重置 SPI 模块,但发现第一个字节仍然是上次接收到的字节,这使他们感到困惑。

    您能否再次详细说明该行为? TXFIFO 上的第一个字节是否与  RXFIFO 上接收到的字节相同?  或者、您是说 TX 引脚上传输的内容是 TXFIFO 中早期的字节之一吗? 数据表中有以下说明。 请注意、当您禁用 SSI 模块时、它不会清除 TXFIFO。 重新启用 SSI 后的 TXFIFO 可以为空、也可以不为空。 如果重新启用 SSI 后 TXFIFO 恰巧为空、则状态机将发送第8个最新值。 如果 TXFIFO 碰巧不为空、那么当 TXFIFO 变为空时、这些字节将被发送0。 为了解决您描述的问题、我仍然认为您的第一种方法是正确的处理方法-主器件发送几个虚拟字节来清除从器件的 TXFIFO。 请记住、从器件无法知道主器件已在中间复位。 从器件  只需要从主器件获取 SPICLK。 接收到时钟后、它将开始发送 FIFO 中剩余的任何数据。

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

    你(们)好,查尔斯

    感谢您的回复~是的、我的意思是在 TX 引脚上传输的数据是 Tx FIFO 中早期的字节之一、只有一个字节、下一个数据是来自 DMA 的字节。 而且每次都可以重复、FIFO 可以是空还是不空都很棘手。

    此外、仍有一些要点需要您的帮助来澄清:

    [引用 userid="93620" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1019634/tm4c1290nczad-how-to-clear-the-tx-fifo/3768567 #3768567"]请注意,禁用 SSI 模块时,不会清除 TXFIFO[/引用]

    那么、我们如何清除 Tx FIFO 呢? 仅通过下电上电复位?

    启动例程如下所示、如果主器件脱机、从器件将运行此例程(主器件将通过 GPIO 通知从器件)

    void SafeMcuSsiStartUp(uint8_t * RxBuffAddr,uint32_t RxBuffSize,uint8_t * TxBuffAddr,uint32_t TxBuffSize)
    {
    	uint32_t rsv;
    	
    	ROM_SSIDisable(SSI2_BASE);
    	ROM_SSIConfigSetExpClk(SSI2_BASE, 120000000, SSI_FRF_MOTO_MODE_1, SSI_MODE_SLAVE, 120000, 16);
    	ROM_SSIEnable(SSI2_BASE);
    		
    	while((HWREG(SSI2_BASE + SSI_O_SR) & SSI_SR_RNE) != 0)
    	{
    		rsv = HWREG(SSI2_BASE + SSI_O_DR);
    	}
    	rsv = rsv;
    	SSI1RxNum = 0;
    	ROM_SSIIntEnable(SSI2_BASE, SSI_DMATX);												
    	ROM_uDMAChannelTransferSet(
    															UDMA_CH13_SSI2TX|
    															UDMA_PRI_SELECT,
    															UDMA_MODE_BASIC,
    															TxBuffAddr,
    															(void *)(SSI2_BASE + SSI_O_DR),
    															(TxBuffSize/2)
    														);
    	ROM_uDMAChannelEnable(UDMA_CH13_SSI2TX);														
    }

    2.他们使用的方法是放弃第一个字节,但我认为如果我们不能解释这一点,这是不可靠的。 那么、您对重新启动通信的建议是什么?

    期待您的回复、谢谢!

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

    您好、Shafeng、

    除了重启复位、另一种方法是完全禁用 SSI 外设并重新配置。 我的理解是、这也会清除 FIFO。 这比完全 POR 更好。

    我还要让查尔斯分享他对重新开始沟通的想法、他可能有不同的想法、 但我想发送虚拟字节来清除 FIFO、然后恢复与某种形式的"尝试"数据包的通信、以提示从器件发送"丢失"数据。

    此致、
    Ralph

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

    您好、Shafeng、

     按照 Ralph 的建议、您是否尝试通过调用 SysCtlPeripheralReset (SYSCTL_Periph_SSI2)来重置 SSI 模块?

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

    客户已尝试通过调用外设复位来重置 SSI 模块、但无法清除 Tx FIFO、内部仍有一些以前的日期。 从您的角度来看、最好的方法是发送虚拟数据来刷新 FIFO、对吧?

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

    你(们)好,查尔斯

    BTW、对于复位、您是否可以在 EVM 板上进行测试以进行交叉检查? 客户还抱怨我们没有提供从模式演示、我们能否提供从模式的官方演示?

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

    您好、Shafeng、

    [引用 userid="420898" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1019634/tm4c1290nczad-how-to-clear-the-tx-fifo/3772961 #3772961"]客户已经尝试通过调用外设复位来重置 SSI 模块、但无法清除 Tx FIFO、内部仍有一些以前的日期。 从您的角度来看、最好的方法是发送虚拟数据来刷新 FIFO、对吧?

    没错。 最好的方法是主器件向从器件发送虚拟时钟以清除 FIFO。  

    您可以在下面的示例中找到主从通信的演示。  

    C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\ssi_master_slave_xfer

     C:\ti\TivaWare_C_Series-2.2.0.295\examples\peripherals\SSI 中还有一些示例。

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

    你(们)好,查尔斯

    另外一件需要与您确认的事情是、客户反映了该问题:

    "在 TX 引脚上传输的是 Tx FIFO 中早期的字节之一、只有一个字节、下一个数据是来自 DMA 的字节。"

    将会发生的情况

          ROM_SSIDisable (SSI2_base);

          ROM_SSIConfigSetExpClk (SSI2_base、120000000、SSI_FRF_MOTO_MOTO_1、SSI_MODE_SLAVE、120000、 16);

          ROM_SSIEnable (SSI2_base);

    您能否帮助确认使用这些代码对 FIFO 有何影响?

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

    您好、Shafeng、

    我认为我们没有办法充分确认这将如何影响 FIFO。 器件数据表中未明确说明这种情况下的行为。 我们的期望是、当外设完全禁用并重新启动时、FIFO 会被清除、 但是、我们不能确认在不同的工作情况和器件上进行的所有尝试是否都是这样的、这就是避免这种情况的最佳方法是使用虚拟时钟清除 FIFO 的原因。

    此致、

    Ralph Jacobi