单片机学习小组
直播中

fdvcxhtg

8年用户 995经验值
擅长:嵌入式技术
私信 关注

怎样通过串口对E22-230T22S LoRa模块进行配置和发送数据呢

E22-230T22S是什么?

E22-230T22S LoRa无线模块有何特性?
怎样通过串口对E22-230T22S LoRa模块进行配置和发送数据呢?

回帖(1)

蒲泛粟

2022-2-21 09:28:43
一、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 举报

更多回帖

×
20
完善资料,
赚取积分