SX1281驱动学习笔记二:驱动学习

Posted 无痕幽雨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SX1281驱动学习笔记二:驱动学习相关的知识,希望对你有一定的参考价值。

目录

一、电源选择

二、接收模式选择

三、速率配置

四、设置前道、CRC、报文格式等

五、设置频点、接收发送地址、发送功率

六、DIO配置

七、收发控制逻辑

八、SPI时序和BUSY


通过上一篇博客:SX1281驱动学习笔记一:Lora驱动移植_无痕幽雨的博客-CSDN博客,能够实现简单的收和发了,下面继续学习。

一、电源选择

SX128X内部集成了电源,有DC/DC和LDO。

 

1、如果想使用DC/DC,则在12和14引脚连接15uH电感;

2、使用DC/DC比LDO效率高,省电。

3、控制函数为:

/*!
 * \\brief Declares the power regulation used to power the device
 *
 * This command allows the user to specify if DC-DC or LDO is used for power regulation.
 * Using only LDO implies that the Rx or Tx current is doubled
 */
typedef enum

    USE_LDO                               = 0x00,           //! Use LDO (default value)
    USE_DCDC                              = 0x01,           //! Use DCDC
RadioRegulatorModes_t;


Radio.SetRegulatorMode( USE_DCDC );

二、接收模式选择

接收增益默认是使能自动增益控制,也可配置为手动增益控制,我个人感觉自动增益控制就好。

接收模式有低功耗模式和高灵敏度模式:

1、 默认是接收低功耗模式;

2、低功耗模式比高灵敏模式节省700uA电流;

3、使能高灵敏度模式:

chReadRegister = Radio.ReadRegister(0x0891)

Radio.WriteRegister(0x0891,chReadRegister | 0xC0);

三、速率配置

速率配置有扩频因子、带宽、纠错编码决定。

1、扩频因子:

typedef enum

    LORA_SF5                                = 0x50,
    LORA_SF6                                = 0x60,
    LORA_SF7                                = 0x70,
    LORA_SF8                                = 0x80,
    LORA_SF9                                = 0x90,
    LORA_SF10                               = 0xA0,
    LORA_SF11                               = 0xB0,
    LORA_SF12                               = 0xC0,
RadioLoRaSpreadingFactors_t;

 

 初始化增加:

        switch(modulationParams.Params.LoRa.SpreadingFactor)
            case LORA_SF5:
            case LORA_SF6:
                Radio.WriteRegister(0x0925,0x1E);
                break;
            case LORA_SF7:
            case LORA_SF8:
                Radio.WriteRegister(0x0925,0x37);
                break;
            case LORA_SF9:
            case LORA_SF10:
            case LORA_SF11:
            case LORA_SF12:
                Radio.WriteRegister(0x0925,0x32);
                break;
        
        Radio.WriteRegister(0x093C,0x01);

2、带宽

 3、纠错编码

其中画红框为长交织算法。

4、操作

    modulationParams.PacketType = PACKET_TYPE_LORA;
    modulationParams.Params.LoRa.SpreadingFactor = LORA_SF8;
    modulationParams.Params.LoRa.Bandwidth = LORA_BW_0800;
    modulationParams.Params.LoRa.CodingRate = LORA_CR_4_5;

    Radio.SetPacketType( modulationParams.PacketType );
    Radio.SetModulationParams( &modulationParams );

四、设置前道、CRC、报文格式等

    packetParams.PacketType = PACKET_TYPE_LORA;
    packetParams.Params.LoRa.PreambleLength = 6;
    packetParams.Params.LoRa.HeaderType = LORA_PACKET_VARIABLE_LENGTH;
    packetParams.Params.LoRa.PayloadLength = BUFFER_SIZE;
    packetParams.Params.LoRa.CrcMode = LORA_CRC_ON;
    packetParams.Params.LoRa.InvertIQ = LORA_IQ_NORMAL;

    Radio.SetPacketParams( &packetParams );

五、设置频点、接收发送地址、发送功率

    Radio.SetRfFrequency( RF_FREQUENCY );
    Radio.SetBufferBaseAddresses( 0x00, 0x00 );
    Radio.SetTxParams( TX_OUTPUT_POWER, RADIO_RAMP_02_US );

六、DIO配置

有三个DIO(DIO1~DIO3),有16个IRQ。

 

 

 1、SX1281有11个中断源

/*!
 * \\brief Represents the interruption masks available for the radio
 *
 * \\remark Note that not all these interruptions are available for all packet types
 */
typedef enum

    IRQ_RADIO_NONE                          = 0x0000,
    IRQ_TX_DONE                             = 0x0001,
    IRQ_RX_DONE                             = 0x0002,
    IRQ_SYNCWORD_VALID                      = 0x0004,
    IRQ_SYNCWORD_ERROR                      = 0x0008,
    IRQ_HEADER_VALID                        = 0x0010,
    IRQ_HEADER_ERROR                        = 0x0020,
    IRQ_CRC_ERROR                           = 0x0040,
    IRQ_CAD_DONE                            = 0x1000,
    IRQ_CAD_ACTIVITY_DETECTED               = 0x2000,
    IRQ_RX_TX_TIMEOUT                       = 0x4000,
    IRQ_PREAMBLE_DETECTED                   = 0x8000,
    IRQ_RADIO_ALL                           = 0xFFFF,
RadioIrqMasks_t;

2、任意的中断源都可以映射到三个DIO中的任意一个。

    /*!
     * \\brief   Sets the IRQ mask and DIO masks
     *
     * \\param [in]  irqMask       General IRQ mask
     * \\param [in]  dio1Mask      DIO1 mask
     * \\param [in]  dio2Mask      DIO2 mask
     * \\param [in]  dio3Mask      DIO3 mask
     */
    void ( *SetDioIrqParams )( uint16_t irqMask, uint16_t dio1Mask, uint16_t dio2Mask, uint16_t dio3Mask );

对应位为1就是打开,对应位0,则屏蔽。

把RX接收完成映射到DIO1,TX接收完成映射到DIO2,接收超时和发送超时映射到DIO3,代码如下:

Radio.SetDioIrqParams( IRQ_RX_DONE | IRQ_TX_DONE | IRQ_RX_TX_TIMEOUT | IRQ_RX_TX_TIMEOUT, IRQ_RX_DONE, IRQ_TX_DONE, IRQ_RX_TX_TIMEOUT | IRQ_RX_TX_TIMEOUT );

默认:平时低电平,事件来了,高电平,清除标志位后,变低;也支持单平反转。

3、清除标志位:可以全清,也可以只清除某一位或几位,Radio.ClearIrqStatus(IRQ_RX_DONE);

4、读取标志位:Radio.GetIrqStatus()

七、收发控制逻辑

1、通过标位置操作

程序通过Radio.GetIrqStatus()读取标志位,然后根据标志位进行逻辑判定:是否接收到数据,是否发送完成,是否超时等等;这种方案不能操作RF太快,要间隔一段时间再查询,否则容易死机。

2、通过DIO查询

把RX接收完成映射到DIO1,TX接收完成映射到DIO2,接收超时和发送超时映射到DIO3,然后查询IO口是否置位来判定芯片状态;这种模式在程序规模不大可以使用,实时性很高。

3、开始DIO中断

同样把RX接收完成映射到DIO1,TX接收完成映射到DIO2,接收超时和发送超时映射到DIO3,同时开启MCU对应IO口中断,在中断函数里面进行操作;这种模式在程序规模比较大,或着低功耗操作下使用,实时性高,又能降低MCU功耗。

八、SPI时序和BUSY

 通过这个描述,我原来认为BUSY在1的时候是忙,那么逻辑就应该是:NSS拉低,然后查询BUSY,但是测试发现,NSS拉低后,BUSY一直为高电平,看到手册有如下说明:

 翻一下:

就是说BUSY在芯片处理事务或者接收命令时候置位。也就是说,应该先查询BUSY,为底,则拉低NSS,在NSS下降沿217ns后,BUSY至高,表示现在正准备接收命令。 

下面看下SPI时序和配置

 

 

 

 

 

以上是关于SX1281驱动学习笔记二:驱动学习的主要内容,如果未能解决你的问题,请参考以下文章

SX1281驱动学习笔记一:Lora驱动移植

SX1281驱动学习笔记一:Lora驱动移植

Lora1278驱动V4.4.2讲解二:驱动多个SX1278芯片

学习笔记 | 机器学习 决策树

学习笔记 | 机器学习 决策树

SpringCloud Stream消息驱动设计思想以及整合rabbitmq消息队列案例--学习笔记