2017-04-20 10:39 AM
Having trouble reading the MAC address using the HAL but mostly because of my inexperience.
uint8_t *MACAddr; /*!< MAC Address of used Hardware: must be pointer on an array of 6 bytes */
printing heth.Init.MACAddr[0] does not print the first byte. It prints something, but not what I am expecting. if I send &heth.Init.MACAddr[0] to printf, it does print the address, but the first try without the & produces what seems to be a different address. The value does not change no matter what I set the MAC Address to. I'm obviously missing something when it comes to reading the value of a field of a struct when its a pointer. Can someone help me get on the right path?
len += sprintf(etherString+len, ' MAC Address : %02X:%02X:%02X:%02X:%02X:%02X\r\n',
heth.Init.MACAddr[0], heth.Init.MACAddr[1], heth.Init.MACAddr[2], heth.Init.MACAddr[3], heth.Init.MACAddr[4], heth.Init.MACAddr[5]);produces
MAC Address : 84:00:00:20:2B:39
the mac address is actually 00:80:E1:00:00:00
what am I not getting?
Solved! Go to Solution.
2017-04-20 11:25 AM
Kind of suggests that MACAddr isn't set to anything, or is set to a transient address for a local/auto variable, that's out of scope at the point of printing.
ie
heth.Init.MACAddr = malloc(6);
heth.Init.MACAddr[0] = 0x11;
heth.Init.MACAddr[1] = 0x22;
heth.Init.MACAddr[2] = 0x33;
heth.Init.MACAddr[3] = 0x44;
heth.Init.MACAddr[4] = 0x55;
heth.Init.MACAddr[5] = 0x66;
2017-04-20 11:21 AM
Hi,
Note that MACAddr is a pointer, so it doesn't actually contain the data for the MAC address.
How do you assign (write) the MAC address into the Init data structure?
Regards,
Alex.
2017-04-20 11:25 AM
Kind of suggests that MACAddr isn't set to anything, or is set to a transient address for a local/auto variable, that's out of scope at the point of printing.
ie
heth.Init.MACAddr = malloc(6);
heth.Init.MACAddr[0] = 0x11;
heth.Init.MACAddr[1] = 0x22;
heth.Init.MACAddr[2] = 0x33;
heth.Init.MACAddr[3] = 0x44;
heth.Init.MACAddr[4] = 0x55;
heth.Init.MACAddr[5] = 0x66;
2017-04-20 12:03 PM
Find in file how the code is using or declaring
MACAddr in the HAL.
Human commented text won't be as accurate as C...
If using debug mode, open the structure contents and use the memory watch window to make sure everything is pointing as expected.
2017-04-20 07:49 PM
nailed it, once again. The HAL never updates that field of the struct anyway and as
Centauris.Alpha
suggested, I dug up how the MAC address is configured and it turns out the HAL just writes to the registers and, for a change, doesn't update the struct like it does for everything else. I was also confusing which struct was being returned from the call to get its status.this is how I ended up reading the MAC address on an stm32f769i-discovery board:
uint32_t htempreg;
uint32_t ltempreg; uint8_t macAddr[6]; htempreg = (*(__IO uint32_t *)((uint32_t)(ETH_MAC_ADDR_HBASE))); ltempreg = (*(__IO uint32_t *)((uint32_t)(ETH_MAC_ADDR_LBASE)));macAddr[0] = (ltempreg) & 0xFF;
macAddr[1] = (ltempreg >> 8) & 0xFF; macAddr[2] = (ltempreg >> 16) & 0xFF; macAddr[3] = (ltempreg >> 24) & 0xFF; macAddr[4] = (htempreg) & 0xFF; macAddr[5] = (htempreg >> 8) & 0xFF;len += sprintf(etherString+len, ' MAC Address : %02X:%02X:%02X:%02X:%02X:%02X\r\n',
macAddr[0],macAddr[1],macAddr[2],macAddr[3],macAddr[4],macAddr[5]);