LORA-B1 实现点对点通信
上一节针对lora的驱动移植工作已经完成,而本节就要实现lora-b1开发板的点对点通信。一块儿板子作为发送端,另一块儿作为接收端。上电以后发送端每个500ms发送一次数据,接收端接收到以后进行解析分析如果和发送的数据一样LED进行一次亮灭切换。
开发环境准备:
硬件:
- Lora-B1开发板两块(一发一收)
- DAPLINK(或STLINK、Jlink)调试器
软件:
- stm32cubemx
- MDK5
- 基于上节移植好驱动的代码
修改Lora参数配置:
Sx1278芯片无线通信支持lora、fsk、ook等通信模式。而我们就只讨论lora模式下的配置,而针对lora模式又有很多参数可以配置。
打开sx1276-lora.c文件,如下图所示地方就是默认的参数配置,这里一共有13个参数,而我们要修改lora模式下通信参数也是在这里修改。
这13个参数从上到下分别表示:
- 无线通信频率
- 功率
- 带宽
- 扩频因子
- 纠错码
- CRC校验开关
- 隐藏头部信息开关
- 接收单次模式、连续模式配置
- 跳频模式开关
- 跳频之间的周期长度
- 发送包超时时间
- 接收包超时时间
- 负载信息长度
无线通信频率,我们使用的是sx1278芯片,和sx1276芯片在频率上有区别,所以这里我们要配置在sx1278范围内的频率。可参考下图:
扩频因子可能不太好理解,可以简单的先理解为lora的一种提高传输可靠性的技术,其他参数不变的情况下扩频因子越大,传输固定量数据需要的时间越长,抗干扰性越好。相反,扩频因子越小,传输的速度快但抗干扰性会降低。
关于跳频我们本节不会使用,所以把跳频可以关掉。
还有个单次接收和连续接收的配置,我们把他修改为连续接收,也就是一直处于接收状态。在一定时间内没有收到数据也不会产生接收超时。
所以最终我们需要在默认值的基础上修改两个参数,频率改为429000000;RxSingleOn设置为0即为连续接收模式。
编写lora发送接收应用:
一上电初始化完成之后进入while循环,发送端会每500ms发送一包数据,发送完成LED闪烁一次。
接收端接收到数据以后,进行比对,如果和发送端发送的数据一样就让led闪烁一次。
代码如下:
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
int main(void) { /* USER CODE BEGIN 1 */ uint16_t counter=0; uint8_t rbuf[10]; uint16_t rlen; /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_SPI1_Init(); /* USER CODE BEGIN 2 */ tRadioDriver *radio; radio = RadioDriverInit( ); radio->Init(); radio->StartRx(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { switch(radio->Process()) { case RF_RX_DONE: radio->GetRxPacket(rbuf,&rlen); if(memcmp(rbuf,"12345",rlen)==0) { HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin); } break; case RF_TX_DONE: radio->StartRx(); HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin); break; } HAL_Delay(1); counter++; if(counter==500) { if(loratx==1) { radio->SetTxPacket( "12345", 5); } counter=0; } /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ } |
实验结果:
分别把发送端程序和接收到程序烧录到两块儿LORA-B1开发板。上电可以看到两块儿板上led等都开始闪烁,当按下发送端板子复位按键停止运行时,接收端的LED也不再会闪烁。
loratx 这个是变量吗
是的