一、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模块,信道一定要一样,然后各自发数据和收数据,只要配置串口中断即可。
一、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模块,信道一定要一样,然后各自发数据和收数据,只要配置串口中断即可。
1
举报