CC2530 Simpliciti NVOBJ 保存连接状态问题
时间:10-02
整理:3721RD
点击:
目前有个小型项目需要用到简单的协议,直接用了simpliciti协议,涉及到断电保存的问题,参考了这个wiki:http://processors.wiki.ti.com/index.php/SimpliciTI_FAQ#Restoring_connection_after_power_cycle里面的Restoring connection after power cycle的例程,目前能拷贝到objptr的内容跟第一次连接的一样,但是没有建立连接,不知道为什么,下面是代码
代码段1,读取&保存objptr内容
uint8_t* nv_obj_read_nwk_cfg(void)
{
uint8_t byte[5] ;
uint8_t *data=NULL ;
uint16_t str_len ;
int i ;
EE_Sequential_Read(1,0x00,(char*)byte,4);
if((byte[0] == 'S') && (byte[1] == 'M') &&
(byte[2] == 'P') && (byte[3] == 'L'))
{
//Read config ObjLen
str_len=EE_Random_Read(1,0x05);
//assign memory for data buf
data = (uint8_t*)malloc(str_len*sizeof(uint8_t));
//Read ObjPtr from EEPROM
EE_Sequential_Read(2,0x00,(char*)data,str_len);
}
for(i=0;i<29;i++)
{
UartSendByte(data[i]);
}
return data;
}
bool nv_obj_write_nwk_cfg(uint8_t **nwk_cfg, uint16_t len)
{
int i ;
uint8_t *dat=NULL;
printf("NVOBJ Store NWK Config:");
dat = (uint8_t*)malloc(len*sizeof(uint8_t));
memcpy(dat,(*nwk_cfg),len);
if(!EE_Byte_Write(1,0x05,len))
{
printf("failed\r\n");
return false ;
}
//**page write only support 16bit in a write cycle
//**Do not use page write in case of the "roll over" situation
for(i=0;i<len;i++)
{
if(!EE_Byte_Write(2,(0x00+i),dat[i]))
{
printf("failed\r\n");
return false ;
}
}
free(dat);
EE_Byte_Write(1,0x00,'S');
EE_Byte_Write(1,0x01,'M');
EE_Byte_Write(1,0x02,'P');
EE_Byte_Write(1,0x03,'L');
printf("success\r\n");
return true;
}
代码段2 上电设置连接相关代码
void Set_Connection(void)
{
uint8_t *nwk_cfg_flash;
uint8_t *data = NULL;
int i;
nwk_cfg_flash = nv_obj_read_nwk_cfg();
if(nwk_cfg_flash==NULL)
{
while(1)
{
if (SMPL_SUCCESS == SMPL_LinkListen(&sLinkID2))
break;
LED_Toggle('G');
LED_Toggle('R');
}
LED_OFF('G');
LED_OFF('R');
Buzzer(0);
Store_Connection();
}
else
{
nwk_cfg_ram.objPtr = &data ;
nwk_cfg_ram.objLen = 0x1d ;
if(SMPL_Ioctl(IOCTL_OBJ_NVOBJ, IOCTL_ACT_GET, &nwk_cfg_ram) == SMPL_SUCCESS)
{
memcpy((*nwk_cfg_ram.objPtr), nwk_cfg_flash, nwk_cfg_ram.objLen);
for(i=0;i<29;i++)
{
UartSendByte((*nwk_cfg_ram.objPtr)[i]);
}
}
sLinkID2 = nv_obj_read_lnk_id(0);
}
}
void Store_Connection(void)
{
if(SMPL_Ioctl(IOCTL_OBJ_NVOBJ, IOCTL_ACT_GET, &nwk_cfg_ram) == SMPL_SUCCESS)
{
if(nv_obj_write_nwk_cfg(nwk_cfg_ram.objPtr,(char)nwk_cfg_ram.objLen) != true)
{
while(1);
}
nv_obj_write_lnk_id(0,sLinkID2);
}
}
void Set_Connection(void)
{
uint8_t *nwk_cfg_flash;
uint8_t *data = NULL;
int i;
nwk_cfg_flash = nv_obj_read_nwk_cfg();
if(nwk_cfg_flash==NULL)
{
while(1)
{
if (SMPL_SUCCESS == SMPL_LinkListen(&sLinkID2))
break;
LED_Toggle('G');
LED_Toggle('R');
}
LED_OFF('G');
LED_OFF('R');
Buzzer(0);
Store_Connection();
}
else
{
nwk_cfg_ram.objPtr = &data ;
nwk_cfg_ram.objLen = 0x1d ;
if(SMPL_Ioctl(IOCTL_OBJ_NVOBJ, IOCTL_ACT_GET, &nwk_cfg_ram) == SMPL_SUCCESS)
{
memcpy((*nwk_cfg_ram.objPtr), nwk_cfg_flash, nwk_cfg_ram.objLen);
for(i=0;i<29;i++)
{
UartSendByte((*nwk_cfg_ram.objPtr)[i]);
}
}
sLinkID2 = nv_obj_read_lnk_id(0);
}
}
void Store_Connection(void)
{
if(SMPL_Ioctl(IOCTL_OBJ_NVOBJ, IOCTL_ACT_GET, &nwk_cfg_ram) == SMPL_SUCCESS)
{
if(nv_obj_write_nwk_cfg(nwk_cfg_ram.objPtr,(char)nwk_cfg_ram.objLen) != true)
{
while(1);
}
nv_obj_write_lnk_id(0,sLinkID2);
}
}
6457.Desk_Zigbee.rar
这是工程,求解答,万分感谢
如果恢复出来的内容都一样的话,之前保存的地址信息都在,直接可以发送数据吗?
你好,不好意思才关注到,是的,恢复出来发送/接收都不可用
你好,已经搞定了,谢谢
