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.

[参考译文] Starterware/AM3359:SPI 驱动程序问题-启用主模式后、SPIEN 设置为低电平

Guru**** 2595805 points
Other Parts Discussed in Thread: AM3359, AM3354

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/582508/starterware-am3359-spi-driver-issue---spien-set-to-low-after-master-mode-enabled

器件型号:AM3359
主题中讨论的其他器件: AM3354

工具/软件:Starterware

嗨、大家好

我正在尝试使 AM3359能够通过 McSPI 与 Winbond W25Q128FV 串行闪存通信。
电路板是定制的、但闪存芯片组装正确-从 U-Boot 访问时工作正常。

我正在使用 PDK_AM335x_1_0_5 SPI_v1驱动器(非 DMA)。
打开 SPI 句柄(SPI_Open)时、我看到启用 McSPI 控制器的主模式后 CS 线路设置为0。

它如下所示:

   /*重置 SPI 外设*/
  McSPIReset (hwAttrs->baseAddr);  // SPIEn_0为高电平

   (笑声)

   if (spi_master == params->mode)
   {
     /*启用 SPI 主设备*/
     McSPIMasterModeEnablehwAttrs->baseAddr;     // SPIEn_0立即设置为低电平

   (笑声)

问题是、之后它永远不会恢复高电平、看起来 McSPI 控制器根本不会驱动它。
我真的不知道发生了什么。 根据 TRM、它应该由 McSPI 驱动、 只有在传输期间被置为有效(被设定为低电平)。

有什么想法、为什么会发生这种情况?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    伊利亚
    您是否从 C:\ti\pdk_am335x_1_0_5\packages/MyExampleProjects\MCSPI_BasicExample_icev2AM335x_armExampleProject 运行示例?
    对于连接在客户电路板上的引脚、您是否具有与 ICEv2相同的布局?

    否则、您可能需要更改引脚多路复用器以确保正确运行。

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

    感谢您的回答、Lali。

    作为示例代码、我使用过
    C:\ti\pdk_am335x_1_0_5\packages/ti\drv\spi\test\mcspi_serial_flash\src\main_mcspi_dma_serial_flash_read_write.c

    但不启用 DMA。 我已经检查了 Board_init()和所有基础函数,因此我为 mcspi 引脚启用了时钟和 pinmux。
    在我的情况下执行该操作的代码是的自适应代码

    C:\ti\pdk_am335x_1_0_5\packages/ti\board\src\evmAM335x\evmAM335x.c
    C:\ti\pdk_am335x_1_0_5\packages/ti\starterware\soc \am335x\am335x_prcm.c
    C:\ti\pdk_am335x_1_0_5\packages/ti\board\src\evmAM335x\evmAM335x_pinmux.c

    MCSPI 模块使能和引脚多路复用的一部分。 在本例中、它如下所示。

    // EnableMcSpiClock 是 enableModule 的适应(uint32_t domainOffset、uint32_t clkCtrlReg、.)
    //针对 CHIPDB_MOD_ID_MCSPI

    模板
    void EnableMcSpiClock()

      HwRegBlock CMRegs;

      cmRegs[HwDESC::ClkCtrlReg:.Field (CM_PER_SPI0_CLKCTRL_MODULEMODE).WriteThough (CM_PER_SPI0_CLKCTRL_MODULEMODE_ENABLE);

    //字段(bit).WriteTh毛 坯仅写入特定位(并且仅写入该位)
    //进入寄存器并等待它被设置为正确的值
    //和 HwRegBlock cmRegs;cmRegs[REG]-只是一个访问
    //目标寄存器、即 base + reg

      cmRegs[HwDESC::ClkStReg。Field (HwDESC::ClkActivityBit).WaitUtilSet ();

      cmRegs[HwDESC::ClkCtrlReg:.Field (CM_PER_SPI0_CLKCTRL_IDLEST).WaitUtilEquals (CM_PER_SPI0_CLKCTRL_IDLEST_FUNC << CM_PER_SPI0_CLKCTRL_IDLEST_SHIFT);

    结构 McSpi0HwDesc.

      静态 constexpr int moduleIndex = 0;
      静态 constexpr uint32_t Regs = SOC_SPI_0_regs;
      静态 constexpr uint32_t Int = SOC_INT_SPI0INT;

      静态 constexpr uint32_t PrcmRegs = SOC_CM_PER_regs;
      静态 constexpr uint32_t ClkCtrlReg = CM_PER_SPI0_CLKCTRL;
      静态 constexpr uint32_t ClkStReg = CM_PER_L3_CLKSTCTRL;
      静态保持 UINT32_t ClkActivityBit = CM_PER_L3_CLKSTCTRL_CLKACTIVITY_L3_GCLK;
    };

    模板类 McSpi ;

    (笑声)


    然后是 PinMux。 SPI 引脚的代码是

    (笑声)
    SetMux (control_CONF_SPI0_SCLK、  快速| IEn | PU | Mode0);
    SetMux (control_CONF_SPI0_D0、     FAST | IEN | PU | Mode0);
    SetMux (CONTRAL_CONF_SPI0_D1、     FAST | IEN | PU | Mode0);
    SetMux (control_CONF_SPI0_CS0、   快速| IEn | PU | Mode0);
    (笑声)

    空 SetMux (uint32_t 引脚、uint32_t val)

       HwRegBlock ()[PIN]= val;

    //快速= 0,
    // IEN = CONTRAL_CONF_RXACTIVE
    // pu = control_CONF_PULLUPSEL
    // mode0 = control_CONF_MUXMODE (0)


    希望这有助于澄清一点。。。

    谢谢!

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

    您好、Ilia、

    您可以通过查看存储器中的引脚多路复用寄存器来检查引脚多路复用器是否按预期设置

    引脚多路复用器位于 控制模块中 TRM http://www.ti.com/lit/pdf/spruh73的存储器映射部分中、基地址显示  为0x44E1_0000

    TRM 表 9-10中引脚 A 的位置

    偏移引脚名称寄存器说明部分

    950h     conf_spi0_SCLK      第9.3.1.50节

    954h     conf_spi0_d0      第9.3.1.50节

    958h     conf_spi0_D1     第9.3.1.50节

    95Ch    conf_spi0_cs0    第9.3.1.50节

    960h    conf_spi0_CS1     第9.3.1.50节

     

    管脚控制寄存器显示为9-1


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

    我已经检查了寄存器、它们看起来很好、不是吗?

    CONF_spi0_SCLK 0x00000030   

    CONF_spi0_d0 0x00000030

    CONF_spi0_D1 0x00000030

    CONF_spi0_cs0 0x00000030

    CONF_spi0_CS1 0x00000030

    0x00000030为 FAST (0)、rxactive (1)、PULLUGEL - PULLUP (1)、上拉/下拉使能(0)、多路复用模式(0)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Ilia、
    为了驱动一个输出、针对那个引脚的 RX 应该被禁用。

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

    谢谢、David。

    我已将引脚多路复用更改为这个

    CONF_spi0_SCLK 0x00000030
    CONF_spi0_d0 0x00000030
    CONF_spi0_D1 0x00000030
    CONF_spi0_cs0 0x00000010
    CONF_spi0_CS1 0x00000010

    0x00000030为 FAST (0)、rxactive (0)、PULLUGEL - PULLUP (1)、上拉/下拉使能(0)、多路复用模式(0)

    但不幸的是、其余的保持不变。

    SPI_Open 后、CS0立即变为低电平(McSPIMasterModeEnable)

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

    您好、Ilia、

    很抱歉、我应该早点注意到这一点。

    MCSPI_SerialFlash 示例( http://processors.wiki.ti.com/index.php/Processor_SDK_RTOS_QSPI-McSPI )是为 AM335通用 EVM http://www.ti.com/tool/tmdxevm3358开发 的。 此 EVM 仅使用 SPI0_CLK 和 SPI0_D0 与子系统上的 SPIFlash W25Q64通信。 每个 信号的 Pinmux 设置为0x20。  这些信号不直接连接到闪存。 相反、它们 会通过 CPLD 来传递、CPLD 在闪存上为 SPI_Clk、SPI_DI、SPI_DO 和 SPI_CS 提供输入。 SPI0_D1和 SPI0_CS0的引脚复用设置用于配置它们的 I2C 操作。

    有一个用于 AM335 ICE V2 EVM http://www.ti.com/tool/tmdsice3359 的 Starterware SPI 闪存读/写实用程序。 。  

    此 EVM 具有以下与 AM3359的直接连接。  针对这个的 Pinmux 设置为

    CONF_spi0_SCLK  0x00000028  
    CONF_spi0_d0   0x00000028  
    CONF_spi0_D1   0x00000000  
    CONF_spi0_cs0  0x00000000  

    该应用程序是 starterware mcspi_app_flash。 在构建时、还需要安装 Starterware 板、dal、device、example_utils、soc、 和实用程序。

    使用 CCS 6.2.1和 GNU v4.4.8在 Industrial SDK www.ti.com/.../sysbiossdk-ind-sitara 下构建此应用程序没有问题。

    我需要对如何 在 pdk_am335x_1_0_5下构建该示例进行一些研究

    David

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

    尊敬的 David:

    我仅将代码用作示例。

    我有一个定制板、但它具有非常简单的 SPI 闪存组件:

    因此、一旦我在 mcspi 上禁用 MasterMode、cs0就会恢复。

    我认为我使用的特定芯片可能有问题、但我在另一个(AM3354)芯片上看到的情况与我刚刚检查过的情况相同。