请选择 进入手机版 | 继续访问电脑版
查看: 41284|回复: 12

[资料发布] LoRa芯片 SX127x 参考例程汇总贴

[复制链接]

67

主题

100

帖子

570

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
570
发表于 2018-9-29 16:38:43 | 显示全部楼层 |阅读模式

本贴主要提供了基于LoRa系列中的SX127x平台的SPI应用参考例程,开发者可根据实际使用的产品型号或芯片及所需功能选择对应的例程进行开发,由于不同的的模组型号的支持的频段不同,模组的封装部分,开发者需要根据具体型号规格书中的频段说明对例程进行修改。

1.

LoRa调制通信例程,包含TX、RX两个工程文件。工作流程如下:TX:A模块发送数据给B模块后,总包计数加1,等待B模块回传数据,收到正确的回传数据包后,正确包数加1,循环操作;RX:B模块收到A模块发送的数据后,接收包计数加1 ,并将数据回传给A模块。通过TX端的(正确包数/总包数)统计通信成功率;用户可根据实际所需通信内容进行修改。


2.

FSK调制通信例程,包含TX、RX两个工程文件。工作流程如下:TX:A模块发送数据给B模块后,总包计数加1,等待B模块回传数据,收到正确的回传数据包后,正确包数加1,循环操作;RX:B模块收到A模块发送的数据后,接收包计数加1 ,并将数据回传给A模块。通过TX端的(正确包数/总包数)统计通信成功率;用户可根据实际所需通信内容进行修改。


3.

      CAD通信例程,包含TX、RX两个工程文件。工作流程如下:TX:A模块发送唤醒数据给B模块后,总包计数加1,等待B模块被唤醒并回传数据,收到正确的回传数据包后,正确包数加1,循环操作;RX:B模块收到A模块的唤醒数据包,接收包计数加1 ,并将数据回传给A模块。通过TX端的(正确包数/总包数)统计唤醒成功率,通过测量B模块的电流评估CAD状态下的功耗;用户可根据实际所需通信内容进行修改。

4 .

SX127x应用例程代码说明及通信Demo板原理图。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

7

主题

13

帖子

39

积分

助理工程师

Rank: 1

积分
39
发表于 2020-9-2 13:50:17 | 显示全部楼层
请问有keil版本的例程吗
回复

使用道具 举报

67

主题

100

帖子

570

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
570
 楼主| 发表于 2020-9-4 17:53:51 | 显示全部楼层
13771758546 发表于 2020-9-2 13:50
请问有keil版本的例程吗

您好,上面的附件就是Keil5版本的历程,您可以下下来看一下
回复

使用道具 举报

0

主题

1

帖子

2

积分

助理工程师

Rank: 1

积分
2
发表于 2021-1-20 11:26:22 | 显示全部楼层
感谢,这个是可以直接对接LSD的模块吗
回复

使用道具 举报

74

主题

169

帖子

573

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
573
发表于 2021-1-20 15:46:51 | 显示全部楼层
一世长安 发表于 2021-1-20 11:26
感谢,这个是可以直接对接LSD的模块吗

不知道您这边要对接什么模块?型号是哪个?
回复

使用道具 举报

0

主题

3

帖子

7

积分

助理工程师

Rank: 1

积分
7
发表于 2021-1-28 14:38:49 | 显示全部楼层
RF_001 发表于 2021-1-20 15:46
不知道您这边要对接什么模块?型号是哪个?

我这边用的17N30的型号,我参照例程验证点对点传输时,发现数据有偏移;
例如发送端发送的是A1-AA十个字节,接收端收到的起始不是A1,而是A3-AA+A1-A2这样的顺序,我想请教一下这个可能是什么原因导致的
回复

使用道具 举报

74

主题

169

帖子

573

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
573
发表于 2021-1-29 09:02:06 | 显示全部楼层
17761234165 发表于 2021-1-28 14:38
我这边用的17N30的型号,我参照例程验证点对点传输时,发现数据有偏移;
例如发送端发送的是A1-AA十个字 ...

好的,这个首先请确认一下,发送的数据是不是真的是A1-AA顺序,其次,请检查一下收包函数的内容是否正确,可以采用我司提供例程中的函数。
因为单纯的Lora通信,一般不会出现数据顺序错误这种现象,可能性更大的是发送、接收函数处理有问题。
回复

使用道具 举报

0

主题

3

帖子

7

积分

助理工程师

Rank: 1

积分
7
发表于 2021-1-29 09:09:51 | 显示全部楼层
RF_001 发表于 2021-1-29 09:02
好的,这个首先请确认一下,发送的数据是不是真的是A1-AA顺序,其次,请检查一下收包函数的内容是否正确 ...

就是使用的例程里面的函数,驱动层没有修改,只有主函数的使用逻辑我简化了一下,一个板子只发,一个板子只收。
回复

使用道具 举报

0

主题

3

帖子

7

积分

助理工程师

Rank: 1

积分
7
发表于 2021-1-29 09:30:18 | 显示全部楼层
RF_001 发表于 2021-1-29 09:02
好的,这个首先请确认一下,发送的数据是不是真的是A1-AA顺序,其次,请检查一下收包函数的内容是否正确 ...

我把测试代码发出来,您帮我看一下有问题没,可以吗?

发送端:

        while(1)
        {
                SX127X_Write(REG_LR_IRQFLAGS, 0xff); //clear flags
                SX127X_TxPacket(TXbuffer);
                communication_states        = TX_ING;
               
               
                while (communication_states == TX_ING)
                {
                        LED0=!LED0;
                        delay_ms(100);
                }

        }
}


void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(DIO0_GetState() == GPIO_PIN_SET)
    {
        uint8_t flag;
        SX127X_Read(REG_LR_IRQFLAGS, &flag);
        SX127X_Write(REG_LR_IRQFLAGS, 0xff); //clear flags
        if(flag & RFLR_IRQFLAGS_TXDONE)
        {
            communication_states = TX_DONE;
        }
        else if(flag & RFLR_IRQFLAGS_RXDONE)
        {
            communication_states = RX_DONE;
        }
        else
        {
            DIO0_EnableInterrupt();
           // SX127X_StartRx();
        }
    }
}


接收端:

                communication_states        = TX_ING;
       
        while(1)
        {
                SX127X_Write(REG_LR_IRQFLAGS, 0xff); //clear flags
               
               
                while (communication_states == TX_ING)
                {
                        LED0=0;
                }
                SX127X_RxPacket(RXbuffer);
                communication_states        = TX_ING;
                LED0=!LED0;
                delay_ms(100);
        }
}


void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
    if(DIO0_GetState() == GPIO_PIN_SET)
    {
        uint8_t flag;
        SX127X_Read(REG_LR_IRQFLAGS, &flag);
        SX127X_Write(REG_LR_IRQFLAGS, 0xff); //clear flags
        if(flag & RFLR_IRQFLAGS_TXDONE)
        {
            communication_states = TX_DONE;
        }
        else if(flag & RFLR_IRQFLAGS_RXDONE)
        {
            communication_states = RX_DONE;
        }
        else
        {
            DIO0_EnableInterrupt();
            SX127X_StartRx();
        }
    }
}

回复

使用道具 举报

67

主题

100

帖子

570

积分

利尔达员工

Rank: 9Rank: 9Rank: 9

积分
570
 楼主| 发表于 2021-2-3 09:55:23 | 显示全部楼层
17761234165 发表于 2021-1-29 09:30
我把测试代码发出来,您帮我看一下有问题没,可以吗?

发送端:

    你好!你发出的代码中无法看出会有导致你上述问题的情况。
    以下思路看看是否可以帮助你解决问题:    一、SX1278 存储FIFO机制
        FIFO是有256字节的数据缓冲区,地址从0x00到0XFF,接收和发送是共用的;一般默认(像我们的例程中),处理方式是,0x00~0x7F是作为接收的数据存储,0x80~0XFF是作为发射数据存储;当发射时,先将FIFO数据缓冲区中的SPI接口地址指针指到0x80,再将需要发射的数据写入FIFO,这时存储的数据就从0x80开始存储了,再启动发射;当接收时,先将FIFO数据缓冲区中的SPI接口地址指针指到0x00,再启动接收,这时接收到的数据就从0x00开始存储了,读数据的时候只要从0x00开始读取就是接收到的数据了;
        可以分别参考SX127X_StartRx、SX127X_TxPacket函数中:
            SX127X_Write( REG_LR_FIFOADDRPTR, 0x00);//RX FIFO数据缓冲区中的SPI接口地址指针指到0x00
            SX127X_Write( REG_LR_FIFOADDRPTR, 0x80);//TX FIFO数据缓冲区中的SPI接口地址指针指到0x80

二、问题分析
         现在是发送A1~AA变成了 A3~AA,A2,A3,这个只能分别分析下FIFO操作是否有问题;
       1、检查下发射FIFO是否正确;可以在SX127X_TxPacke函数中写完FIFO后,在重新指针回到0x80,重新读一下FIFO,对比下数据是否和写进去的一致;
       2、检查下接收FIFO存储地址是否有问题;一个是接收之前起始指针地址是否设置到0x00,读数据时是否从0x00地址开始读取;



如果还是没有进展,建议线下联系到我们的相关负责人,我们会有工程师支持,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表