Как передать 48-битный MAC-адрес в качестве аргумента функции через переменную uint_8-bit?

Недавно я начал работать над проектом, относящимся к emac, и наткнулся на несколько сомнений и блокировок в отношении реализации, и решил опубликовать здесь свой Q, чтобы получить некоторые советы и предложения от опытных людей.

В настоящее время я работаю над взаимодействием модуля EMAC-DM9161A с моей платой SAM3x — Taiji Uino для высокоскоростной связи по Ethernet. Я использую библиотеку, разработанную Palliser, которая загружена на Github как elechouse / EMAC-Demo. В исходном коде ethernet_phy.c я натолкнулся на эту функцию для инициализации PHY-компонента DM9161A следующим образом:

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-битных регистра для хранения первых 32-битных MAC-адресов, т.е. 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

Поэтому я сомневаюсь, почему вывод отображается в виде символа ASCII, где бы я ни использовал 8-битную переменную для хранения значения 49, но когда я использую обычную 32-битную переменную int для хранения 49, он отображает десятичное значение 49. Почему это происходит? И, наконец, как хранить MAC-адрес в 8-битном регистре?

-1

Решение

О втором вопросе:

uint8_t/int8_t такой же как unsigned/signed char а также cout будет это как char, использование static_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);
0

Другие решения

Что касается вашего второго вопроса: первые 2 переменные являются 8-битными (одна со знаком и одна без знака), поэтому ostream предполагает, что они являются символами (также шириной 8 бит), и отображает для них представление типа char («1» = ASCII 49).

Что касается оригинального вопроса, я немного просмотрел источники Atmel, и MAC-адрес не имеет ничего общего с ethernet_phy_init (все находится на гораздо более низком уровне):
uc_phy_addr — похоже, индекс интерфейса
mck — похоже на значение, связанное с таймером.

0

Я понял это, поэтому я собираюсь ответить на свой вопрос для тех новичков, как я, которые могут столкнуться с таким же сомнением.

Ответ: Как предложили участники в комментариях, да, они были правы и спасибо им. Параметр функции uint8_t uc_phy_addr представляет 5-битный адрес порта в микросхеме PHY — Регистрация и не MAC-адрес, следовательно, адрес установлен как 0x01, чтобы включить только приемный вывод и сохранить остальные 4 бита 0. 4-й бит — это CSR, который также установлен в 0 в этом случае (для более подробной информации, пожалуйста, обратитесь к паспорту DM9161A).

0
По вопросам рекламы [email protected]