ShipCentralControl/RF-AP/资料及文档/SX127X参考例程/main_TX.c

263 lines
8.3 KiB
C
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

////////////////////////////////////////////////////////////////////////////////
// 版权: 利尔达科技集团股份有限公司
// 文件名: main_tx/rx
// 版本: v1.0
// 工作环境: IAR v5.30
// 作者: 于海波
// 生成日期: 2013.12
// 功能: A发送包书记给B黄灯闪烁B模块接到数据红灯闪烁B将数据回传给A模块
// A接到数据后红灯闪烁 循环次操作,
// 相关文件:
// 修改日志:
////////////////////////////////////////////////////////////////////////////////
#include <string.h>
#include <stdint.h>
#include <stdbool.h>
#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;
}
}