电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
lora开发之sx1278芯片无线通信
分 享
扫描二维码分享
lora开发之sx1278芯片无线通信
lora
无线收发
sx1278
大斯
关注
发布时间: 2020-03-11
丨
阅读: 3009
# First 这篇文章主要是关于如何使用常见的sx1278芯片实现无线通信,众多周知,随着城市智能化、感知与互联的发展需求,越来越多的碎片化终端设备需要低功耗长距离传输的接入网络。以LoRa为代表的低功耗、远距离网络技术的出现,有机会打破物联网在互联方面的瓶颈,促进物联网端对端的成本大幅下降,引爆物联网的大规模应用。 ### 1、大家可随意选择不同厂家的lora芯片,自行阅读数据手册配合此教程使用 ![](https://cf02.ickimg.com/bbsimages/202003/c5a5f9cedd791a26385dec15cf1e41e9.png) ![](https://cf02.ickimg.com/bbsimages/202003/66563668260380909a0ad255a91ae1f6.png) 我们主要用到的引脚就是RESET复位脚、SPI功能脚和数字输入输出DIO0 - RESET复位脚:输入引脚,低电平有效 - SPI功能脚:可以使用硬件SPI或者IO口模拟SPI。例程中使用的是硬件SPI 1. SCK : SPI总线时钟引脚,常态为高电平 1. NSS : SPI片选口,低电平有效 1. MOSI : SPI总线从机输入引脚,当MCU向模块写数据时,数据从引脚写入 1. MISO : SPI总线从机输出引脚,当MCU读取数据模块时,模块数据由此引脚输出 - 数字输入输出: ![](https://cf02.ickimg.com/bbsimages/202003/3b40f0cc21cefc496f2f7b535374ec96.png) 因为只是简单的收发操作,所以只需要用到DIO0即可,如果想要在发送之前做CAD信道检测的话,还需要初始化其他的引脚。这个后续我们在细说。关于DIO0,大家要了解的是当lora发送或者接受一包数据的时候都会产生中断,我们要做的操作就是检测这个中断,从而去进行收发数据。 ### 2、了解lora的参数的意义,可以更好的对lora初始化时进行配置(LORA模式下) - 扩频因子 lora扩频调制技术采用多个信息码片来代表有效负载信息的每个位,扩频信息的发送速度称为符号速率(RS),而码片速率与标称符号速率之间的比值即为扩频因子。简单来说,扩频时你的数据每一位都和扩频因子相乘。假设你有1bit需要传输,当扩频因子为1时,传输的数据1就用一个1来表示;扩频因子为6时,就用111111来代表1。也就是说数据的传数量变大了。 ![](https://cf02.ickimg.com/bbsimages/202003/b428062a64954c0943657166459f157c.png) ![](https://cf02.ickimg.com/bbsimages/202003/1bd0daa219eee948f578f4cb14078d91.png) - 编码率 lora调制调解器采用循环纠错编码进行前向错误检测与纠错 - 信号带宽 lora模式下的带宽是指双边带带宽,增加信号带宽,可以有效的提高数据速率来缩短传输时间。当然这也牺牲了一部分的接收灵敏度 ![](https://cf02.ickimg.com/bbsimages/202003/25171c8e0eade6b83721bc5202364b02.png) ![](https://cf02.ickimg.com/bbsimages/202003/771e265724c864345710d4a3a71debf1.png) - 频率 这个大家只要在规定范围内设置即可,注意:收发两方的频率设置必须一致 ![](https://cf02.ickimg.com/bbsimages/202003/50ad6d167daa2dbed6a21204da614071.png) - 发射功率 芯片有几个不同的射频管脚,PA_HF(大于779 MHz) and PA_LF(小于525 MHz)都最多输出14dBm。PA_BOOST则比较厉害点,可持续输出17dBm,duty cycled operation周期性工作可飙到20dBm。 大家可以在对lora初始化的时候就设置好这些参数,配置的话其实就是对于寄存器的配制,这个我们后边在代码部分再看一下。根据这些参数,打击可以查阅一下数据手册来估算一下数据的发送时间,看一下和你实际测试过程中的时间差别大吗?这里给大家推荐一个在线计算时间的网站 [lora发送时间计算](https://www.loratools.nl/#/airtime "lora发送时间计算") ### 3、软件设计 选择一款单片机,首先我们要配置好单片机的SPI功能,然后对需要用到的引脚进行初始化: ```c //复位引脚福安口初始化 Gpio_InitIOExt(1,5,GpioDirOut,TRUE, FALSE, FALSE, FALSE); Gpio_SetIO(1,5,TRUE); //配置DIO0中断 Gpio_InitIOExt(1, 4, GpioDirIn, FALSE, TRUE, FALSE, FALSE); Gpio_ClearIrq(1, 4); Gpio_EnableIrq(1, 4, GpioIrqRising); EnableNvic(PORT1_IRQn, DDL_IRQ_LEVEL_DEFAULT, TRUE); ``` 对lora进行初始化设置,前面我们已经讲了lora的参数的意义,实际上就是对寄存器的配置,大家可以去查阅一下芯片的数据手册了解一下寄存器汇总表,在初始化的时候,你可以只设置需要配置的寄存器,其他的使用复位值。也可以按照顺序全部进行配置。 ```c SX1278_sleep(module); //Sleep mode delay1ms(15); SX1278_entryLoRa(); SX1278_standby(module); //Entry standby mode delay1ms(15); ``` lora进入睡眠模式(低功耗模式下,此时lora的电流可降至2ua),只有SPI和配置寄存器可以访问。此时,将芯片切换至lora调制模式下。睡眠模式下是唯一允许切换调制模式的操作模式。切换完了后,进入待机模式。此时进行初始化的配置。 ```c SX1278_SPIBurstWrite(LR_RegFrMsb,(uint8_t*)SX1278_Frequency[frequency], 3); //频率 SX1278_SPIWrite(LR_RegPaConfig, SX1278_Power[power]); //功率 SX1278_SPIWrite(LR_RegOcp, 0x0B); //RegOcp,Close Ocp SX1278_SPIWrite(LR_RegLna, 0x23); //RegLNA,High & LNA Enable if(SX1278_SpreadFactor[LoRa_Rate] == 6) { uint8_t tmp; SX1278_SPIWrite(LR_RegModemConfig1, ((SX1278_LoRaBandwidth[LoRa_BW] << 4) + (SX1278_CR << 1) + 0x01)); SX1278_SPIWrite(LR_RegModemConfig2,((SX1278_SpreadFactor[LoRa_Rate] << 4) + (SX1278_CRC << 2)+ 0x03)); SX1278_SPIRead(0x31,&Dbuf,1); tmp = Dbuf; tmp &= 0xF8; tmp |= 0x05; SX1278_SPIWrite(0x31, tmp); SX1278_SPIWrite(0x37, 0x0C); }else{ SX1278_SPIWrite(LR_RegModemConfig1,((SX1278_LoRaBandwidth[LoRa_BW] << 4) + (SX1278_CR << 1) + 0x00)); SX1278_SPIWrite(LR_RegModemConfig2,((SX1278_SpreadFactor[LoRa_Rate] << 4) + (SX1278_CRC << 2)+ 0x03)); } SX1278_SPIWrite(LR_RegSymbTimeoutLsb, 0xFF); SX1278_SPIWrite(LR_RegPreambleMsb, 0x00); //RegPreambleMsb SX1278_SPIWrite(LR_RegPreambleLsb, 12); //RegPreambleLsb SX1278_SPIWrite(REG_LR_DIOMAPPING2, 0x01); module->readBytes = 0; SX1278_standby(module); //Entry standby mode ``` 这一块没什么好讲的,就是通过SPI往lora的寄存器里面写值,大家需要配置好SPI,写一个SPI读写的函数,在这里直接调用SPI_Write和SPI_Read就可以了。大家到这一步之后可以先测试一下,读一下lora的版本寄存器,看一下是否和复位值一样。只要SPI读写没什么问题,收发基本上都能实现的。 既然是收发,自然是需要两个lora模块,一个用来定时发送数据,一个用来接收数据。要接收数据,所以我们需要将其在初始化完成后配置成RX模式 ![](https://cf02.ickimg.com/bbsimages/202003/1b76610e20a98e8e0318be9269154021.png) ```c int SX1278_LoRaEntryRx(SX1278_t * module, uint8_t length, uint32_t timeout) { uint8_t addr; module->packetLength = length; SX1278_defaultConfig(module); SX1278_SPIWrite(REG_LR_PADAC, 0x84); //Normal and RX SX1278_SPIWrite(LR_RegHopPeriod, 0xFF); //No FHSS SX1278_SPIWrite(REG_LR_DIOMAPPING1,0x01);//DIO0映射 SX1278_SPIWrite(LR_RegIrqFlagsMask, 0x3F);//Open RxDone interrupt SX1278_clearLoRaIrq(); SX1278_SPIWrite(LR_RegPayloadLength, length); SX1278_SPIRead(LR_RegFifoRxBaseAddr,&addrbuf,1); addr = addrbuf; SX1278_SPIWrite(LR_RegFifoAddrPtr, addr); SX1278_SPIWrite(LR_RegOpMode, 0x8d); //配置为RX模式 module->readBytes = 0; while(1) { uint8_t RegModemStat; SX1278_SPIRead(LR_RegModemStat,&ModemStatbuf,1); RegModemStat = ModemStatbuf; if((RegModemStat & 0x04 ) == 0x04) { module->status = RX; return 1; } if(--timeout == 0) { SX1278_hw_Reset(); SX1278_defaultConfig(module); return 0; } delay1ms(1); } } ``` 同理在lora要发送时,也要先将lora配置成发送模式,这里就不给大家贴代码了,文章末尾会有整个代码的链接。至于定时发送的实现大家可以选择定时器或者看门狗都可以的,接下来就是等待DIO0的中断啦,大家在中断里面可以先将接收到数据缓存一下,数据处理的部分可以放到大循环里面做。 ```c uint8_t SX1278_LoRaRxPacket(SX1278_t * module) { unsigned char addr; unsigned char packet_size; if(LoRaNodeRxFlag) { memset(module->rxBuffer, 0x00, SX1278_MAX_PACKET); SX1278_SPIRead(LR_RegFifoRxCurrentaddr,&RegFifoRxCurrentaddrbuf,1); addr = RegFifoRxCurrentaddrbuf; SX1278_SPIWrite(LR_RegFifoAddrPtr, addr); //RxBaseAddr -> FiFoAddrPtr if (module->LoRa_Rate == SX1278_LORA_SF_6) { packet_size = module->packetLength; }else{ SX1278_SPIRead(LR_RegRxNbBytes,&RegRxNbBytesbuf,1); packet_size = RegRxNbBytesbuf; } SX1278_SPIRead(0x00, module->rxBuffer, packet_size); module->readBytes = packet_size; SX1278_clearLoRaIrq(); } return module->readBytes; } ``` LoRaNodeRxFlag就是DIO0的中断标志,可以从代码上看到当检测到了中断信号后,先将rxBuffer缓存区清空,找到接收数据的起始地址和字节长度,将数据读写到rxBuffer缓存区内,然后读完了清一下标志。非常简单。发送就更简单了,发完产生中断后清一下标志就OK啦!最后,在主函数中调用你的接收或者发送函数就可以了。 最后附上全部的代码:https://github.com/sixsmall/LORA.git
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
5
)
大斯
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交