//////////////////////////////////////////////////////////////////////////////// // 版权: 利尔达科技集团股份有限公司 // 文件名: main_tx/rx // 版本: v1.0 // 工作环境: IAR v5.30 // 作者: 于海波 // 生成日期: 2013.12 // 功能: A发送包书记给B,黄灯闪烁,B模块接到数据红灯闪烁,B将数据回传给A模块, // A接到数据后红灯闪烁, 循环次操作, // 相关文件: // 修改日志: //////////////////////////////////////////////////////////////////////////////// #include #include #include #include "driver.h" #include "sx1276-f4152-Hal.h" #include "LSD_RF_SX1276.h" #include "LSD_RF_APPrf.h" #include "clock.h" //===================================定义变量=================================================== long SysTick = 0; uint8_t TXbuffer[30]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29}; uint8_t WakeAddr[8]={5,6,7,8,9,10,11,7}; uint8_t Rxbuffer[64]; //===================================函数声明=================================================== //=============================================================================================== //////////////////////////////////////////////////////////////////////////////// // 功能描述 : 主函数 // 输入参数 : 无 // 返回参数 : 无 // 说明 : //////////////////////////////////////////////////////////////////////////////// typedef enum{ Nope, B300bps,//BW = 500KHz SF = 7 CR = 4_6 B1080bps,//BW = 125KHz SF = 9 CR = 4_6 B4000bps,//BW = 125KHz SF = 7 CR = 4_5 }t_Baudrate; t_Baudrate Baudrate = Nope; unsigned char *point; unsigned char Reg_PKTSNR = 0; unsigned char Reg_PKTRssi = 0; unsigned char Reg_Rssi = 0; unsigned char LCD_p[9] = {0,0,0,0,0,8,0,1,0xff}; int T_Cnt = 0; int R_Cnt = 0; bool RESET_Flag = false; void main( void ) { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗 platform_init(); //测试底板初始化 LEDONBAND(LEDALL); //初始化过程点亮所有LED灯 KEYBOARD_DIR &=~ (KEY_S1+KEY_S2); KEYBOARD_IFG &=~ (KEY_S1+KEY_S2); KEYBOARD_IES |= (KEY_S1+KEY_S2); KEYBOARD_IE |= (KEY_S1+KEY_S2); point = (unsigned char *)(&(G_LoRaConfig.BandWidth)); flash_read(FLASH_ADDRESS_D,point,3*2); if(G_LoRaConfig.BandWidth>BW500KHZ){ G_LoRaConfig.BandWidth=BW125KHZ; G_LoRaConfig.SpreadingFactor = SF09; G_LoRaConfig.CodingRate = CR_4_6; flash_seg_clear(FLASH_ADDRESS_D);//写之前必清除 flash_write(FLASH_ADDRESS_D,point,3*2); } if(G_LoRaConfig.SpreadingFactor==SF11){ Baudrate = B300bps; LCD_p[8] = 1; } else{ if(G_LoRaConfig.SpreadingFactor==SF07){ Baudrate = B4000bps; LCD_p[8] = 3; } else{ Baudrate = B1080bps; LCD_p[8] = 2; } } LCD_p[7] = 0xff;LCD_p[6] = 0;LCD_p[5] = 0;LCD_p[4] = 0; lcd_init(); LCD_Disp_ALL_Num(LCD_p); //配置各个参数 G_LoRaConfig.LoRa_Freq = 474600000; //中心频点470MHz //G_LoRaConfig.BandWidth = BW125KHZ; //BW = 125KHz //G_LoRaConfig.SpreadingFactor = SF09; //SF = 9 //G_LoRaConfig.CodingRate = CR_4_6; //CR = 4/6 G_LoRaConfig.PowerCfig = 15; //19±dBm G_LoRaConfig.MaxPowerOn = true; G_LoRaConfig.CRCON = true; //CRC开启 G_LoRaConfig.ExplicitHeaderOn = true; //Header开启 G_LoRaConfig.PayloadLength = 20; //数据包长度 if(SX127x_init()!=NORMAL) WDTCTL=0; //无线模块初始化失败复位 KEYBOARD_IE |= (KEY_S1+KEY_S2); _EINT(); //开总中断 LEDOFFBIT(LEDALL); //初始化完毕关闭所有LED灯 ON_Timerout(); //开启定时器,1s一发数据 while(1) { LPM3; if(RESET_Flag==true){ flash_seg_clear(FLASH_ADDRESS_D);//写之前必清除 flash_write(FLASH_ADDRESS_D,point,3*2); WDTCTL = 0;//RESET } LSD_RF_RXmode(); //每次发送一包数据后,进入接收状态,等待B模块应答 /****RSSI*****/ //中断中已经算过符号 LCD_p[6] = Reg_PKTRssi/100%10; LCD_p[5] = Reg_PKTRssi/10%10; LCD_p[4] = Reg_PKTRssi%10; LCD_p[0] = T_Cnt%10; LCD_p[1] = T_Cnt/10%10; LCD_p[2] = R_Cnt%10; LCD_p[3] = R_Cnt/10%10; /****Cnt *****/ //LCD_p[0] = T_Cnt%10; //LCD_p[1] = T_Cnt/10%10; //LCD_p[2] = R_Cnt%10; //LCD_p[3] = R_Cnt/10%10; LCD_ClrLcd_ALL(); LCD_Disp_ALL_Num(LCD_p); if(T_Cnt>=100) T_Cnt = 0; if(R_Cnt>=100) R_Cnt = 0; } } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : 无线接收数据中断入口 // 输入参数 : 无 // 返回参数 : 无 // 说明 : //////////////////////////////////////////////////////////////////////////////// #pragma vector = PORT1_VECTOR __interrupt void port1_isr(void) { if(KEYBOARD_IFG&(KEY_ALL)){ char Keys_Flag = KEYBOARD_IFG&(KEY_ALL); switch(Keys_Flag&(KEY_S1|KEY_S2)){ case KEY_S1: switch(Baudrate){ case B1080bps: G_LoRaConfig.BandWidth = BW125KHZ; //BW = 125KHz G_LoRaConfig.SpreadingFactor = SF07; //SF = 9 G_LoRaConfig.CodingRate = CR_4_6; //CR = 4/6 Baudrate = B4000bps; break; case B4000bps: G_LoRaConfig.BandWidth = BW125KHZ; //BW = 125KHz G_LoRaConfig.SpreadingFactor = SF11; //SF = 9 G_LoRaConfig.CodingRate = CR_4_8; //CR = 4/6 Baudrate = B300bps; break; case B300bps: default: G_LoRaConfig.BandWidth = BW125KHZ; //BW = 125KHz G_LoRaConfig.SpreadingFactor = SF09; //SF = 9 G_LoRaConfig.CodingRate = CR_4_6; //CR = 4/6 Baudrate = B1080bps; break; } RESET_Flag = true; LPM3_EXIT; break; case KEY_S2: T_Cnt = 0; R_Cnt = 0; break; default: break; } KEYBOARD_IFG &= ~KEY_ALL; return; } if(DIO0_IFG) //判断是否是DIO0引起的中断 { DIO0_IFG = 0; //清除DIO0中断标志位 LSD_RF_RxPacket(Rxbuffer); //接收数据包 #include "sx1276-LoRa.h" signed int temp = 0,test; SX1276Read( REG_LR_PKTSNRVALUE,&Reg_PKTSNR); test = (signed char)Reg_PKTSNR; if((Reg_PKTSNR&0x80)!=0){//负数 //LCD_p[3] = 10;//Reg_PKTSNR Reg_PKTSNR = ~(Reg_PKTSNR)+1; temp = -Reg_PKTSNR; } else{ //LCD_p[3] = 0xff;//Reg_PKTSNR temp = Reg_PKTSNR; } test++; SX1276Read( REG_LR_PKTRSSIVALUE,&Reg_PKTRssi); if(temp>0){ temp = -164+Reg_PKTRssi*16/15; //if(temp>-50) //temp = -137+Reg_PKTRssi; } else{ temp = -164+Reg_PKTRssi+(signed char)(temp*0.25+0.5); } if(temp<0){ LCD_p[7] = 10; Reg_PKTRssi = -temp; } else{ LCD_p[7] = 0xff; Reg_PKTRssi = temp; } //SX1276Read( REG_LR_RSSIVALUE,&Reg_Rssi); //Reg_Rssi if(memcmp(Rxbuffer,TXbuffer,20)==0) { LEDONBIT(LED1); //状态指示灯 DelayMs(60); LEDOFFBIT(LED1); //状态指示灯 R_Cnt++; } LPM3_EXIT; } P1IFG=0; } //////////////////////////////////////////////////////////////////////////////// // 功能描述 : 超时定时器 // 输入参数 : 无 // 返回参数 : 无 // 说明 : 用于误唤醒,或唤醒失败后超时时间到后重新进入WOR //////////////////////////////////////////////////////////////////////////////// #pragma vector = TIMER1_A0_VECTOR __interrupt void Timer1_A0_ISR() { static uint8 t=0; t++; if(Baudrate >= B1080bps) t = 5; if(Baudrate == B300bps) t++; if(t >= 5) { LEDONBIT(LED3);//发送状态指示灯 G_LoRaConfig.PayloadLength = 20; SX1276Reset(); if(SX127x_init()!=NORMAL) WDTCTL=0; LSD_RF_SendPacket(TXbuffer);//发送30个字节数据测试 T_Cnt++; LEDOFFBIT(LED3);//发送状态指示灯 LPM3_EXIT; t = 0; } }