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.

[参考译文] AM2434:新版本 (CCS 20.2.0) PCIe 问题

Guru**** 2747405 points

Other Parts Discussed in Thread: SYSCONFIG, DP83826E

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1549359/am2434-new-version-ccs-20-2-0-pcie-issue

器件型号:AM2434
主题中讨论的其他器件:SysConfigDP83826E

工具/软件:

尊敬的 TI 专家:

 我的 CCS 版本是 CCS 20.2.0、 SDK 为 ind_comms_sdk_am243x_11_00_00_08。

 我们的设计是使用 PCIe 进行通信的 AM243x + Altera FPGA。 MCU 为 RC、FPGA 为 EP。

 在 SDK 演示后、 pcie_buf_transfer_rc(C:\ti\ind_comms_sdk_am243x_11_00_00_08\mcu_plus_sdk\examples\drivers\pcie_buf_transfer\pcie_buf_transfer_rc\am243x-evm)、我们开发了自己的 PCIe 工程。

 在旧版本的 CCS 12.4 和 SDK 9.2 中、我们的工程可在读写两方面正常运行。

 但是当我更新到新版本的 CCS 和 SDK 时、我们的工程无法读取、总是卡在这里、

 以下是我们项目的主要代码和新旧项目的屏幕截图。

内部 main (void)

      uint32_t * test =(uint32_t *)(0x68000000U + 0x010000000U);

      uint32_t READ_TEST = 0;

      system_init();

      BOARD_INIT ();

      drivers_open();

      HAL_PCIe_fpgaInit (gPcieHandle[CONFIG_PCIE0]);

      

      *(TEST+0)= 0x1f; //写入

      *(TEST+0)= 0x0;   //写入

      *(TEST+0)= 0x1;   //写入

      

      READ_TEST =*(TEST+0x140/4);  //读取、Isse 在此处

      

      BOARD_DEINIT();

      system_deinit();

      返回 0;

 

}

 

//这是我的 FPGA-PCIe 初始化函数。

 

int32_t HAL_pcie_fpgaInit((Pcie_Handle 句柄)

      int32_t 状态= SystemP_Success;

      pcieHandle =句柄;//gPcieHandle[CONFIG_PCIE0]

      

      //Drivers_open();//如果此驱动程序是此项目中唯一的驱动程序、则需要此行

      // Board_drivers Open ();//如果此驱动程序是此项目中唯一的驱动程序、则需要此行

      

      status = pcie_getVendorId (pcieHandle、pcie_location_remote、&vndId、&DevID);

      

      if (SystemP_Success!= status)

      {

             返回状态;

      }

      

      Status = pcieFpgaSetStatusCmd (pcieHandle);

      

      if (SystemP_Success!= status)

      {

             返回状态;

      }

      

      Status = pciefpgaEpBar1Cfg (pcieHandle);

      

      if (SystemP_Success!= status)

      {

             返回状态;

      }

      

      状态= pcieWriteDevStatCtrlReg (pcieHandle);

      

      if (SystemP_Success!= status)

      {

             返回状态;

      }

      pcie_initialized_inding = 1;

      返回状态;

 

}

   

用于旧工程的 SysConfig

用于新工程的 SysConfig

请帮助我解决这个问题、

BR、

春阳

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

    尊敬的 Chunyang:

    但当我更新到新版本的 CCS 和 SDK 时、我们的工程无法进行阅读、总是停留在这里、

    您是否尝试过在未进行任何修改的情况下运行 SDK v11.0 中的默认示例?

    上述示例是否适用于 CCS v12.8.1 和  ind_comms_sdk_am243x_11_00_00_08? 为了确保示例不会因 CCS 升级而中断、需要提供这些详细信息。

    此致、

    Tushar

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

    尊敬的 Chunyang:

    这是在 TMDS243 EVM 上吗? 定制硬件呢?

    如果是自定义硬件、基准时钟是如何分配的? 这是从通用时钟源到 AM24x 和 FPGA 的输入、还是您希望 AM24x 为 FPGA 生成时钟?

    下载 SDK 09.02。 00  到 09.02.01、PCIe 驱动程序已更改。 它们主要限于 EP 器件、但有一项影响 RC 功能的更改是基准时钟。 在 TI 评估板上、参考时钟是由板载时钟发生器驱动的输入、因此默认为“外部参考“。

    此致、

    Dominic

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否尝试过在没有任何修改的情况下运行 SDK v11.0 中的默认示例?

    我无法在两个 EVM 上运行默认 PCIe 示例、EVM 是否应该同时加电(或运行)? 我以前很成功,但现在忘了怎么做。

    上述示例是否适用于 CCS v12.8.1 和  ind_comms_sdk_am243x_11_00_00_08? 为了确保示例不会因 CCS 升级而中断、需要提供这些详细信息。

    是的  、在 CCS v12.8.1 上、 我们得到了相同的结果。

    BR、

    春阳  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是 TMDS243 EVM 吗? 或一些定制硬件?

    在 旧版本的 CCS 12.4 和 SDK 9.2 中、我都可以在 EVM 和我自己的电路板上成功运行、但使用新版本时、EVM 和我们的电路板也会出现此问题。

    如果是定制硬件、如何分配参考时钟? 这是从通用时钟源到 AM24x 和 FPGA 的输入、还是您希望 AM24x 为 FPGA 生成时钟?

    作为 EVM、我们自己的电路板还使用外部时钟。 MCU 和 FPGA 都有一个时钟源。

    至于新的 SDK、下面显示了许多新选项、我应该将它们保留为默认选项、还是应该更改其中一些选项?

    BR

    春阳

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 旧版本的 CCS 12.4 和 SDK 9.2 中、我可以成功地在 EVM 和我自己的电路板上运行、但使用新版本时、EVM 和我们的电路板也会出现此问题。

    大多数示例未针对“新“PCIe 驱动程序进行更新。 版本说明指出它们都已损坏、但 pcie_msi_IRQ_RC/EP 应该可以正常工作。 我尚未使用当前的 MCU+/Ind. 不过是 COM SDK。

    您能否使用两个 EVM 和 pcie_msi_irq 示例进行测试?

    对于新 SDK、下面显示了许多新选项、我应该将它们保留为默认选项、还是应该更改其中一些选项?

    默认值应该没有问题。

    根据您的描述、我想您会得到一个链接。 您能否验证 FPGA 中的 BAR 寄存器是否已正确编程? 我想您是在 pciefpgaEpBar1Cfg 中将它写入 0x70000000? 尝试查看 PCIe 配置空间(应为 0x68010000)并验证偏移量 0x14(如果 bar1 是第二个 bar)。

    如果正确配置 BAR、您应检查 0x0d400000 处的 ATU 配置寄存器。

    您能否展示 pciEfgaEpBar1Cfg 函数的代码? 如果您不仅要在这里写入 BAR 寄存器、还 需要通过 PCIE_atuRegionConfig(重新)对 ATU 进行编程 、则需要设置额外的 regionParams.enableRegion = 1、因为更新的驱动程序允许启用/禁用区域。

    此致、

    Dominic

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

    当然、下面是功能  

    静态 int32_t pcieFpgaEpBar1Cfg((Pcie_Handle 句柄)
     int32_t 状态= SystemP_Success;
     Pcie_Registers setRegs;
     Bar32bitIdx type0Bar32bitIdx; Pcie_Type  

     memset (&setRegs、  0sizeof (setRegs));
     type0Bar32bitIdx.reg.reg32 = ob_target_address;
     type0Bar32bitIdx.idx = 1
     setRegs.type0Bar32bitIdx =&type0Bar32bitIdx;

     status = pcie_writeRegs (handle、pcie_location_remote、&setRegs);

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

    嗨、 Dominic

    感谢您的支持、我们将按照您的说明进行进一步的故障排除。

    由于 PCIe 问题导致我们的项目开发受阻、在继续调查时、我想知道 TI 是否有任何计划更新 SDK 以解决 PCIe 问题。 如果是、我们预计何时发布下一个版本的 AM243x SDK? 谢谢你。

    此致、

    朱英

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

    您好:Zhuying、

    请注意、我不是 TI。 我不能谈论他们未来的计划。 如果您有 FAE、联系他们并解释您的要求可能是合理的。

    我认为 SDK 11.0(或 11.1)中没有任何基本损坏。 大多数示例都存在问题、但这些示例无论如何都不是很有用、因为它们仅考虑 AM64x<->AM64x 用例。

    驻地协调员的支持总是有限的。 我们在另一个工程中所做的是使用 PCIe 驱动程序的基础层来配置 PCIe 链路和配置地址映射、然后使用自定义代码来配置 EP。 我们还对 MCU+ SDK 中的 PCIe 驱动程序进行了一些更改、以便更好地支持 MSI 和 MSI-X 等功能、但基本上、您应该能够按原样使用 RC 驱动程序、并在此基础上实现其余的驱动程序。

    此致、

    Dominic

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

    尊敬的 Tushar:  

       现在、我们在两个  TMDS243 EVM (CCS12.4.0 和 CCS 12.8.1) 上测试以下演示

           C:\ti\ind_comms_sdk_am243x_09_00_00_03\mcu_plus_sdk\examples\drivers\pcie\pcie_buf_transfer

           C:\ti\ind_comms_sdk_am243x_11_00_00_08\mcu_plus_sdk\examples\drivers\pcie\pcie_buf_transfer

      对于 SDK 9.0、演示运行正常。

      对于 SDK 11.0、演示代码始终保留在此处:

     应该做

    CacheP_inv (dst_buf、BUF_SIZE * sizeof (uint32_t)、CacheP_TYPE_ALL);
    }while (dst_buf[BUF_SIZE - 1]!= 0xC0DEC0DEU);

    供您参考。

    谢谢、

    春阳  

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

    尊敬的 Dominic 和  Tushar:

     我想介绍一下我们采取的解决方法以及我们现在面临的问题。

     背景:

         我的 CCS 版本是 CCS 20.2.0、 SDK 为 ind_comms_sdk_am243x_11_00_00_08。

         我们的设计是使用 PCIe 进行通信的 AM243x + Altera FPGA。 MCU 为 RC、FPGA 为 EP。

     PCIe 的初始化过程:

         在 TI 的 Drivers_open () 之后,我们做一些配置来使 EP(我们的 FPGA)工作。

         额外的配置如下,我们将它们打包为 fpga_pcie_init () 函数:  

                  为 EP 设置 STATUSCmd
                  为 EP 设置 EpBar1Cfg
                  为本地设置 DevStatCtrlReg

     问题 1:

          根据 TI demo  examples\drivers\pci\pcie_buf_transfer、我们创建了一个 PCIe 测试工程、硬件为 AM243x + Altera FPGA。

           在 TI 的 Drivers_open() 之后、调用 FPGA_PCIe_init ()、然后通过 PCIe 读写 FPGA。

          该工程可以在 IND_SDK 9.0(采用 CCS12.4.0)上正常运行、但无法读取 IND_SDK 11.0 的 FPGA(采用 CCS12.8.1 或 CCS20)  

          让 PCIe 在新 SDK 和 CCS 中工作的权变措施如下:

              我将 pcie_open() 的函数代码(在 SDK9.0 的 pci_v0.c 中)复制到我 自己的应用程序代码中、并在 fpga_pcie_init () 中调用它。

              PCIe 对 FPGA 的读写都没问题。 (我认为没有问题,但请阅读 Issue2)

     问题 2:

          在我们的工程中、CCS  为 20.2.0 版、SDK 为 ind_comms_sdk_am243x_11_00_00_08。

          我总是使用 FPGA_pcie_init () 函数、该函数用于 SDK 9.0 测试项目。 PCIe 对 FPGA 的读写都正常。

          然后、我们向工程添加批次代码、例如 FreeRTOS、以太网 PHY 驱动程序、EtherCAT 驱动程序等  

          有一天,当我们把更多的代码放到项目中时,我们发现 PCIe 的读取无法 正常工作(卡住行: LDR PC, data_abort_addr // Abort(data)),但写入仍然可以。   

          因此、我删除了上次修改中添加的代码、然后 PCIe 的读取可以恢复。

          这些代码是 EtherCAT PHY Dp83826 的 MDIO 设置、我相信它们与 PCIe 无关。

          我们的进步迟疑、PHY 不能与 PCIe 共存。

          我甚至使用了 Issue1 的变通方法中的新 fpga_pcie_init (),但它没有使事情更好。

     您是否有类似的经验、我现在该怎么办?

    谢谢

    春阳      

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

    尊敬的 Chunyang:

    请在此处上传基于 SDK11.0 的 MDIO 设置代码+ SDK9.0 PCIe init、我将让 BU 专家来帮助了解。

    Karan Saxena 可帮助您优先处理此问题、它已阻止客户项目、SDK11.0 似乎在 PCIe 初始代码中存在一些错误。 当客户从 SDK9.0 移植初始代码时、它可能有效、但与 MDIO 存在一些冲突(可能)、可帮助修复 SDK11.0 中的错误、或帮助客户审查其代码。

    BR、

    Biao  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引述 userid=“578304" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1549359/am2434-new-version-ccs-20-2-0-pcie-issue/6044861

       现在、我们在两个  TMDS243 EVM (CCS12.4.0 和 CCS 12.8.1) 上测试以下演示

           C:\ti\ind_comms_sdk_am243x_09_00_00_03\mcu_plus_sdk\examples\drivers\pcie\pcie_buf_transfer

           C:\ti\ind_comms_sdk_am243x_11_00_00_08\mcu_plus_sdk\examples\drivers\pcie\pcie_buf_transfer

      对于 SDK 9.0、演示运行正常。

      对于 SDK 11.0、演示代码始终保留在此处:

     应该做

    CacheP_inv (dst_buf、BUF_SIZE * sizeof (uint32_t)、CacheP_TYPE_ALL);
    }while (dst_buf[BUF_SIZE - 1]!= 0xC0DEC0DEU);

    供您参考。

    [/报价]

    尊敬的 Karan:

    您能帮助检查该器件吗? 我认为 SDK11.0 PCIe 驱动程序代码中存在一些错误。

    BR、

    Biao

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

    尊敬的 Biao 和 Karan:

    在这里、我发布了 Matter 代码、它是 Issue2 的 MDIO 部分、如果我移除红色部分、则可以读取 PCIe 数据。 如果我将它们保留在此处、读取将失败。 我还在 末尾发布 setEthphyDp83826BmcRegister()

    void itiesc_ethphyEnablePowerDown ()

    #if CONFIG_PRU_ICSSG1_CORE_CLK_FREQ_Hz ==(333333333U)
    /*根据 333MHz PRU 内核时钟更新 MDIO 的时钟分频器*/
    /*FIXME:通过更新 MDIO_initClock API*/完全修复
    uint32_t mdioBaseAddress =((const ETHPHY_Attrs *) ETHPHY_getAttrs (CONFIG_ETHPHY0))->mdioBaseAddress;
    HW_WR_REG32 ((mdioBaseAddress + CSL_MDIO_CONTROL_REG)、(CSL_FMKT (MDIO_CONTROL_REG_ENABLE、Yes)| CSL_FMK (MDIO_CONTROL_REG_CLKDIV、MDIO_CLK_DIV_CFG));
    #endif
    /*通过检查标识符寄存器*/来确保 PHY 寄存器访问正常
    while (SystemP_Success!= ETHPHY_command (gEthPhyHandle[CONFIG_ETHPHY0]、ETHPHY_CMD_VERIFY_IDENTIFICLE_REGISTER、NULL、0));
    while (SystemP_Success!= ETHPHY_command (gEthPhyHandle[CONFIG_ETHPHY1]、ETHPHY_CMD_VERIFY_IDENTIFICLE_REGISTER、NULL、0));

    #ifdef ICSSG0_Instance
    /*手动为 PORT0 设置 DP83826E 自动协商 Advertisemt 寄存器的 Bit6 和 Bit8 */
    uint32_t mdioBaseAddress0 =((const ETHPHY_Attrs *) ETHPHY_getAttrs (CONFIG_ETH0))->mdioPHYBaseAddress;
    uint32_t mdioBaseAddress1 =((const ETHPHY_Attrs *) ETHPHY_getAttrs (CONFIG_ETHPHY1))->mdioBaseAddress;
    int32_t 状态;
    uint16_t phyRegVal = 0;

    /*读取 DP83826E PHY 模式*/
    状态= MDIO_phyRegRead (
    mdioBaseAddress0、
    空、
    (const ETHPHY_Attrs *) ETHPHY_getAttrs (CONFIG_ETHPHY0))->phyAddress、
    DP83826E_PHYIDR2_REG_ADDRESS、
    phyRegVal (&phyRegVal);
    if (status == SystemP_Success)

    phyRegVal =(phyRegVal >> 4)& 0x3F;//选择寄存器中的相关位
    开关 (phyRegVal)

    本例中为 DP83826E_BASIC_MODE:
    DebugP_LOG(“DP83826E 为基本模式并开始设置寄存器\n\r“);
    setEthphyDp83826AnaRegister();
    setEthphyDp83826BmcRegister();
    /**链路信号极性可配置 (ACT. 低电平、LED1)*/
    setEthphyDp83826LedcRegister();
    /**通过 MII 管理禁用奇半字节检测*/
    setEthphyDp83826Cr2Register();
    /**通过 MII 管理配置反应时间为 5us 的快速链路断开模式*/
    setEthphyDp83826Cr3Register();
    /**通过 MII 管理配置反应时间为 5us 的快速链路断开模式*/
    setEthphyDp83826FldCfg2Register();
    休息;

    本例中为 DP83826E_ENHANCED_MODE:
    DebugP_LOG(“DP83826E 为增强模式并开始设置寄存器\n\r“);
    setEthphyDp83826AnaRegister();
    setEthphyDp83826BmcRegister();
    /**通过 MII 管理配置反应时间为 5us 的快速链路断开模式*/
    setEthphyDp83826Cr3Register();
    /**通过 MII 管理配置反应时间为 5us 的快速链路断开模式*/
    setEthphyDp83826FldCfg2Register();
    休息;
    }
    }
    ClockP_usleep (4000000);//延迟
    ethphyDp83826_0x305 Extend_Register_Write、0);
    ethphyDp83826_0x0165 (Extend_Register_Write 460、0x0165);
    debugPrintDp83826Ethphy0Register (mdioBaseAddress0);
    debugPrintDp83826Ethphy1 寄存器 (mdioBaseAddress1);

    #endif
    /*启用 IEEE 断电模式以使 PHY 不建立任何链路*/
    ETHPHY_command (gEthPhyHandle[CONFIG_ETHPHY0]、ETHPHY_CMD_ENABLE_IEEE-POWER_DOWN、NULL、0);
    ETHPHY_command (gEthPhyHandle[CONFIG_ETHPHY1]、ETHPHY_CMD_ENABLE_IEEE-POWER_DOWN、NULL、0);
    }

    静态 int32_t setEthphyDp83826BmcRegister (void)

    int32_t 状态= SystemP_Failure;
    uint32_t mdioBaseAddress0 =((const ETHPHY_Attrs *) ETHPHY_getAttrs (CONFIG_ETH0))->mdioPHYBaseAddress;
    uint32_t mdioBaseAddress1 =((const ETHPHY_Attrs *) ETHPHY_getAttrs (CONFIG_ETHPHY1))->mdioBaseAddress;

    /*写入 DP83826E 基本模式控制寄存器
    自动协商启用且双工模式为全双工*/
    状态= MDIO_phyRegWrite (
    mdioBaseAddress0、
    空、
    (const ETHPHY_Attrs *) ETHPHY_getAttrs (CONFIG_ETHPHY0))->phyAddress、
    DP83826E_BMCR_REG_ADDRESS、
    0x1100);

    状态= MDIO_phyRegWrite (
    mdioBaseAddress1、
    空、
    (const ETHPHY_Attrs *) ETHPHY_getAttrs (CONFIG_ETHPHY1))->phyAddress、
    DP83826E_BMCR_REG_ADDRESS、
    0x1100);
    返回状态;
    }