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.

[参考译文] Profinet - AM243X:MCU-PLUS-SDK 堆栈依赖于 EEPROM 的 MAC

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1546728/mcu-plus-sdk-am243x-profinet-stack-dependancy-on-mac-from-eeprom

器件型号:AM243X - MCU-PLUS-SDK


工具/软件:

您好:

根据我在相关帖子 (https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1131479/mcu-plus-sdk-am243x-is-board-id-eeprom-eeprom-at24cm01-necessary-on-am243x/4199462?tisearch=e2e-sitesearch&keymatch=APP_HW_BOARD_INFO_getMacInfo#) 中的理解、

只要通过  APP_HW_Board_INFO_getMacInfo 函数提供 MAC、就不依赖于 EEPROM MAC。

但是、当我移除 EEPROM 并手动 使用 MAC 和其他数据填充 APP_HW_Board_INFO_DATA_g 结构时、就不会发生与 PRONETA 或 PLC 的通信。

栈是否从  appHwBoardInfo.c 文件中的“&APP_HW_Board_INFO_DATA_G.Mac;"读取“读取 MAC 以外的内容?

我们希望移除 EEPROM 并将 MAC 存储在非易失性存储器中。

谢谢你。

此致、
Upendar

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

    您好 Upendar、

    我现在正在调查这个问题。  您是否观察到在设备的任何端口上发送了任何消息? 请使用 Wireshark 检查 MAC 地址并与我们分享吗? Wireshark 跟踪也会有所帮助。

    谢谢。
    此致、
    Kamil

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

    您好 Kamil、

    我无法发送 Wireshark pcap 文件。 但重现并不困难。 请从您这边尝试。

    谢谢你。

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

    您好 Upendar、

    您能否说明在哪里修改  APP_HW_Board_INFO_DATA_G.Mac 结构? 也许在分配之前栈正在尝试读取它。 如果 MAC 不可用、堆栈可以使用其默认值。 为了验证这一点、我至少需要您在 Wireshark 跟踪上看到的 MAC 地址?

    我尝试通过修改 APP_HW_BOARD_INFO_READ () 来手动填充 APP_HW_BOARD_INFO_DATA_G.Mac  结构、而不是调用 EEPROM 读取、在我这边重现您的问题。 设备的 MAC 地址已成功更新,我仍然能够 通过 PRONETA 和 PLC 检测到它

    谢谢。
    此致、
    Kamil

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

    uint32_t APP_pruInit (void)
    {
        PRU_PN_TPruLoadParameter    pruParam   = {0};
        uint32_t                    result     = OSAL_NO_ERROR;
        APP_HW_EError_t             status     = APP_HW_eNO_ERROR;
    
        //status = APP_HW_BOARD_INFO_read();
    
        if (status == APP_HW_eNO_ERROR)
        {
            memset(&pruParam, 0, sizeof(pruParam));
            memmove(pruParam.aMacAddr, PN_APP_IOD_getMacAddr(), PRU_PN_MAC_ADDR_LEN);

    APP_HW_BOARD_INFO_SMAC_Addr_t *APP_HW_BOARD_INFO_getMacInfo(void)
    {
    
        APP_HW_BOARD_INFO_data_g.mac.length = 194;
        APP_HW_BOARD_INFO_data_g.mac.type = 19;
        APP_HW_BOARD_INFO_data_g.mac.ctrl = 16;
    
        uint8_t * flashMac = PN_APP_IOD_getMacAddr();
    
        for (uint8_t i = 0; i < 3; i++)
        {
            OSAL_MEMORY_memcpy(&APP_HW_BOARD_INFO_data_g.mac.macAddr[6 * i], flashMac, 6);
    
            flashMac[5] = flashMac[5] + 1;
        }
    
        return &APP_HW_BOARD_INFO_data_g.mac;
    }
    

    这些是我所做的更改。 _getMacAddr 函数返回 6 字节的 MAC 地址。

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

    您好 Upendar、

    好的、现在我看到了问题、我理解了混淆。 PROFINET 协议栈假定 APP_HW_BOARD_INFO_getMacInfo () 只是静态 APP_HW_BOARD_INFO_DATA_G.Mac 结构的 getter 函数,因此在调用它之前,它会调用 APP_HW_BOARD_INFO_READ () 以确保结构已填充。 在本例中,APP_HW_Board_INFO_READ() 可能不会填充结构,因此堆栈在初始化阶段永远不会调用 APP_HW_BOARD_INFO_getMacInfo ()。 要解决这个问题,您可以尝试将代码从 APP_HW_Board_INFO_getMacInfo () 移动到 APP_HW_BOARD_INFO_READ (),这样结构就会首先被初始化。

    我还将在我们这边创建一个错误报告、以便我们可以修改栈的行为、从而减少用户的困惑、并更符合您上面提到的 E2E 工单。

    请您确认问题是否以这种方式得到解决?

    谢谢。
    Kamil

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

    您好 Kamil、

    首先 调用了 APP_HW_Board_INFO_READ、我禁用 readblock 调用并返回成功结果、然后 该栈调用了 APP_HW_BOARD_INFO_getMacInfo 函数。

    这就是为什么我感到困惑。 在我之前发送的代码中、我填充了  APP_HW_Board_INFO_DATA_g、与在 APP_HW_Board_readBlock 中完成的操作相同、但它仍然不起作用。

    也许您能做我的更改并进行调试吗? 我怀疑堆栈使用的是来自 APP_HW_BOARD_INFO_DATA_g 指针的 Mac addr 数据。

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

    您好 Upendar、

    我试图复制你的代码在我的身边,我仍然看到没有问题。 我将分享我的更改、以便我们一起了解:

    APP_HW_EError_t APP_HW_BOARD_INFO_read(void)
    {
        APP_HW_EError_t result = APP_HW_eNO_ERROR;
        return result;
    }
    
    uint8_t flashMac[194] = {0};
    
    APP_HW_BOARD_INFO_SMAC_Addr_t *APP_HW_BOARD_INFO_getMacInfo(void)
    {
    	uint8_t macAddr[6] = {0x70,0xFF,0x76,0x1E,0x68,0x7C}; //Instead of flash access
    	OSAL_MEMORY_memcpy(flashMac, macAddr, 6);
    
    	APP_HW_BOARD_INFO_data_g.mac.type = APP_HW_BOARD_INFO_TYPE_MAC_ADDR;
    	APP_HW_BOARD_INFO_data_g.mac.length = APP_HW_BOARD_INFO_MAC_ADDR_LEN_TOTAL + 2;
    	APP_HW_BOARD_INFO_data_g.mac.ctrl = APP_HW_BOARD_INFO_TYPE_BRD_INFO;
    
    	for (uint8_t i = 0; i < 3; i++)
    	{
    	    OSAL_MEMORY_memcpy(&APP_HW_BOARD_INFO_data_g.mac.macAddr[6 * i], flashMac, 6);
    	    flashMac[5] = flashMac[5] + 1;
    	}
    
        return &APP_HW_BOARD_INFO_data_g.mac;
    }


    下面是 PRONETA 的屏幕截图:


    你能和你身边的东西做一个比较吗?

    谢谢。
    此致、
    Kamil
     

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

    您好 Kamil、

    这是位不稳定。 我看到的唯一更改是 在 APP_pruInit 中使用 PN_APP_IOD_getMacAddr 函数、而不是 APP_HW_Board_INFO_getMacInfo。 我想我会再次检查。

    再次感谢。

    此致、
    Upendar

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

    您好 Upendar、

    您对此 TT 有任何更新吗? 我可以做些什么来为您提供进一步的支持吗?

    谢谢。
    此致、
    Kamil

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

    您好 Kamil、

    很抱歉之前没有答复。 我没有为我工作。 但这可能是我的电路板出现问题。 我想正确调试它。 我现在正忙于处理其他工作。  

    如果我需要进一步的支持、我将在此写信。

    谢谢你。

    此致、
    Upendar