void halRfSendPacket(BYTE *txBuffer, UINT8 size) { halSpiStrobe(CC1100_SFTX); Dly1mS(10); halSpiWriteBurstReg(CC1100_TXFIFO, txBuffer, size); Dly1mS(10); halSpiStrobe(CC1100_STX); Dly1mS(10); TMR0=0; T0IF=0; while((halSpiReadStatus(CC1100_TXBYTES)&0x7F)!=0x00) { Dly1mS(2); if(T0IF) { halSpiStrobe(CC1100_SIDLE); return ; } } LED1=0; return ; }// halRfSendPacket*/
void main() { INT8U i=0; INT8U search_temp = 0x06; // search_temp 可以增加到6 在search_temp小于3的时候 开始发送广播唤醒 CpuInit(); POWER_UP_RESET_CC1100(); halRfWriteRfSettings(); halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8); CC1101_Setwor(); G_IT_ON; // 开启单片机全局中断 Usart_printf(&g_module_id.Sn[0],1); Usart_printf(&g_module_id.Sn[1],1); Usart_printf(&g_gateway.Sn[0],1); Usart_printf(&g_gateway.Sn[1],1); Log_printf(" "); // 上电设置网关 // 只有外部中断没有打开,现在进行设置网关字节 地址和网管不能为全0xFFFF while( ( 0xFFFF == g_gateway.Sn_temp ) || ( 0xFFFF == g_module_id.Sn_temp ) ) { LED_D4 = ~LED_D4; delay(50000); if( 0x55 == g_rx_flag ) { g_rx_flag = 0x00; // 将网关数据写入 IapProgramByte(GATEWAY_ADDRESS,TxBuf[1]); IapProgramByte(GATEWAY_ADDRESS+1,TxBuf[2]); //g_gateway.Sn_temp = IapReadByte(GATEWAY_ADDRESS); // 将地址数据写入 IapProgramByte(MODEL_SN_ADDRESS,TxBuf[3]); IapProgramByte(MODEL_SN_ADDRESS+1,TxBuf[4]); //g_module_id.Sn_temp = IapReadByte(MODEL_SN_ADDRESS); Log_printf("GATEWAY OK\n"); Log_printf("MODEL_SN OK\n"); LED_D4 = 0; // 读取设置数据 IapReadModelSn(MODEL_SN_ADDRESS,&g_module_id); IapReadModelSn(GATEWAY_ADDRESS,&g_gateway); } } // g_module_rpl = IapReadByte(MODEL_RPL); // 默认模块id的路由等级1 模块ID 最高位为0 表示路由模块 g_module_id.Sn[0] |= ( (g_module_rpl<<4) & 0x7F ); g_pre_src = g_module_id.Sn_temp; Usart_printf(&g_module_id.Sn[0],1); Usart_printf(&g_module_id.Sn[1],1); Usart_printf(&g_gateway.Sn[0],1); Usart_printf(&g_gateway.Sn[1],1); Log_printf(" initialization ok "); // 地址网关设置完成 LED_D2 = ~LED_D2; // 读出搜索模式 首次上电为0xFF 则进行搜索 g_search = IapReadByte(SEARCH_MODE); if( 0xFF == g_search ) { SearchMode: while( search_temp-- != 0 ) { SearchData[2] = g_rid; // 网关地址 SearchData[4] = g_gateway.Sn[0]; SearchData[5] = g_gateway.Sn[1]; // 源地址(模块ID) SearchData[9] = g_module_id.Sn[0]; SearchData[10] = g_module_id.Sn[1]; // 目的地址(网关地址) SearchData[11] = g_gateway.Sn[0]; SearchData[12] = g_gateway.Sn[1]; for( i=0;i<13;i++) { SearchData[13] += SearchData[i]; } // 进行唤醒时,只需要把路由标识滤除即可 将路由标识高字节分出一位代表是模块还是基站 // 首先发送唤醒波,而后发送数据 进行路由搜索时,使用广播唤醒 if( search_temp < 3 ) CC1101_Wakeupcarry(WorCarry, 2,4); halRfSendPacket(SearchData, 14); g_rid++; // 发送完成后g_rid自增 //g_wor_flag = 0x55; timer = 0; Timer0_Init(10); TIMER0_ON; //g_search = 0x55; g_enter_rx = 0x55; // 存放校验和 SearchData[13] = 0x00; goto EnterRx; } g_search = 0x00; } // else // { // g_search = 0x00; // } while (1) { //Log_printf("Enter wor\n"); if( 0x55 == g_wor_flag ) { CC1101_Worwakeup(); // 将接收的数据存储到RxBuf数组中 EnterRx: while(g_enter_rx) halRfRxPacket(RfRecBuf); // 此处进行rf数据处理 if( 0x55 == g_rf_rx_flag ) { g_rf_rx_flag = 0x00; RfRouteManage(&rf_route_data); } if( 0xFF == g_search ) // 若没有搜索到路径,则跳转回搜索路径 goto SearchMode; } halSpiStrobe(CCxxx0_SWORRST); // 复位到 事件1 halSpiStrobe(CCxxx0_SWOR); // 启动WOR INT1_ON; // 开外部中断 PCON |= PD_ON; // 从掉电模式唤醒后,程序从这行开市 //Log_printf("Exit pd\n"); } }