背景
现在物联网就是很火,lora是避免不开的,也有个项目采用STM8S003F3P6 使用周立功的lora模组ZM470SX-MP实现lora通信。
原理图
废话少说,上原理图
这个原理图我找了很久都没有找到,指示找到了管脚图,这个原理图非常简单,就是通过STM8S003F3P6 两路IO检测开关量信号,通过lora上报,开关量信息。
ZM470SX-MP简介
这里也是说明手册的一些材料,更多材料可以参考手册,需要注意的是这个不是透传LORA,用起来有点复杂,虽然周立功提供了一些API函数;对比那些透传LORA的设计方式,有点就是功耗低,因为没有多一个控制MCU。
ZM470SX-MP 模块是广州致远电子 有限公司自主研发的一款工业级射频无 线产品。模块采用源自军用战术通信系统 的 LoRa 调制技术设计,完美解决了小数 据量在复杂环境中的超远距通信问题。 相较传统调制技术, ZM470SX-MP 模块在抑制同频干扰的性能方面也具有 明显优势,解决了传统设计方案无法同时 兼顾距离、抗扰和功耗的弊端。另外,芯 片集成了+30dBm 的可调功率放大器,可 获得超过-148dBm 的接收灵敏度,链路预 算达到了行业领先水平,针对应用于远距 离传输且对可靠性要求极高的场合,该方 案是不二之选。
频率范围:410~525MHz
工作电压 2.6~3.6 V;
接收电流 14mA,发射电流 800mA@28dBm;
发射功率可调:23~30dBm;
接收灵敏度可达-148dBm;
传输速率 0.123~300 kbps;
支持 FSK/GFSK/MSK/GMSK/LoRa/OOK 等调制方式;
载波频率可编程;
发送和接收缓冲区共 256 字节;
支持多种低功耗操作模式;
可有效抑制同频干扰;
3.3V 接口电平;
采用 SPI 总线通信接口。
长×宽×高:15×15×2.2(mm)
软件设计
这里主要是移植了周立功的API函数,对应好IO直接调用如下,main函数中完成初始化,然后就是周期发送IO开关量信息。
void main(void)
{
BSP_Initializes();
Init_IO(); //IO口配置
Radio = RadioDriverInit();//注册相关的函数
Radio->Init(); //无线模块初始化
Radio->RFOpModeSet(RFLR_OPMODE_SLEEP);//进入睡眠状态
while(1)
{
LED_ON; //LED亮
SoftwareDelay(0x6000);
LED_OFF; //LED灭
SoftwareDelay(0x6000);
SendHeartbeat();
// Temp = 0;
// if(INTPUT_0 != 0)
// Temp += 1;
// if(INTPUT_1 != 0)
// Temp += 2;
// if(Temp != 0)
// {
// SensorFlag = 0xF0 + Temp;
// Temp = 0;
// SendHeartbeat();
// }
}
}
关于模块接口IO宏定义如下
#define INPUT_0_Port GPIOD
#define INPUT_0_Pin GPIO_PIN_3
#define INPUT_1_Port GPIOD
#define INPUT_1_Pin GPIO_PIN_4
#define RF_RST_Port GPIOC
#define RF_RST_Pin GPIO_PIN_3
#define RF_SEL_Port GPIOC
#define RF_SEL_Pin GPIO_PIN_4
#define RF_MOSI_Port GPIOC
#define RF_MOSI_Pin GPIO_PIN_5
#define RF_MISO_Port GPIOC
#define RF_MISO_Pin GPIO_PIN_6
#define RF_SCK_Port GPIOC
#define RF_SCK_Pin GPIO_PIN_7
#define RF_DIO0_Port GPIOB
#define RF_DIO0_Pin GPIO_PIN_4
#define RF_DIO1_Port GPIOB
#define RF_DIO1_Pin GPIO_PIN_5
#define RF_DIO2_Port GPIOD
#define RF_DIO2_Pin GPIO_PIN_2
//******************************************************************
//**无线模块相关IO口************************************************
#define RF_SEL_L RF_SEL_Port->ODR &=~RF_SEL_Pin //无线模块片选低电平
#define RF_SEL_H RF_SEL_Port->ODR |= RF_SEL_Pin //无线模块片选高电平
#define RF_MOSI_L RF_MOSI_Port->ODR &=~RF_MOSI_Pin
#define RF_MOSI_H RF_MOSI_Port->ODR |= RF_MOSI_Pin
#define RF_SCK_L RF_SCK_Port->ODR &=~RF_SCK_Pin
#define RF_SCK_H RF_SCK_Port->ODR |= RF_SCK_Pin
#define RF_MISO_READ (RF_MISO_Port->IDR&RF_MISO_Pin)
#define RF_RST_L RF_RST_Port->ODR &=~RF_RST_Pin;
#define RF_RST_H RF_RST_Port->ODR |= RF_RST_Pin;
#define RF_IRQ0_READ ((RF_DIO0_Port->IDR&RF_DIO0_Pin) != 0)/*读取模块中断输出引脚状态*/
#define RF_IRQ1_READ ((RF_DIO1_Port->IDR&RF_DIO1_Pin) != 0)/*读取模块中断输出引脚状态*/
/*
#define RF_DIO1 P2IFG & BIT3
#define RF_DIO0 P2IFG & BIT7
#define RF_DIO1_0 P2IFG &= ~BIT3
#define RF_DIO0_0 P2IFG &= ~BIT7
*/
提供的库移植
总结,其实lora的核心模块就是sx1276这个芯片,ZM470SX-MP模组只是基于这个芯片把外围电路设计好啦,真正的控制和loar协议,需要放到STM8上,我的应用还好比较简单,如果一些复杂的应用,使用STM8就有点吃力了。毕竟STM8的RAM/ROM空间都不大。