我是靠谱客的博主 坚强大米,最近开发中收集的这篇文章主要介绍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<Len; i++)
    {
        USART_SendData(USART3, Data[i]);
        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模块,信道一定要一样,然后各自发数据和收数据,只要配置串口中断即可。

最后

以上就是坚强大米为你收集整理的LORA相关使用配置的全部内容,希望文章能够帮你解决LORA相关使用配置所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(82)

评论列表共有 0 条评论

立即
投稿
返回
顶部