完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
E22-230T22S是什么?
E22-230T22S LoRa无线模块有何特性? 怎样通过串口对E22-230T22S LoRa模块进行配置和发送数据呢? |
|
相关推荐
1个回答
|
|
一、E22-230T22S介绍
我使用的是E22-230T22S LoRa无线模块,模块基于SEMTECH公司SX1262射频芯片的无线串口模块(UART),具有多种传输方式,工作在220.125-236.125频段(默认230.125MHz),LoRa扩频技术,TTL电平输出,兼容3.3V与5V得IO口电压。 1.1工作参数 这里的电源最好是5V供电,5V一定是非常纯净,硬件设计时,多并上几个滤波电容。 1.2工作模式 1.3寄存器描述 主要配置几个寄存器就可以,具体配置寄存器的位需参考使用说明书。 1.4指令格式 二、程序 由于只需要通过串口即可对LoRa模块进行配置和发送数据。所以写程序的步骤如下: 第一步: 配置串口相关配置(管脚、初始化、中断) 中断服务函数里写相关应答头要操作的数据; //接收缓冲区容量 #define USART3_RX_BUFF_SIZEMAX 256 #define USART3_TX_BUFF_SIZEMAX 256 //USART设备控制结构体 typedef struct { u32 BaudRate; //波特率 u32 R_Idx; u8 RxBuf[USART3_RX_BUFF_SIZEMAX]; u8 TxBuf[USART3_TX_BUFF_SIZEMAX]; u8 data_length; u8 Get_length; } USART3_STRUCT; /**************************************************************************** * 名 称:void USART3_GPIO_Init(void) * 功 能:串口引脚初始化 * 入口参数:无 * 出口参数:无 * 说 明:无 ****************************************************************************/ void USART3_GPIO_Init(void) //串口引脚初始化 { GPIO_InitTypeDef GPIO_InitStructure; //串口引脚结构 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);//串口引脚分配时钟 //配置串口 Tx (PB.10) 为复用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //串口发送引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //频率2MHz : 115200足够 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化引脚 // 配置串口 Rx (PB.11) 为浮空输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; //串口接收引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入 GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化引脚 } /**************************************************************************** * 名 称:void USART3_Init(void) * 功 能:串口初始化 * 入口参数:无 * 出口参数:无 * 说 明:无 ****************************************************************************/ void USART3_Init(u32 BaudRate) { USART_InitTypeDef UART_InitStructure; //串口结构 RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //串口分配时钟 USART3_Real.BaudRate = BaudRate; //波特率 //串口初始化 UART_InitStructure.USART_BaudRate= USART3_Real.BaudRate;//波特率 UART_InitStructure.USART_WordLength= USART_WordLength_8b;//数据位8bit UART_InitStructure.USART_StopBits= USART_StopBits_1;//停止位个数 UART_InitStructure.USART_Parity = USART_Parity_No ; //不进行奇偶效验 UART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; //RTS和CTS使能(None不使用) UART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//发送和接收使能 USART_Init(USART3, &UART_InitStructure); //初始化串口 } /**************************************************************************** * 名 称:void USART3_NVIC_Init(void) * 功 能:串口中断向量表初始化 * 入口参数:无 * 出口参数:无 * 说 明:无 ****************************************************************************/ void USART3_NVIC_Init(void) { NVIC_InitTypeDef NVIC_InitStructure; //中断控制器变量 NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;//设置中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//主优先级设置 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //设置优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //打开串口中断 NVIC_Init(&NVIC_InitStructure); //初始化中断向量表 } /**************************************************************************** * 名 称:void USART3_Config(void) * 功 能:串口设置 * 入口参数:无 * 出口参数:无 * 说 明:默认为包数据接收 ****************************************************************************/ void USART3_Config(void) { USART3_Init(9600); //串口初始化 USART3_GPIO_Init(); //串口引脚初始化 USART3_NVIC_Init(); //中断初始化 USART_ClearITPendingBit(USART3, USART_IT_RXNE); //清接收标志 USART_ITConfig(USART3, USART_IT_RXNE, ENABLE); //开启接收中断 USART_Cmd(USART3, ENABLE); //使能串口外设 } /**************************************************************************** * 名 称:void USART3_SendString(u8* Data, u32 Len) * 功 能:多字符输出 * 入口参数:Data 输出的单字符数据 Len 字符个数 * 出口参数:无 * 说 明:无 ****************************************************************************/ void USART3_SendString(u8* Data, u32 Len) { u32 i=0; for(i=0; i USART_SendData(USART3, Data); while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET); } memset(&USART3_Real.TxBuf, 0, USART3_TX_BUFF_SIZEMAX); } 第二步: 写lora读写函数、模式设置函数、初始化函数(管脚配置); lora配置指令格式 发送:C0 起始地址(就是设置参数开始的地址) 设置参数长度(就是寄存器地址的个数) 然后从起始地址开始,设置相应的寄存器参数 /**************************************************************************** * 名 称:void Lora_init() * 功 能:初始化与LORA模块相连的引脚 * 入口参数:无 * 出口参数:无 * 说 明:无 ****************************************************************************/ void Lora_init() { //串口引脚分配时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //配置PC0,PC1为输出模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; //M0,M1引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输出模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //频率2MHz GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化引脚 GPIO_SetBits(GPIOC,GPIO_Pin_1); GPIO_SetBits(GPIOC,GPIO_Pin_0); //配置PC3为输入模式 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; //AUX引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //输入模式 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //频率2MHz GPIO_Init(GPIOC, &GPIO_InitStructure); //初始化引脚 } /**************************************************************************** * 名 称:void Lora_Write_REG(u8 Begin_Addr, u8 length, u8 ADDH, u8 ADDL, u8 NETID, u8 REG0, u8 REG1, u8 REG2, u8 REG3) * 功 能:LORA模块写多个寄存器 * 入口参数: * Begin_Addr:开始地址; length:要写的数据长度 * ADDH:高地址;ADDL:低地址;NETID:网络地址; * REG0, REG1, REG2, REG3:寄存器 * 出口参数:无 * 说 明:无 ****************************************************************************/ void Lora_Write_REG(u8 Begin_Addr, u8 length, u8 ADDH, u8 ADDL, u8 NETID, u8 REG0, u8 REG1, u8 REG2, u8 REG3) { USART3_Real.TxBuf[0] = 0xC0; //设置数据头 USART3_Real.TxBuf[1] = Begin_Addr; USART3_Real.TxBuf[2] = length; USART3_Real.TxBuf[3] = ADDH; USART3_Real.TxBuf[4] = ADDL; USART3_Real.TxBuf[5] = NETID; USART3_Real.TxBuf[6] = REG0; //配置串口速率,校验位、无线空中速率 USART3_Real.TxBuf[7] = REG1; //配置分包长度与发射功率 USART3_Real.TxBuf[8] = REG2; //信道控制 USART3_Real.TxBuf[9] = REG3; //配置传输方式等 USART3_SendString(USART3_Real.TxBuf, length+3); // Length指的是length后面参数的总长,所以要加上前面的参数头 } /**************************************************************************** * 名 称:void Lora_Read_REG(u8 Begin_Addr, u8 length) * 功 能:读LORA模块的寄存器 * 入口参数: * Begin_Addr:开始地址; length:要写的数据长度 * 出口参数:无 * 说 明:无 ****************************************************************************/ void Lora_Read_REG(u8 Begin_Addr, u8 length) { USART3_Real.TxBuf[0] = 0xC1; USART3_Real.TxBuf[1] = Begin_Addr; USART3_Real.TxBuf[2] = length; USART3_SendString(USART3_Real.TxBuf, 3); } /**************************************************************************** * 名 称:void Lora_Mode(u8 mode) * 功 能:配置LORA模块的工作模式 * 入口参数: * mode:模式 * 出口参数:无 * 说 明:无 ****************************************************************************/ void Lora_Mode(u8 mode) { OS_ERR err; switch(mode) { case 0x00: //传输模式 GPIO_ResetBits(GPIOC,GPIO_Pin_1); GPIO_ResetBits(GPIOC,GPIO_Pin_0); break; case 0x01://WOR模式 GPIO_ResetBits(GPIOC,GPIO_Pin_1); GPIO_SetBits(GPIOC,GPIO_Pin_0); break; case 0x02://配置模式 GPIO_SetBits(GPIOC,GPIO_Pin_1); GPIO_ResetBits(GPIOC,GPIO_Pin_0); break; case 0x03:深度休眠模式 GPIO_SetBits(GPIOC,GPIO_Pin_1); GPIO_SetBits(GPIOC,GPIO_Pin_0); break; } //等待AUX脚变为低电平(说明模式切换完成) while(GPIO_ReadInputBits(GPIOC,GPIO_Pin_3) == 0) Delay_ms(7); } 第三步: 进行工作参数设置 包括,两个模块地址,发送数据包大小、波特率、功率大小等,参照相关寄存器设置。; 模式之间切换要延时,厂商的技术人员推荐至少要2s,亲测1s也可以。 Lora_write(0x00, 0x07, 0x00, 0x01, 0x00, 0x66, 0x00,0x00, 0x40); 两个LORA模块,信道一定要一样,然后各自发数据和收数据,只要配置串口中断即可。 |
|
|
|
只有小组成员才能发言,加入小组>>
3320 浏览 9 评论
3000 浏览 16 评论
3496 浏览 1 评论
9069 浏览 16 评论
4089 浏览 18 评论
1190浏览 3评论
612浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
602浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2339浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1899浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 06:57 , Processed in 1.213785 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号