2.4G的CC253X芯片由TI公司生产,可以很容易建立在基于IEEE802.15.4标准协议上面,现今多数Zigbee传感节点都是用CC253X的芯片。
CC253X的IEEE地址共分为三种:Primary IEEE, Secondary IEEE和Random IEEE。其中Primary IEEE地址在生产时已经由TI预先确定,无法更改,而对于Secondary IEEE地址用户则可以更改,如果无法获取Primary IEEE 和 Secondary IEEE时,则会是用第三种随机地址来代替自己的Mac地址。
(1)Primary IEEE
首先了解一下芯片Flash Information Page ,芯片存储闪存数据信息的起始地址为0x7800,所以在ioCC2530.h头文件中定义的Flash Information Page的起始位置,#define P_INFOPAGE PXREG( 0X7800 ),
另外,Primary IEEE地址就存储在该page中,其存储的位置偏移量为0xC, 所以要拿到Primary IEEE的地址,只需
uint8 *macaddrptr = (uint8 *)(P_INFOPAGE+HAL_INFOP_IEEE_OSET); for(int i=0;i<8;i++) { devmacaddr[i] = macaddrptr[i]; }
其中P_INFOPAGE = 0x7800,即存储地址的起始位置,HAL_INFOP_IEEE_OSET为0xC,是地址存放位置的偏移量,因为地址为8个字节,所以读取向后读取8个字节就是其Mac地址。
(2)Secondary IEEE
根据CC253X的数据手册,Secondary IEEE存放在flash的最后偏移量为0x18(24)的地方,对于F-256的CC253X,其flash有256K,即246*1024=262144字节,所以其地址存放在262144-24=262120=0x3FFE8的位置,因为地址长度为8个字节,所以地址的范围为0x3FFE8~0x3FFEF。
获取地址的函数:
HalFlashRead(HAL_FLASH_IEEE_PAGE, HAL_FLASH_IEEE_OSET, aExtendedAddress, Z_EXTADDR_LEN);
其中HAL_FLASH_IEEE_PAGE = 127,即最后一页,HAL_FLASH_IEEE_OSET = (2048-16-8)=2024,即偏移量。由于是最后一页,所以要对MEMCTR(存储控制寄存器)进行控制。具体代码如下:
void HalFlashRead(uint8 pg, uint16 offset, uint8 *buf, uint16 cnt)
{
// Calculate the offset into the containing flash bank as it gets mapped into XDATA.
uint8 *ptr = (uint8 *)(offset + 0x8000) + ((pg % 16) * 2048);//每块的为16页,((pg % 16) * // 2048)求出最后一块中地址 //所在那一页之前的所有地址, //加上地址所在那一页的偏移量
uint8 memctr = MEMCTR; // Save to restore.
pg /= HAL_FLASH_PAGE_PER_BANK; // Calculate the flash bank from the flash page.
// Calculate and map the containing flash bank into XDATA.
MEMCTR = (MEMCTR & 0xF8) | pg; //将存储控制器指向最后一块
while (cnt--)
{
*buf++ = *ptr++;
}
MEMCTR = memctr;
}