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/PROCESSOR-SDK-AM437X:定制板问题

Guru**** 2587365 points
Other Parts Discussed in Thread: TPIC2810, SN74LVC1G08, TLK105

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/632984/rtos-processor-sdk-am437x-custom-board-issue

器件型号:PROCESSOR-SDK-AM437X
主题中讨论的其他器件:TPIC2810SN74LVC1G08TLK105

工具/软件:TI-RTOS

你(们)好

我正在将 EtherCAT + EnDAT 项目从 AM437x 工业 EVM (1.4A 版)迁移到我的定制板。

定制板的设计遵循 AM437x 工业 EVM 的电路、将外设模块缩减为 EnDat、QSPI (用于闪存)和 ICSS 以太网端口。

我面临的问题是,当定制板在 board_platform.c 中执行 BOARDGetDeviceCtrlModId()函数时,它将立即跳转到_exit()。

由于 EVM 电路板上的 EtherCAT + EnDAT 项目具有自定义电路板上没有的 UART 和工业 I/O 电路。

此问题是否由错误的引脚多路复用器配置引起?

非常感谢

Yi-Lin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您能解释一下此问题的软件和版本吗? 在 BOARDGetDeviceCtrlModId (uint32_t DevID、uint32_t devInstNum)中、导致退出的函数调用中使用的参数是什么?

    BoardGetDataAm43xx()是否在上述函数内正确执行? 然后,您可以跟踪 BoardGetIdAm43xx()以查看错误的来源。 我认为电路板信息来自 I2C、如果您没有更改 I2C 器件的 PINMUX、应该可以。

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

    尊敬的 Eric:

    感谢您的回复。

    我的软件环境

    SYS/BIOS:IND SDK 02.01.03.02

    编译器:GNU v4.4.8 (Linaro)

    SYS/BIOS:6.41.4.54

    XDCtool:3.31.2.38

      EtherCAT + EnDAT 项目是通过使用 EtherCAT 示例项目扩展 FOC 来开发的。

    我没有更改 PINMUX 设置。

    在 BOARDGetDeviceCtrlModId()函数中,DevID 为27 (十进制),而 devInstNum 为0  

    我已选中 BoardGetIdAm43xx(),"boardId"设置为"Board_UNKNOWN"。

    我注意到、有一个 I2C EEPROM (CAT24C256W)用于存储电路板信息。

    我是否需要将 I2C ID 存储器配置为与 AM437x IDK EVM 相同? 如何配置它?

    定制板上没有 I2C LED 电路(TPIC2810)、这是否也会导致问题?

    非常感谢

    Yi-Lin

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

    尊敬的 Eric:

    我使用 EEPROM 编程器将 ID 存储器数据复制到我的定制板。

    该板 现在不会跳转到_exit(),但会停留在 MDIOPhyRegRad()函数的 while 循环中。

    我在 E2E 社区(https://e2e.ti.com/support/arm/sitara_arm/f/791/p/600426/2211180?tisearch=e2e-sitesearch&keymatch=MDIOPhyRegRead#2211180 )上发现了类似的问题

    在 AM437x EVM 和定制板上、有一个使用 SN74LVC1G08的 PHY 芯片复位电路。

    由于 SN74LVC1G08的交货时间较晚、该芯片在生产过程中不会放置在定制电路板上。

    我很疲惫地将 AM437X_CAM1_DATA6引脚短接至 PRUETH1_ERSETn 和 PRUETH0_RESETn、但这不起作用。

     由于 SN74LVC1G08将于下周推出、我将在下周继续测试。

    非常感谢。

    Yi-Lin

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

    尊敬的 Eric:

    我已将 SN74LVC1G08芯  片放在定制板上、但在 bsp_tlk105_init()函数中、它仍然停留在 while 循环中。

    while (!mdio_getPhyIdentifyStat (((((PRUICSS_HwAttrs *))(
    pruIcssHandle->hwAttrs)->baseAddr + PRU_ICSS_MDIO)、phy0addr、NULL)
    {
    } 

    PRUETH 电路按照 AM437x IDK 设计、没有任何变化。

    因此、我认为两个 TLK105的 PHY 地址应该是正确的。

    有没有人建议我如何解决这个问题?

    请告诉我

    非常感谢

    Yi-Lin

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

    你(们)好

    我仍然卡在 bsp_tlk105_init()函数中。

    我发现在 MDIOPhyRegRead (MDIO.c line90)中执行 HW_WR_REG32 ()函数时有一个奇怪的现象

    由于"baseAddr"和"regVal"值为"0x54432400"和"0x80400000"

    在执行 HW_WR_REG32 ()函数之后

    void MDIOPhyRegRead (uint32_t baseAddr、
    uint32_t phyAddr、
    uint32_t Regnum、
    uint16_t *pData)
    {
    uint32_t regVal = 0U;
    
    /*等待事务完成(如果有)*/
    while (MDIO_useraccess_GO_EN_0x1 =>
    HW_RD_FIELD32 (baseAddr + MDIO_useraccess (0U)、
    MDIO_useraccess_go));
    
    HW_SET_FIELD (regVal、MDIO_useraccess_go、MDIO_useraccess_go_EN_0x1);
    HW_SET_FIELD (regVal、MDIO_useraccess_write、MDIO_useraccess_read);
    HW_SET_FIELD (regVal、MDIO_useraccess_PHYADR、phyAddr);
    HW_SET_FIELD (regVal、MDIO_useraccess_REGADR、RegNum);
    HW_WR_REG32 (baseAddr + MDIO_useraccess (0U)、regVal); 

     AM437x IDK 上0x54432480处的寄存器值将为0x20402000、而不是0x80400000  

    但是在定制板上、值将为0x0040FFFF、这将不会传递 MDIO_getPhyIdentifyStat ()函数(osdrv_mdio.c line509)中的 if 语句

    /**
    *@获取 PHY 就绪状态的简短函数
    *
    ** 函数返回 PHY 是否已识别并准备
    就绪*
    * MDIO 初始化应在使用此函数之前完成、如果
    *、则需要传递 Sem 句柄 使用线程安全 MDIO 读取、传递 NULL 否则
    *
    @param mdioBaseAddress [in] MDIO 基址
    *@param phyAddr [in]端口的 PHY 地址
    *@param mdioSemhandle [in]如果使用线程安全 MDIO 访问、则信号量句柄
    *
    *@如果 PHY 就绪
    、则为 retval true * 如果 PHY 未就绪、则为 false
    */
    uint8_t MDIO_getPhyIdentifyStat (uint32_t mdioBaseAddress、uint32_t phyAddr、
    MDIOSEM_Handle mdioSemhandle)
    {
    uint16_t regStatus;
    MDIO_regRead (mdioBaseAddress、phyAddr、PHY_PHYIDR1_REG、regStatus、&regStatus、
    mdioSemhandle);
    
    if (regStatus = 0x2000)
    {
    返回 true;
    }
    
    其他
    {
    返回 false;
    }
    } 

    是否有人可以帮助我解决这个问题?

    请帮助...

    Yi-Lin