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/TM4C129XNCZAD:μ tı-RTOS Mac 地址更改问题

Guru**** 2430620 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/710266/rtos-tm4c129xnczad-t--rtos-mac-address-change-problem

器件型号:TM4C129XNCZAD

工具/软件:TI-RTOS

您好!

在我的项目中、我希望通过 TI-RTOS 中的 i2协议从器件的 EEPROM 读取 MAC 地址。为此、我创建了一个新任务、从 EEPROM 寄存器读取 MAC 并写入相关的 lUser0和 lUser1、如下所示:

void macInitFxn()

  I2C_Handle i2c6Handle;
  I2C_Params i2c6Params;
  uint8_t txBuffer[1];
  /* 48位 MAC 地址*/
  uint8_t getMacBuffer[6];
  I2C_Transaction i2cTransaction;

  I2C_Params_init (&i2c6Params);
  i2c6Handle = I2C_open (DK_TM4C129X_I2C6、&i2c6Params);

  if (i2c6Handle == NULL)
  {
     log ("I2C 无法正确打开 MAC 地址!\n"\});
     返回;
  }

/*获取 MAC 地址信息*/
/*从0xFA 到0xFF 的 MAC 地址起始寄存器*/
TxBuffer[0]= 0xFA;
/* EEPROM 的从器件地址*/
i2cTransaction.slaveAddress = 0x50;
i2cTransaction.writeBuf = txBuffer;
i2cTransaction.writeCount = 1;
i2cTransaction.readBuf = getMacBuffer;
i2cTransaction.ReadCount = 6;

IF (I2C_transfer (i2c6Handle、&i2cTransaction))

uint32_t HMAC =((getMacBuffer[0]<<16)|(getMacBuffer[1]<<8)|(getMacBuffer[2]));
uint32_t LMAC =((getMacBuffer[3]<<16)|(getMacBuffer[4]<<8)|(getMacBuffer[5]));
if (FlashUserSet (HMAC、LMAC)!=成功)

LOGERR ("MAC 地址无法成功编程");
I2C_Close (i2c6Handle);
返回;

if (FlashUserSave()!=成功)

LOGERR("无法提交更改 MAC 地址");
I2C_Close (i2c6Handle);
返回;

日志("MAC 地址已成功更改");
I2C_Close (i2c6Handle);
返回;

LOGERR ("I2C 总线故障\n");
I2C_Close (i2c6Handle);
返回;

我看到 LM Flah 编程器的 MAC 地址已成功更改为从 EEPROM 读取的值、即使在 cmd 中使用"arp -a "命令时该值不能被更改。 我看到 FF-FF-FF-FF-FF-FF-FF。在我的代码中更改 MAC 是否存在任何问题? 我是否只读取 LM Flah Porgrammer 的寄存器值? 感谢您的回答。

此致、

Cengizhan YAPICIOĞLU ć  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    LM 闪存编程器可用于读取或编程通常用于存储 MAC 地址的用户0和用户1寄存器。 仅当原始值全部为 FF 时、才能进行编程。 要进行实际编程、您必须先选中"Commit MAC Address"(提交 MAC 地址)复选框、然后再单击"Program MAC Address"(编程 MAC 地址)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的回答。 但是、我想使用 i2c 协议从 EEPROM 读取的值对 MAC 地址进行编码。 如果我使用 Board_initEMAC(),我无法向它添加 I2C_Transfer 函数,因为在 SYS/BIOS 函数中无法调用 Swı/Hwi。 如何在代码端修改 MAC? 换言之,TI-RTOS 中是否有任何方法可以将 tm4c129x 更改为 LM 闪存编程器中的“提交 MAC 地址”所执行的操作?   

    此致、
    Cengizhan YAPICIOĞLU ć

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

    首先,不要在 main()中调用 Board_initEMAC()。 而是在获得 MAC 地址后在任务中调用它。

    您有几个选项可延迟 NDK 堆栈的启动:
    1.不要以图形方式生成它。 相反,请自己提供该线程,并在调用 Board_initEMAC()后启动该线程。
    2.通过.cfg 文件将启动挂钩函数添加到堆栈中。 在信标上有该函数块。 调用 Board_initEMAC()后发布信标。 挂钩在堆栈线程的早期调用、远早于 MAC 地址被引用。

    .cfg 文件
    global.stackBeginHook ="&myNDKStackBeginHook";

    .c 文件
    void myNDKStackBeginHook()

    Semaphore_pend (mySem、BIOS_wait_forever);



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

    您好 Todd、

    最初,该解决方案成功,MAC 地址被更改。但是,我丢失了 UDP 通信,这些通信 是通过   使用 NDK Open Hook 的 MAIN ()调用的任务来控制的。  如何解决 这两个问题?  编辑:我注意到“akbUdpSock = socket (AF_iNet、SOCK_DGRAM、IPPROTO_UDP);”中出现了问题,如上所述,当我更改 MAC 时,该问题返回无效的 socket。 此 MAC 更改问题的解决方案是什么?  

    此致、

    Cengizhan YAPICIOĞLU ć  

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

    在 NDK 启动之前、您不能尝试使用它。 您可以使用 NDK 中的挂钩函数来启动其他任务(而不是在 main 中启动)。

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

    您好!

    很抱歉、但我无法完全理解您提到的内容。 当我将任务移动到堆栈挂钩或网络打开挂钩时、网络打开挂钩信标将崩溃。 请给我一些额外的信息、说明如何同时使用网络开放式挂钩进行 UDP 通信、以及如何将堆栈开放式挂钩用于 MAC 地址、例如在哪里可以调用网络开放式挂钩以及 UDP 通信的相关任务。 在当前情况下、main.c 中有一个 mainTask、该 mainTask 在另一个.c 文件中调用初始化任务。 从这里、我调用一些对于我们的项目来说是必要的基本任务、例如传感器的 i2c 初始化、UART 通信、UDP 初始化等。 据我所知、我只遇到了 netopenhook 的 UDP 任务和 stackopenhook 的 MAC init 任务的问题。 我应该在哪里准确地调用这些任务? 很抱歉、我找不到任何解决此问题的方法。 感谢您的回答。

    此致、

    Cengizhan Yapıcıoğlu ć

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

    您好!
    尽管 MAC 地址更改在项目中起着重要作用、但我仍然很抱歉、如果有用、我可以向您发送 NDK 堆栈和 main.c 的代码部分、但我无法理解在哪里可以调用任务。此外、 我找不到有关它的任何示例。  请提供一个基本示例、说明如何同时使用 netOpenHook 更改 MAC 和控制 UDP。 当我更改 MAC 时、我丢失了 UDP。 请您注意。

    此致、
    Cengizhan Yapıcıoğlu ć

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

    我已附加修改的 TCP 回显。 我添加了挂钩和一个休眠5秒的任务(模拟获取 MAC 地址)。 在 NDK 启动之前、您无需任何任务调用它。  因此没有套接字调用等

    e2e.ti.com/.../delayedNDK.zip

    如果需要正在运行的堆栈、然后更改 MAC 地址、则必须关闭堆栈 (查看 NC_NetStop)、更改 MAC 地址并重新启动它。

    Todd

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请注意您的发行版在 NDK 驱动程序中发现的问题: processors.wiki.ti.com/.../TI-RTOS_Support

    一个与关断和重新启动 NDK 有关!

    Todd
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、使用此示例和 NC_NetStop (1)、我已成功更改 MAC。 感谢您的回答。