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.

[参考译文] RTOS/TM4C1292NCPDT:SPI 接口的 UDMA 总线错误

Guru**** 2393325 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/631028/rtos-tm4c1292ncpdt-udma-bus-error-with-spi-interface

器件型号:TM4C1292NCPDT

工具/软件:TI-RTOS

您好!

我已在 TI RTOS 环境中开发了 SPI-DMA 从站操作的代码,并使用 TivaTmC 系列 TM4C1294 EVM 板进行测试。 我在从主器件接收数据时遇到 uDMA 总线错误、并且由于特定通道被禁用的 uDMA 总线错误。 我面临两种情况。

场景1:当我在 BIOS 启动之前在主程序中使用以下代码时、DMA 工作正常、没有任何错误、但以太网接口不工作。  

SysCtlClockFreqSet (SYSCTL_OSC_INT | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480、120000000);
SysCtlMOSCConfigSet (SYSCTL_MOSC_PWR_DIS);

场景-2:同一个 SPI-DMA 驱动程序、我尝试删除以下代码行、因为它关闭了 EMAC 和 PHY 器件使用的外部 OSC。 那么我的 SPI- DMA 会产生总线错误、并且无法接收数据。 以太网工作正常。

SysCtlMOSCConfigSet (SYSCTL_MOSC_PWR_DIS);

我想知道 UDMA 行为如何受到外部 OSC 的影响? 请建议解决方案以解决此问题。

我正在使用以下工具版本。

tirtos_tivac_2_16_01_14

NDK_2_25_00_09

BIOS_6_45_02_31

此致

巴拉

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bala、
    由于您需要向 PHY 提供25MHz MOSC、因此为什么不能将相同的 MOSC 用作系统时钟生成的时钟源?
    您能否执行 SysCtlClockFreqSet (SYSCTL_XTAL_25MHz | SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480、120000000);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    我尝试了以下不同的组合、并更新了下面的 DMA -SPI 驱动程序和以太网工作状态。

    DMA-SPI 驱动器仅在以太网不工作的情况下在以下组合中正常工作。

    SysCtlClockFreqSet (SYSCTL_OSC_INT | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480、120000000);

    SysCtlMOSCConfigSet (SYSCTL_MOSC_PWR_DIS);

     


    以下组合以太网的其余部分正常工作、SPI-DMA 驱动器不工作。

    案例1:

    SysCtlClockFreqSet (SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480、120000000);

    SysCtlMOSCConfigSet (SYSCTL_MOSC_PWR_DIS);

     

    案例2:

    SysCtlMOSCConfigSet (SYSCTL_MOSC_PWR_DIS);

    案例3:

    SysCtlClockFreqSet (SYSCTL_OSC_INT | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480、120000000);

     

    案例4:

    SysCtlClockFreqSet (SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480、120000000);

    情况5:

    如果不在我的程序中添加这些编码中的任何一个。 默认配置运行的 EVM 板。

     

    这是我的主代码。 其中我使用 SSI0进行 SPI-DMA 传输。

    int main (空)

    /*评估板初始化函数*/
    Board_initGeneral();

    /*时钟源集。 这是我尝试不同组合的地方*/

    SysCtlClockFreqSet (SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN| SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480、120000000);
    SysCtlMOSCConfigSet (SYSCTL_MOSC_PWR_DIS);

    Board_initGPIO();
    Board_initI2C();
    Board_initUART();
    Board_initSPI();
    UARTUtils_systemInit (0);
    Board_initEMAC();

    /*指示 BIOS 启动的 LED 亮起*/
    GPIO_WRITE (Board_LED0、Board_LED_ON);

    /*启动 BIOS */
    BIOS_start();

    返回(0);



    我在这里缺少什么吗?

    此致

    巴拉

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bala、
    查看 TivaWare 以太网示例、我可以看到以下时钟配置。 您能否通过添加来执行相同操作并查看您是否看到任何差异 SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ)?


    //
    //确保主振荡器已启用,因为这是所要求的
    // PHY。 系统必须将一个25MHz 晶体连接到 OSC
    //引脚。 晶体时使用 SYSCTL_MOSC_HIGHFREQ 参数
    //频率为10MHz 或更高。
    //
    SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ);

    //
    //从 PLL 以120MHz 运行。
    //
    G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    我已经按照您的建议尝试设置时钟、但我的 DMA-SPI 问题尚未解决。

    下面的时钟设置我已经在主代码中完成了。

    G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000);
    SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ);

    关闭外部时钟电源会影响在具有内部时钟频率的系统时钟上运行的 DMA 操作、原因可能是什么? 尤其是以下代码
    SysCtlMOSCConfigSet (SYSCTL_MOSC_PWR_DIS);


    此致
    巴拉
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bala、
    我没有答案。 您是否仍然尝试在代码中包含 SysCtlMOSCConfigSet (SYSCTL_MOSC_PWR_DIS)? 如果使用 MOSC 作为 PLL 的时钟源、则不应禁用 MOSC。

    如上所示、我没有看到时钟设置有任何错误(使用 SysCtlMOSCConfigSet (删除了 SYSCTL_MOSC_PWR_DIS)。 您可以保持相同的时钟设置、并编写一个没有以太网的简单 DMA-SPI 测试用例、并证明它可以正常工作。 如果没有、我们就可以调查发生了什么。

    当您说 dma-SPI 不工作时、您能不能是特定的? 您是否在 SPICLK 和 SIMO 以及 SOMI 引脚上看到任何活动? 检查 SSI 控制/状态寄存器和 UDMA 控制/状态寄存器、它们是否设置正确?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    我的 DMA-SPI 代码单独使用 EVM 板设置的默认时钟正常工作。 仅当我们在主函数中启用 Board_initEMAC()时才会出现问题。

    启用 EMAC 初始化函数时、会产生 DMA 总线错误标志。

    我没有在 SPI DMA 代码中设置上述任何源时钟。

    我还将根据下面的定义为 DMA -SPI salve 操作设置 SPI 时钟源。

    /*配置 SSI 通信参数。 *
    SSIConfigSetExpClk (SSI0_BASE、SysCtlClockGet ()、
    SSI_FRF_MOTO_MODE_0、
    SSI_MODE_SLAVE、4000000、8);
    SSIClockSourceSet (SSI0_BASE、SSI_CLOCK_SYSTEM);

    启用以太网 MAC 时、这是否会对 DMA-SPI 数据传输产生任何影响?

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

    您好、Charles、

    在 SPI-DMA 从模式操作中发生 UDMA 总线错误时、我在此附上 SSI0和 UDMA 寄存器详细信息。

     

    以下参数 用于配置 SYSCLK。

    SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);

    SysCtlMOSCConfigSet (SYSCTL_MOSC_HIGHFREQ);

     

    SysCtlClockFreqSet()的返回值为120000000。 即120 MHz。

     

    以下参数 用于配置 SSI0通信。  


     SSIConfigSetExpClk (SSI0_BASE、120000000、 SSI_FRF_MOTO_MOTO_0、  SSI_MODE_SLAVE、4000000、 8);

     SSIClockSourceSet (SSI0_BASE、SSI_CLOCK_SYSTEM);

    尽快等待解决方案。

    此致

    巴拉

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bala、
    您使用的是哪个 TivaWare 版本?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Charles、

    我使用的是 TivaWare_C_Series-2.1.71b。

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

    您好、Bala、

     您能否尝试最新的 TivaWare 版本2.1.4.178。 您可以从此处下载  。 我想知道您是否遇到了 SYSCTL_22勘误表。  

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

    您好、Charles、

    我已经尝试使用 最新的 TivaWare 版本2.1.4.178运行、但没有 解决问题的方法。 由于 UDMA 总线错误、问题仍然存在。

    我获得的寄存器值与  我之前共享的最新 TivaWare 版本2.1.4.178相同。

    此致

    巴拉

     

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

    最后我发现了这个问题,默认的 EK_TM4C1294XL_initDMA ()函数定义了控制表的大小为32,即静态的 tDMAControlTable dmaControlTable[32];因此该控制表只为所有通道分配主控制结构体。

    我在乒乓模式下使用 SPI-DMA、它的 DMA 找不到替代控制结构、并且会导致 DMA 错误。 因此、我增加了 DMA 控制表大小64、以同时保持替代控制结构体。 现在工作正常。

    感谢您的支持。

    此致
    巴拉
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Bala、
    从您的角度来看、这很棒。 感谢您提供更新。 这将是论坛社区的宝贵建议。 我记得您同事的另一个话题、我建议他尝试非乒乓模式以简化调试。 总之、很高兴您的问题得到解决。