SX1281驱动学习笔记二:驱动学习
Posted 无痕幽雨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SX1281驱动学习笔记二:驱动学习相关的知识,希望对你有一定的参考价值。
目录
通过上一篇博客: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驱动学习笔记二:驱动学习的主要内容,如果未能解决你的问题,请参考以下文章