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

SX1281驱动学习笔记二:驱动学习目录 一 电源选择 二 接收模式选择 三 速率配置 四 设置前道 CRC 报文格式等 五 设置频点 接收发送地址 发送功率 六 DIO 配置 七 收发控制逻辑 八 SPI 时序和 BUSY 通过上一篇博客 SX1281 驱动学习笔记一 Lora 驱动移植 无痕幽雨的博客 CSDN 博客

大家好,我是讯享网,很高兴认识大家。

目录

一、电源选择

二、接收模式选择

三、速率配置

四、设置前道、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时序和配置

 

 

 

 

 

小讯
上一篇 2025-02-27 08:24
下一篇 2025-02-17 13:32

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/54349.html