-1

最近,我开始做一个与emac相关的项目,在实施方面遇到了一些疑问和障碍,于是决定在这里发布我的Q,向有经验的人寻求一些建议和建议。

目前,我正在将 EMAC-DM9161A 模块与我的 SAM3x - Taiji Uino 板连接以进行高速以太网通信。我正在使用 Palliser 开发的库,该库作为 elechouse/EMAC-Demo 上传到 Github。在源代码 - ethernet_phy.c 中,我遇到了这个函数来初始化 DM9161A PHY 组件,如下所示:

unit8_t ethernet_phy_init(Emac*p_emac, uint8_t uc_phy_addr, uint32_t mck);

问题:参数 uint8_t uc_phy_addr 是一个 8 位寄存器,我想通过它传递一个 48 位 MAC 地址,例如 - 70-62-D8-28-C2-8E。我知道,我可以使用两个 32 位寄存器将 MAC 地址的前 32 位(即 70-62-D8-28)存储在一个 32 位寄存器中,其余 16 位 MAC 地址(即 C2-8E)存储在另一个 32 位寄存器中. 但是,我不能这样做,因为我需要使用上面的 ethernet_phy_init 函数,其中 unit8_t 用于传递 48 位 MAC 地址。所以,我想知道,如何做到这一点?

另一个问题:我执行了一些代码以通过一些试验方法理解并遇到一些疑问,这里是代码:

  int main()
{
  unit8_t phy_addr =49;     //Assign a value 49 to 8 bit Reg
  int8_t phy_addr1 = 49;
  int phy_addr2 = 49;
  cout<<phy_addr;
  cout<<phy_addr1
  cout<<phy_addr2;
  getchar();
  return 0;
 }

输出结果:

 1
 1
 49

所以我的疑问是,为什么在我使用 8 位变量存储值 49 的任何地方,输出都以 ASCII 字符显示,但是当我使用普通的 32 位 int 变量存储 49 时,它显示的十进制值是 49。为什么这会发生吗?最后如何将 MAC 地址存储在 8 位寄存器中?

4

3 回答 3

0

关于您的第二个问题:前 2 个变量是 8 位(一个有符号和一个无符号),因此 ostream 假定它们是字符(也是 8 位宽)并显示它们的字符表示(“1”= ASCII 49)。

至于最初的问题,我浏览了一点 Atmel 来源,MAC 地址在 ethernet_phy_init 中没有任何关系(都处于低得多的级别): uc_phy_addr - 似乎是接口索引 mck - 似乎是一个与计时器相关的值。

于 2015-04-15T11:38:51.410 回答
0

关于第二个问题:

uint8_t/与/int8_t相同,并将其处理为. 用于打印为数字。unsignedsigned charcoutcharstatic_cast<int>

关于第一个问题:

我从来没有使用过 emac,但从这个例子来看mac 应该这样设置:

#define ETHERNET_CONF_ETHADDR0                        0x00
#define ETHERNET_CONF_ETHADDR0                        0x00
#define ETHERNET_CONF_ETHADDR1                        0x04
#define ETHERNET_CONF_ETHADDR2                        0x25
#define ETHERNET_CONF_ETHADDR3                        0x1C
#define ETHERNET_CONF_ETHADDR4                        0xA0
#define ETHERNET_CONF_ETHADDR5                        0x02

static uint8_t gs_uc_mac_address[] =
        { ETHERNET_CONF_ETHADDR0, ETHERNET_CONF_ETHADDR1, ETHERNET_CONF_ETHADDR2,
            ETHERNET_CONF_ETHADDR3, ETHERNET_CONF_ETHADDR4, ETHERNET_CONF_ETHADDR5
};

emac_options_t emac_option;
memcpy(emac_option.uc_mac_addr, gs_uc_mac_address, sizeof(gs_uc_mac_address));
emac_dev_init(EMAC, &gs_emac_dev, &emac_option);
于 2015-04-15T11:37:22.540 回答
0

我想通了,所以我将为像我这样可能遇到同样疑问的初学者回答我自己的问题。

答:正如评论中成员所建议的那样,是的,他们是对的,感谢他们。函数参数uint8_t uc_phy_addr代表 PHY 芯片寄存器中的 5 位端口地址,而不是 MAC 地址,因此该地址设置为 0x01 以仅启用接收引脚并保持其他 4 位为 0。第 4 位是 CSR在这种情况下也设置为 0(有关详细信息,请参阅 DM9161A 的数据表)。

于 2015-04-28T13:55:11.330 回答