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.

[参考译文] TMS570LC4357:多播不能接收数据

Guru**** 2455560 points
Other Parts Discussed in Thread: TMS570LC4357, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1182063/tms570lc4357-multicast-is-not-able-to-receive-data

器件型号:TMS570LC4357
主题中讨论的其他器件: HALCOGEN

大家好、

以下是客户提出的问题、可能需要您的帮助:

在 TMS570LC4357上移植 lwip1.4.1时、未接收到多播帧、并且正确接收到广播和单播帧。 然后发现接口未从 EMAC 接收到多播帧。

使用 HALCOGEN 生成客户的驱动器、并根据需要进行一些修改、以下代码是用于调用 EMAC 接口的部件:

netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP | NETIF_FLAG_IGMP;

  EMACInit(hdkif->emac_ctrl_base, hdkif->emac_base);

 

  MDIOInit(hdkif->mdio_base, MDIO_FREQ_INPUT, MDIO_FREQ_OUTPUT);

  while(delay--);

 

  EMACRxBroadCastEnable(hdkif->emac_base, 0);

 

  /* Set the MAC Addresses in EMAC hardware */

  EMACMACSrcAddrSet(hdkif->emac_base, hdkif->mac_addr);

 

  /* Acknowledge receive and transmit interrupts for proper interrupt pulsing*/

  EMACCoreIntAck(hdkif->emac_base, EMAC_INT_CORE0_RX);

  EMACCoreIntAck(hdkif->emac_base, EMAC_INT_CORE0_TX);

 

  EMACRxUnicastSet(hdkif->emac_base, 0);

EMACRxMultiCastEnable(hdkif->emac_base, 0);

  EMACNumFreeBufSet(hdkif->emac_base, 0, 10);

 

  /* Write the RX HDP for channel 0 */

  EMACRxHdrDescPtrWrite(hdkif->emac_base, (U32)rxch->active_head, 0);

 

  EMACTxEnable(hdkif->emac_base);

  EMACRxEnable(hdkif->emac_base);

 

  EMACMIIEnable(hdkif->emac_base);

 

 

  /**

  * Enable the Transmission and reception, enable the interrupts for

  * channel 0 and for control core 0

  */

  EMACTxIntPulseEnable(hdkif->emac_base, hdkif->emac_ctrl_base, 0, 0);

  EMACRxIntPulseEnable(hdkif->emac_base, hdkif->emac_ctrl_base, 0, 0);

 

您能否帮助检查上述代码是否存在任何错误? 谢谢。

此致、

樱桃

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

    您好、Cherry、

    您还需要设置 MACHASH1和 MACHASH2寄存器以匹配要侦听的多播地址。 它是一个哈希值、因此它获取 MAC 地址的48位、并将其哈希到单个位位置。 您必须在哈希寄存器中设置该位置。

    --

    谢谢、此致、

    Jagadish。

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

    您好  Jagadish、

    感谢您的支持。

    此哈希值应设置为什么?  如何计算此哈希值?

    当0通道设置为0xffffffff 时、可接收多播数据。

    谢谢、此致、

    樱桃

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

    您好、Cherry、

    [引用 userid="496057" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1182063/tms570lc4357-multicast-is-not-able-to-receive-data/4453034 #4453034"]此哈希值应设置为什么?  如何计算此哈希?[/QUERT]

    首先使用下面给出的公式从要侦听的 MAC 地址计算6位哈希函数

    在这里 、Hash_Fun (0)表示位0、Hash_Fun (1)表示位1、依此类推。

    现在基于输入 MAC 地址(00  00 00 00 00 00至 FF FF FF FF FF FF FF FF FF FF)您可以得到64个可能值、即0至63。

    因此、要接收相应的 MAC 地址、必须将 MACHASH 寄存器中的相应位置位(MACHASH1为0至31位、MACHASH2为32至63位)。

    例如:

    如果您希望接收多播 MAC 地址00 00  00 01、其6位哈希函数值为0b000001、即值1、因此我们必须设置哈希寄存器中的第一位、即 MACHASH1寄存器中的第一位、因此寄存器值为

    MACHASH1 = 0x00000001

    MACHASH2 = 0x00000000

    同样 ,您甚至可以在哈希寄存器中选择多个值以接收多个地址。

    --

    谢谢、此致、

    Jagadish。