为什么在 ENC28J60 上没有正确设置 mac?

问题描述

我正在尝试在 ENC28J60 上设置 MAC 地址,但奇怪的是,MAC 没有正确设置,并且在数据表中找不到任何说明如何具体操作的内容。这是我程序的一小部分:

// Selects BANK3
enc28j60_bank_select(cfg,ENC28J60_BANK3);

// 9. Program the local MAC address into theMAADR1:MAADR6 registers.
enc28j60_wcr(cfg,ENC28J60_MEM_BK3_MAADR6,cfg->mac_addr[5]);
enc28j60_wcr(cfg,ENC28J60_MEM_BK3_MAADR5,cfg->mac_addr[4]);
enc28j60_wcr(cfg,ENC28J60_MEM_BK3_MAADR4,cfg->mac_addr[3]);
enc28j60_wcr(cfg,ENC28J60_MEM_BK3_MAADR3,cfg->mac_addr[2]);
enc28j60_wcr(cfg,ENC28J60_MEM_BK3_MAADR2,cfg->mac_addr[1]);
enc28j60_wcr(cfg,ENC28J60_MEM_BK3_MAADR1,cfg->mac_addr[0]);

具体功能是:

enc28j60_wcr()

void enc28j60_wcr(enc28j60_config_t *cfg,uint8_t address,uint8_t data)
{
    enc28j60_select(cfg);
    enc28j60_write_cmd(cfg,ENC28J60_OPCODE_WCR,address);
    spi_transceive(data);
    enc28j60_deselect(cfg);
}

enc28j60_bank_select()

void enc28j60_bank_select(enc28j60_config_t *cfg,enc28j60_econ1_bsel_t bank)
{
    uint8_t reg;

    // Reads original value of ECON1
    reg = enc28j60_rcr(cfg,ENC28J60_MEM_BKX_ECON1);

    // Sets the new memory bank
    ((enc28j60_econ1_t *) &reg)->bsel = bank;

    // Updates ECON1
    enc28j60_wcr(cfg,ENC28J60_MEM_BKX_ECON1,reg);
}

使用此代码读取 mac 时:

void enc28j60_get_mac(enc28j60_config_t *cfg,uint8_t *mac)
{
    enc28j60_bank_select(cfg,ENC28J60_BANK3);
    for (uint8_t i = 0; i < 6; ++i)
        mac[i] = enc28j60_rcr_dummy(cfg,mac_registers[i]);
}

结果是:00:00:00:00:11:00,而我写的mac是:{ 0x11,0x22,0x70,0x8F,0x52,0x80 }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)