基本结构

引脚定义

SX1280是一个工作在2.4GHz(ISM频段)的半双工收发器。芯片引脚定义如下:

Pin Number 引脚名称 I/O类型 功能
0 GND - -
1 VR_PA - 功放的稳压供电
2 VDD_IN I 设备稳压供电,连接到Pin12
3 NRESET I 复位信号,低电平有效,内部上拉为50kΩ
4 XTA - 参考振荡器或温补晶振输入
5 GND - -
6 XTB - 参考振荡器
7 BUSY O 忙信号
8 DIO1 I/O 数字IO
9 DIO2 I/O 数字IO
10 DIO3 I/O 数字IO
11 VBAT_IO I 数字IO供电(1.8V至3.7V)
12 DCC_FB O 片内稳压输出
13 GND - -
14 DCC_SW O DCDC开关电源输出
15 VBAT I RFIC的供电(1.8V至3.7V)
16 MISO_TX O SPI slave output_UART TX
17 MOSI_RX I SPI slave input_UART RX
18 SCK_RTSN I SPI 时钟_ UART请求发送(Request to Send)
19 NSS_CTSN I SPI 从机选择_UART 允许发发送(Clear to Send)
20 GND - -
21 GND - -
22 RFIO I/O 射频发射/接收 IO
23 GND - -
24 GND - -

image-20240120041210550

SX1280的一些关键的参数

  • 供电:1.8~3.7V
  • 工作温度:-40~85 摄氏度
  • RF天线功率 :最小输出-18dBm 最大输入12.5dBm
  • 数字IO: 最大输入/输出电流 2.5mA

硬件模块结构

image-20240124162852697

通过SPI或UART,发送对应的opcode+data的形式来控制这个模块。模块大致分为5个部分,模拟前端用于调制和发射频带信号,绿色的是数字调制部分,可产生不同调制的信号。Data Buffer用于存放接收的和待发送的数据。和 Protocol Engine用于硬件实现一些通信协议。

在供电方面,SX1280有两个独立的供电模组:DC-DC和LDO,默认情况下,仅开启LDO做为供电,但DCDC电源可在FS,RX,TX模式下启用,来承载更高的功耗。如果要想启用DCDC电源,则需要在12和14引脚之间接一个15uH的电感并将DCDC和LDO并联做为VDD。在DCDC被并入供电时,可在待机模式时切换启用和关闭DCDC供电。

SX1280的几种工作模式

image-20240120013631945

image-20240208021648925

STDBY(待机)模式

该模式有两种时钟源,分别是13M的RC振荡器和外部晶振XOSC,可以用命令 $SetStandby(oscillatorMode)$ 来进行切换。当选用XOSC作为时钟源时,自动切换为DCDC模块供电。也可使用如下命令手动设置供电:

1
SetRegulatorType(regulatorType); //该指令仅可在STDBY_RC模式使用

Frequency Synthesis (FS 频率合成)模式

在FS模式下,模拟部分的PLL会按照设置的Tx开始震荡,当震荡稳定时,BUSY引脚就会变成低电平(标明设备已准备好接受指令)

在SX1280的设计中,RX和TX的频率是不同的,RX的频率等于Tx的频率(i.e., 锁相环产生的频率)减去中间频率(Intermediate Frequency IF),IF默认是1.3MHz。

Receice(接收)模式

在接收模式下除了FS模式启用的PLL外,片上LNA,相干器,和对应的解调器(LoRa/FSK/FLRC)都会开始工作。接受模式可设置为连续接收(continuous mode)和单次接收(single mode)。在连续接收模式下,模块会保持接收模式。在单次接收模式下,模块会在一次接收完成后返回STDBY模式。

接收模式通过官方驱动的SetRx函数来设置,其输入参数periodBase是指的时钟振荡周期,periodBaseCount是指的历经多少次时钟震荡算超时。当超时时,会从Receive mode 返回至 STDBY_RC mode。

1
SetRx(periodBase, periodBaseCount); //Opcode 0x83

Transmit(发送)模式

发送模式会在信号放大器(PA)启动完成后,发送待发送的数据包。在发送完成后自动返回STDBY_RC模式

Sleep(睡眠)模式

睡眠模式下,只有睡眠控制器模块和可选的64KHz RC时钟工作。睡眠模式仅能从STDBY_RC模式下进入。

唤醒的方式有:

  • NSS(Pin 19)变成低电平
  • RTC定时器产生计时结束事件

SX1280在上电时,会自动校准其RC时钟,PLL和ADC,在校准期间BUSY信号会保持高电平,在校准完成后会进入STDBY_RC模式,并使BUSY信号变为低电平以表示准备好接收指令。

上电校准的结果会有寄存器存储,因此在休眠模式被唤醒时无需再次校准。

串口通信

Sx1280使用串口发送opcode的形式来控制模块,串口可使用UART或SPI,二者发送命令和支持的功能(如校验、流控)有些许差异。详细介绍如下。

使用UART和模块建立连接

  • 波特率:该模块支持的波特率有921.6K,460.6K,115.2K,57.6K,38.4K,19.2K,9.6K。 在上电时,默认以115200工作,通过配置寄存器更改其他波特率
  • 停止位:模块支持1或2个停止位,通过寄存器配置,上电默认一个停止位
  • 仅支持8byte数据
  • 模块支持奇偶校验、无校验
  • 模块支持在Rx满,Tx空,奇偶校验错误或无停止位时,产生中断

使用UART和模块通信时,主机必须提供长度信息,模块一旦接受到所需长度的信息,就会开始处理任务,命令格式通常为:opcode+后续长度+后续参数

举个例子,在UART执行写寄存器的操作时,必须发送操作码+要写的首地址+数据的长度+数据+….+数据n。如下图所示

image-20240209004243157

在使用UART进行读寄存器时,发送完操作码+要读的首地址+数据的长度后,主机RX线便会收到从机的数据内容。如下图

image-20240209004849480

在使用UART指令时,模块一收到opcode就会将busy线拉高,然后在接收后续长度指定的命令个数后,将BUSY线重新拉低进行命令处理。

使用SPI和模块建立连接

  • NSS引脚变成低电平使能,高电平失能
  • MOSI 由主机在 SCK 下降沿时产生,并由从机在 SCK 上升沿时采样。 MISO 由 SCK 下降沿的从机产生。
  • 通信时钟SCK最高频率为18MHz

使用SPI和模块通信时,无需提供命令长度,以NSS信号线被拉高来结束一次通信即可,即,命令格式为:opcode+后续参数

举个例子,在SPI执行写寄存器时,只需发送操作码+要写的首地址+数据+…+数据n,相较于UART无需发送数据长度。由NSS信号被拉高来标明当前写操作结束。

image-20240209004451160

在使用SPI执行读寄存器时,要发送操作码+要读的首地址+NOP(0x00),MISO线才开始传输数据。也就是说,UART内数据长度的位置需要用一个NOP来顶替,以此达到一个延时等待响应的目的。如下图

image-20240209004819079

硬件

Data Buffer

片上Data Buffer有256Byte,用于存放待发送数据或接收数据,其如何分配是可编程的。可使用官方提供的接口来指定TX和RX所用buffer的基地址。除睡眠模式外,任何工作模式均可访问该buffer。

image-20240208020605152

接收数据对Data Buffer的写入

接收数据时,数据由 rxBaseAddress (也就是图中蓝色区域,SetBufferBaseAddress()指向的地方)开始写入,向上生长。然后由 RxDataPointer 指向数据顶部地址。在一开始时,RxDataPointer = rxBaseAddress 。

发送数据读取Data Buffer的方式

在切换到传输模式时,会先由setPacketParam() 中的 payLoadLength 参数指明待发送的数据长度,然后由数据指针 TxDataPointer 初始化为 TxBaseAddress 的地址,发送一个字节自增1,直到发送的字节等于payLoadLength为止。

模拟信号收发前端

接收

  • 自动增益控制(Automatic Gain Control AGC)

    用于确保接收机增益被设定成最佳的值来接收信号。可以通过以下寄存器配置:

    image-20240120010721928

人工配置增益时,寄存器数值于增益对应关系如下:

image-20240120010828585

  • 低功耗模式和高感模式

收模式分为低功耗模式和高灵敏度模式,通过配置寄存器0x891的bit6:7来控制。设置为3(11)的时候,为灵敏度模式,设置为0(00)的时候为低功耗模式

片上RC震荡器

片上RC振荡器有64KHz和13MHz两个频率,64KHz的用于休眠模式时钟,13MHz用于SPI或UART通信

RC振荡器需要在上电或环境温度发生变化时进行校准。校准使用:

1
2
3
4
5
6
7
8
9
//首先配置需要校准的,选项如下:
calibParam.ADCBulkPEnable = 1;
calibParam.ADCBulkNEnable = 1;
calibParam.ADCPulseEnable = 1;
calibParam.PLLEnable = 1;
calibParam.RC13MEnable = 1;
calibParam.RC64KEnable = 1;
//然后调用函数校准
Radio.Calibrate(calibParam); //opcode 0x89

指令操作码(OPcode)

在以下笔记中,所有NOP表示数据0x00,指令顺序中用+连接的是通过不同数据帧发送的不同byte,比如0x01+0x02是先发送0x01再发送0x02

寄存器相关

操作 操作码 SPI模式指令顺序 UART模式指令顺序
写寄存器数据 0x18 操作码+地址[15:8]+地址[7:0]+数据…+数据n 操作码+地址[15:8]+地址[7:0]+长度+数据…+数据n
读寄存器数据 0x19 操作码+地址[15:8]+地址[7:0]+NOP 操作码+地址[15:8]+地址[7:0]+长度

数据缓冲区(Buffer)相关

操作 操作码 SPI模式指令顺序 UART模式指令顺序
写Buffer数据 0x1A 操作码+地址偏移+数据…+数据n 操作码+地址偏移+长度+数据…+数据n
读Buffer数据 0x1B 操作码+地址偏移+NOP 操作码+地址偏移+长度

模式切换相关

睡眠模式

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetSleep 0x84 操作码+睡眠配置 操作码+睡眠配置

其中睡眠配置为1byte,但只有低二位有用,其余bit保持0。例如0x01,0x03等:

  • 第0位:如果该位被置1,那么在RAM中的部分数据会被存放进非易失存储器(称为 retention mode)。否则RAM数据被刷新。RAM主要用于存放模块初始化设置,被备份的数据如下:
    • SetPacketType()
    • SetModulationParams()
    • SetRfFrequency()
    • SetDioIrqParams()
    • SetCadParams()
  • 第1位:如果该为被置1,那么Data buffer中的数据会被存放进非易失存储器。否则Data Buffer内数据被刷新。

待机模式

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetStandby 0x80 操作码+待机配置 操作码+0x01+待机配置

其中待机配置为1byte,但只有LSB有用,其余bit保持0,也就是只有0x00和0x01两种:

  • 0x00:STDBY_RC模式,使用13MHz RC振荡器做为时钟源
  • 0x01:STDBY_XOSC模式,使用外部晶振做为时钟源

频率合成模式(FS mode)

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetFs 0xC1 操作码 操作码

发送模式

操作 操作码
SetTx 0x83
SPI模式指令顺序 UART模式指令顺序
操作码+periodBase+periodBaseCount[15:8]+periodBaseCount[7:0] 操作码+0x03(后续长度)+periodBase+periodBaseCount[15:8]+periodBaseCount[7:0]

note:在设置为发送模式前,需要先清除IRQ status

Single Mode Tx: 如果periodBase和PeriodBaseCount都设置为0x00,即,传输指令0x83+0x00+0x00(SPI模式下),那么模块将工作在单次发模式(Single Mode Tx)。在该模式下,不会有超时限制,会在发送一个包之后结束Tx模式。

发送模式的流程: 1. 打开PLL 2. 打开PA(功率放大器) 3. PA根据SetTxParam函数设置的模式,进行上升 4. 待PA上升完成,数据开始分包传输 5.传输完成后,关闭PA,关闭PLL,收发器返回STDBY_RC模式,并产生中断“IRQ TxDone” 6.若传输超时,则中断传输,返回STDBY_RC模式,并产生中断“TIMEOUT IRQ”。

periodBase参数: 这个参数影响RTC时钟一步的计时时长,表如下

periodBase Time-Out step
0x00 15.625us
0x01 62.5us
0x02 1ms
0x03 4ms

PeriodBaseCount参数:该参数有16位,用于指明在计数多少个周期后超时。计算公式如下:

如果该为被设置为0x00,那么直到单个包发送完成之前,都不会退出Tx模式,无超时限制。当单个包发送完之后返回STDBY_RC模式。

接收模式

操作 操作码
SetRx 0x82
SPI模式指令顺序 UART模式指令顺序
操作码+periodBase+periodBaseCount[15:8]+periodBaseCount[7:0] 操作码+0x03(后续长度)+periodBase+PeriodBaseCount[15:8]+PeriodBaseCount[7:0]

note:在设置为发送模式前,需要先清除IRQ status

接收模式的参数意义同发送模式,但它可以设置单次接收模式,连续接收模式,超时模式三种,表如下:

periodBaseCount 超时时间
0x0000 单次接收模式,没有超时时间,但在完成一个包的接收之后返回STDBY_RC模式
0xFFFF 连续接收模式,设备一直保持接收模式,直到主机发送改变模式的命令。每次接收到数据包时,都会向主机发送已接收新的数据包的指示。
其他 超时时间=超时基周期*超时计数数量

举个例子,保持一秒接收模式:0x82+0x03+0x00+0xFA

特殊模式

嗅探模式

操作 操作码
SetRxDutyCycle 0x94
SPI模式指令顺序 UART模式指令顺序
操作码+periodBase+periodBaseCount[15:8]+periodBaseCount[7:0]+
sleepPeriodBaseCount[15:8]+sleepPeriodBaseCount[7:0]
操作码后面+0x05(后续长度)

在嗅探模式(sniff mode)下,模块会周期性地寻找新的包。在此模式下,用于preamble必须被设置为long preamble mode。因此使用这个指令之前必须使用SetLongPreamble设置preamble模式。

该模式下periodBase同Tx模式中的表。

periodBaseCount:该位用于指明模块唤醒,查询新包的时间

sleepPeriodBaseCount:用于指明模块休眠的时间

  1. 模块会进入接收模式,寻找新的包,寻找的时间由periodBaseCount决定。
  2. 如果接收模式的窗口期内没有嗅探到preamble,模块会进入睡眠模式(设置会被保存)。睡眠时间由sleepPeriodBaseCount定义。
  3. 在睡眠时间结束后,模块会将设置重新存会RAM,并返回接收模式,重新嗅探包。
  4. 当如下事件发生时,嗅探模式会被停止:
    • 在Rx模式窗口期间,接受到了数据包,在接收完成后会产生”RxDone”中断,并返回STDBY_RC模式
    • 在Rx模式窗口期间,收到了来自主机的SetStandby()命令。注意:在sleep模式下无法接收命令

如果periodBaseCount被设置为0x0000,那么又会进入单次接收模式,没有超时限制,模块会保持接收模式直到收到新的数据包,然后返回STDBY_RC模式。设置为其他数据时,periodBaseCount才能用于指定接收的窗口期长度

信道活动检测模式(Channel Activity Detection CAD)

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetCAD 0xC5 操作码 操作码

该模式仅能在LoRa调制下使用。该模式下,模块会寻找LoRa的信号,寻找的Preamble长度由SetCadParams()操作来设置。在寻找结束后,模块会返回STDBY_RC模式。在寻找结束时,设备会产生“CadDone”中断,如果有效的信号被找到了,还会产生“CadDetected”中断

这个模式在需要先收后发的应用中非常实用

参数设置命令SetCadParams()

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetCadParams 0x88 操作码+cadSymbolNum 操作码+0x01+cadSymbolNum

其中,cadSymbolNum用于指明触发CAD的符号数(变相决定了寻找时长),定义如下

image-20240215160705990

注意:用于CAD的符号数设置为1和2时,错误检测风险较高

基本设置相关

长Preamble模式

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetLongPreamble 0x98 操作码+enable(0x01) -

该指令只能在LoRa模式或GFSK模式使用。这个指令对LoRa的影响是:会修改嗅探模式SetRxDutyCycle的行为,如果有preamble被侦测到,那么RX模式的时间会被拓展为 $sleepPeriod+2*RxPeriod$

自动应答

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetAutoTx 0x98 操作码+time[15:8]+time[7:0] 操作码+0x02+time[15:8]+time[7:0]

部分通信协议要求在收到数据包后发送一个应答包,例如BLE要求在收到数据包后150us发送回应。这个命令就是用来设置自动回应用的。回应延时由time参数控制,由于从RX模式切换到TX模式需要时间,因此需要一个Offset来修正,通常$offset\approx 33us$。延时计算公式如下

time就是输入的time参数,该参数以毫秒为单位。time参数传递0x0001就是1us。

只要这个命令被发送了,那么每当设备进入Rx模式并收到了数据包后,就会自动切入Tx模式,在延时$Tx_{Delay}$后发送一个应答包,然后回到普通模式(例如STDBY_RC模式)。

note:user must issue the command SetAutoTx with 0x00 as the time argument

传输完成后返回FS模式

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetAutoFS 0x9E 操作码+enable(0x01) 操作码+0x01+enable(0x01)

默认情况下,Rx和Tx模式结束后都会返回STDBY_RC模式,如果使用了此命令,那么则是返回至FS模式。这样可以减少切换至Rx或Tx模式的时间。

enbale用于控制该功能是否启用,0x01表示使能,0x00表示失能。

包格式选择

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetPacketType 0x8A 操作码+PacketType 操作码+0x01+PacketType

PacketType参数用于指定调制包格式,定义如下:

image-20240211172403669

例如:选择LoRa包格式,发送指令为0x8A+0x01

设置包参数

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetPacketParams 0x8C 操作码+param1…param7 操作码+0x07+param1…param7

对于7个parameter,其作用如下:

image-20240215162800145

在LoRa模式下,几个参数详细定义如下

PreambleLength(参数1)

改Byte由两部分组成,LORA_PBLE_LEN_MANT[3:0] 和 LORA_PBLE_LEN_EXP[7:4]。mant表示尾数,exp表示指数,MANT占低四位,EXP占高四位,它们各自的范围都在[1,15]之间(注意不可为0)。preamble的长度和这两个参数的关系如下:

推荐的preamble长度是12 symbols,也就是将MANT设置为6,EXP设置为1,即可得到该值。

HeaderType(参数2)

Header用于指明LoRa包中是否包含Header,详见LoRa包格式章节。

宏定义关键词 Header模式
EXPLICIT_HEADER 0x00 EXPLICIT HEADER
IMPLICIT_HEADER 0x80 IMPLICIT HEADER

PayloadLength(参数3)

该参数值的范围在 [1,255] 之间。用于指明载荷数据的长度。

CRC(参数4)

该参数用于控制CRC使能与否

宏定义关键词 CRC使能情况
LORA_CRC_ENABLE 0x20 CRC ENABLE
LORA_CRC_DISABLE 0x00 CRC DISABLE

设置调制参数

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetModulationParams 0x8B 操作码+param[0]+param[1]+param[2] 操作码+0x03+param[0]+param[1]+param[2]

该指令的param参数在不同包格式下有不同意义,此处只介绍LoRa包格式下

  • param[0]:扩展因子SF,值,宏定义和SF间关系如下表
宏定义 SF
LORA_SF_5 0x50 5
LORA_SF_6 0x60 6
LORA_SF_7 0x70 7
LORA_SF_8 0x80 8
LORA_SF_9 0x90 9
LORA_SF_10 0xA0 10
LORA_SF_11 0xB0 11
LORA_SF_12 0xC0 12
  • param[1]:带宽BW,值,宏定义和SF间关系如下表
宏定义 BW (KHz)
LORA_BW_1600 0x0A 1625.0
LORA_BW_800 0x18 812.5
LORA_BW_400 0x26 406.25
LORA_BW_200 0x34 203.125
  • param[2]:前向纠错编码率CR,CR,值,宏定义和SF间关系如下表
    | 宏定义 | 值 | 编码率 |
    | :——————: | :—: | :——: |
    | LORA_CR_4_5 | 0x01 | 4/5 |
    | LORA_CR_4_6 | 0x02 | 4/6 |
    | LORA_CR_4_7 | 0x03 | 4/7 |
    | LORA_CR_4_8 | 0x04 | 4/8 |
    | LORA_CR_Li_4_5 | 0x05 | 4/5 |
    | LORA_CR_Li_4_6 | 0x06 | 4/6
    |
    | LORA_CR_Li_4_7 | 0x07 | 4/8* |

上表中 * 代表长交织。

  • 以上参数详见 LoRa基础

设置RF频率模式频率

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetRfFrequency 0x86 操作码+频率[23:16]+频率[15:8]+频率[7:0] 操作码+0x03+频率[23:16]+频率[15:8]+频率[7:0]

其中,频率(rfFrequency)参数与发射频率间公式如下:

例如:通过SPI发送0x86+0xB8+0x9D+0x89,即可设置rfFrequency=12098953(D),在外部晶振52MHz的情况下,$F_{RF}=2399999832Hz$,即,2.4GHz

设置发送功率

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetTxParams 0x8E 操作码+power+rampTime 操作码+0x02+power+rampTime

power参数用于控制发射功率,SX1280支持的功率范围在-18~13dBm,其与power参数的关系公式如下

也就是说,power参数的范围在[0,31]区间内。

rampTime参数用于控制运放(PA)的上升时间,官方驱动中的宏定义、参数和时间对应表如下:

image-20240215142108205

设置数据缓冲区(buffer)基地址

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetBufferBaseAddress 0x8F 操作码+txBaseAdress+rxBaseAdress 操作码+0x02+txBaseAdress+rxBaseAdress

数据缓冲区rx和tx共享256字节空间,地址从0x00到0xFF之间。详见硬件-Data buffer

选择供电

如果在DC-DC外接电感条件满足的情况下,可以使用该命令切换供电模式。

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetRegulatorMode 0x96 操作码+regModeParam 操作码+0x01+regModeParam

其中regModeParam有:

  • image-20240120040942451

设置UART速率

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetUartSpeed 0x9D 不可用,仅UART能使用 操作码+0x02+UartDividerRatio

其中,UartDibiderRatio是一个4byte数字,它与波特率的关系是:

其典型值如下:

image-20240415151802336

设置测距角色

该命令用于测距的主从角色设置

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetRangingRole 0xA3 操作码+Role 操作码+0x01+Role

其中Role:

  • 0x00:从机(slave)
  • 0x01:主机(master)

是否启用高级测距(AdvancedRanging)

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetAdvancedRanging 0x9A 操作码+Enable 操作码+0x01+Enable

其中,0x00表示disable,0x01表示enable。

获取设备工作状态

获取设备状态

操作 操作码 SPI模式指令顺序 UART模式指令顺序
GetStatus 0xC0 操作码 操作码

该命令用于检索收发器的状态,任意模式(STDBY,RX,TX)都可以执行该命令。模块会在收到该操作码后返回1byte的设备状态码,状态码定义如下:

image-20240216151615876

获取当前包格式

操作 操作码 SPI模式指令顺序 UART模式指令顺序
GetPacketType 0x03 操作码+NOP+NOP 操作码+0x01

模块会在SPI命令的第二个NOP时,向主机发送当前包格式数据。UART通信下,在0x01发送完之后的空隙位返回包格式。

包格式如下

image-20240211172403669

获取Rx缓冲区状态

操作 操作码 SPI模式指令顺序 UART模式指令顺序
GetRxBufferStatus 0x17 操作码+NOP+NOP+NOP 操作码+0x02

该命令会先后返回最后收到的数据包的长度(rxPayloadLength)和Rx缓冲区的基地址(rxStartBufferPointer)。在发送操作码后,SPI命令间隔一个NOP后开始接收,先接收rxPayloadLength,再接收rxStartBufferPointer。UART命令在发送0x02后开始接收。

注意:当采用LoRa包格式,且设置为Implicit Header(Fixed-length)模式的时候,rxPayloadLength参数会始终返回0x00。因为在这个模式中不存在Header,因此无法提取Payload长度。在这种模式下,要得知Payload长度,直接通过寄存器操作命令,读取预先设置的寄存器即可。

获取当前包状态

操作 操作码 SPI模式指令顺序 UART模式指令顺序
GetPacketStatus 0x1D 操作码+NOP+NOP+NOP+NOP+NOP+NOP(6个 NOP) 操作码+0x05

使用此命令可以检索有关上次接收的数据包的信息,命令会在SPI模式的第一个NOP后,UART模式的长度码后,开始返回信息。

image-20240215164517698

信息总共有5位。不同包格式返回的信息意义不同,如下图:

image-20240215164255603

对于LoRa包模式下,参数意义如下

  • rssiSync::Received Signal Strength Indicator,信号强度。一旦检测到同步地址,就会锁存rssiSync值,根据rssiSync可算出真实信号功率:$P=-(rssiSync)/2(dBm)$
  • snrPkt:信噪比,该值由最后一个数据包估计得出。实际SNR和该值换算关系是$SNR=snrPkt/4 (dB)$。如果SNR<=0,那么RSSI值需要修正为:$RSSI_\{packet, real\} = RSSI_\{packet,measured\} – SNR_\{measured\}$

获取当前瞬时 RSSI 值

操作 操作码 SPI模式指令顺序 UART模式指令顺序
Getressiinst 0x1F 操作码+NOP+NOP 操作码+0x01

该指令会在SPI模式第二个NOP,UART指令发送完0x01后,返回参数rssiInst参数(8位),用于指明当前包的RSSI强度,参数值与强度对应关系如下:

中断

SX1280有16个中断源,每一个都可以单独启用或是屏蔽,每一个也都可以被映射至DIO1,DIO2,DIO3。中断寄存器和中断源如下表:

image-20240215170132747

设置DIO和中断映射、中断使能

操作 操作码
SetDioIrqParams 0x8D

SPI指令顺序:

image-20240215170643786

UART指令顺序

image-20240215170703777

irqMask参数

​ 该参数用于使能中断,1表示使能,0表示失能。参考上方中断寄存器和中断源表,其左边的bit对应的就是该参数。例如,要使能TxDone中断,就需要把irqMask的bit0设置为1,此时,产生中断时,IRQ Register中对应的 TxDone 才会被置1。

dioMask参数

​ 该参数用于标明链接哪些中断到DIO引脚上。例如,如果想要TxDone中断产生时,DIO1引脚也被置1,就需要置位irqMask bit0 来使能中断,然后置位dio1Mask bit0 来链接该中断至DIO1。任意中断都可被映射至所有DIO,对于某一个DIO,当映射至该脚位的所有中断标志都为0的时候,IO输出0,否则输出1(或运算的逻辑)。

获取中断状态

操作 操作码 SPI模式指令顺序 UART模式指令顺序
GetIrqStatus 0x15 操作码+NOP+NOP+NOP 操作码+0x02

该指令会在SPI模式第二个NOP,UART指令发送完0x02后,先后返回irqStatus[15:8]和irqStatus[7:0]。这是16位IRQ寄存器中的值的状态,对应本小节中最开始的寄存器表。

清除中断标志

操作 操作码 SPI模式指令顺序 UART模式指令顺序
ClearIrqStatus 0x97 操作码+IRQMASK[15:8]+IRQMASK[7:0] 操作码+0x02+IRQMASK[15:8]+IRQMASK[7:0]

将需要清除的中断在对应的IRQMASK位中置1,即可清除中断。例如,如果IRQMASK的位0置1,则IRQ寄存器中的位0处的IRQ标志清0。

测试命令

发送连续波

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetTxContinuousWave 0xD1 操作码 操作码

该命令会使模块以设置的频率和功率发送连续的波。直到主机发送切换模式的命令之前,设备都会保持在发送连续波的模式中。这个命令对除了FLRC之外的所有包格式都适用。

发送连续Preamble

操作 操作码 SPI模式指令顺序 UART模式指令顺序
SetTxContinuousPreamble 0xD2 操作码 操作码

在GFSK包格式下,这个命令会使得天线发送交变的”0”和“1”。在LoRa模式下,这个命令会发送“0” (也就是LoRa的Preamble)。在主机发送更改模式的命令之前都会保持发送。

驱动LoRa的步骤

初始化设备

  1. SX1280在上电复位时,会默认进入STDBY_RC模式,如果不处于该模式,必须使用 SetStandby 附加 0x00 参数,使其切换至STDBY_RC模式;UART指令为0x80+0x01+0x00;
  2. 使用 SetPacketType附加LoRa包格式的参数(0x01),选择为LoRa数据包格式;UART指令顺序为0x8A+0x01+0x01;
  3. 设置RF的频率,通常设置为2.4G即可,其他值可参照操作码中 SetRfFrequency 章节;UART指令为:0x86+0x03+0xB8+0x9D+0x89,SPI下命令组合为:0x86+0xB8+0x9D+0x89
  4. 通过 SetBufferBaseAddress 指定数据buffer内rx和tx的基地址通过 SetModulationParams 设置LoRa的SF,BW 和 CR
  5. 通过 SetPacketParams 选择LoRa需要使用的Preamble长度(推荐12个符号),Header类型,数据长度,CRC类型,是否反转IQ
  6. 通过 SetTxParam 设置发信输出功率和ramp time
  7. 通过 SetDioIrqParams 使能和映射相应中断

发送信息

  1. 通过 WriteBuffer(offset, *数据) (官方驱动API) 将数据写入 Data Buffer,offset 的值通常设为 txBaseAddress 即可
  2. 通过 SetTx发送数据,直到 TxDone 或是 RxTxTimeout 中断产生,代表发送结束
  3. 清除中断

接收消息

  1. 通过 SetRx 将设备置于接收模式,等待 RxDone 或 RxTxTimeout
  2. 通过 ClrIrqStatus 清除中断
  3. 通过 GetRxBufferStatus 取得 PayloadLengthRx 和 rxStartBufferPointer
  4. 使用 ReadBuffer(offset, PayloadLengthRx) 来读取接受的buffer数据,其中offset = rxStartBufferPointer

测距

基础设置

在测距中,LoRa模块通过地址码来寻找测距对象。因此测距从机需要设置一个自己的地址码。通过WriteRegister函数(操作码0x18),对以下地址进行写入,来设置做为从机的地址。

image-20240415142233755

同时,从机通过设置0x931寄存器的7:6位来选择使能的地址长度

image-20240415144759048

同时,在LoRa通信包和测距-测距引擎一节中,提到需要对RX和TX消耗的时间进行补偿,以及对特定SF,BW,RF下的延迟进行补偿。这个补偿写入在下列寄存器内

image-20240415145736387

驱动步骤

  1. 首先确保设备在STDBY_RC模式

  2. 使用SetPacketType,将模块包格式设置为PACKET_TYPE_RANGING(0x02)

  3. 使用SetModulationParams讲主机与从机设置在同样的SF、BW和CR下。注意:测距不允许使用SF11和SF12,且带宽只能是406.25KHz / 812.5KHz / 1625KHz

  4. 在如下寄存器地址中写入要测距的从机的地址
    image-20240415144842613

  5. 主机使能中断:RangingMasterRestltValidRangingMasterResultTimeout

  6. 从机使能中断:RangingSlaveResponseDoneRangingSlaveRequestDiscarded

  7. 调用SetRangingRole,分别配置主机和从机的测距角色

  8. 从机使用SetRx切换直接收模式,主机使用SetTx发送测距包

  9. 测距的调制解调器会自动设置主从机在收发过程中Tx和Rx的切换

  10. 测距结果仅能从主机读取,当主机生成IRQ RangingMasterResultValid时,在下列寄存器中读出结果

    image-20240415153404796

  11. 最后一次测距的RSSI结果存储在0x964寄存器内,8位寄存器。换算dBm步骤参见opcode一章中瞬时 RSSI 值小节。

结果滤波

SX1280模块提供一个基于RSSI过滤器,它会筛选掉RSSI小于阈值的测距结果,并将剩余结果取平均值输出。

  1. 首先需要选择使用多少个测距结果做为样本。这需要配置寄存器 Ranging Filter Window Size (0x91E),该寄存器有8位,值限制位8-255,分别对应选择8-255个样本。
  2. 设置样本阈值,小于该阈值的样本将被丢弃。这需要配置寄存器RangingFilterRssiThresholdOffset(0x953)。该寄存器内默认值为0x24。
  3. 剩余的结果将求平均值后写入结果寄存器

该滤波器可以在任何时候进行重置,通过将寄存器Reset Ranging Filter(0x923)写1即可。

结果解算

在读取结果寄存器时,需要配置RangingResMUX(0x924)寄存器的(5:4)bit,来选择寄存器输出原始结果还是RSSI滤波后结果。

  • 00:原始结果
  • 01:滤波结果

此2bit复位值是0x3,也就是读取之前必须写入一次,使之成为上面两个参数二选一。

读出的值可由如下公式换算成m

读取代码如下:

1
2
3
4
5
6
7
8
9
10
11
#define FREEZE_RANGING_RESULT 0x97F
#define RANGING_RESULT_MUX 0x0924
#define RANGING_RESULT_23_16 0x961
#define RANGING_RESULT_15_8 0x962
#define RANGING_RESULT_7_0 0x963
SetStandby(STDBY_XOSC);//第一步:切换为外部时钟
WriteRegister(0x97F,ReadRegister(0x97F)|(1<<1);//使能LoRa存储模块时钟,通过对0x97F第二位写1。
WriteRegister(0x0924,(ReadRegister(0x0924)&0xCF|((resultType)&0x03)<<4));//将0x0924内的值与1100,1111与。
//相当于将bit5 bit4设置为00,再将resultType变量内定义的值填入。设置读取的值类型。
valLsb=((ReadRegister(0x0961)<<16)|(ReadRegister(0x0962)<<8|(ReadRegister(0x0963)));//读取Ranging Result
SetStandby(STDBY_RC);

LoRa通信包和测距

在使用LoRa通信时,扩频因子(SF)和带宽(BW)必须在链路的发送侧和接收侧预已知,因为不同的扩频因子彼此正交

使用LoRa调制解调时,灵敏度和速率如下:

image-20240120042818216

image-20240120042827446

LoRa 通信包格式

LoRa调制有两种包格式,无论是哪种格式,preamble都是必须的。preamble用于接受信号的时钟同步,其基础长度为4.25个symbol (LoRa自动添加),冗余长度可在[8, 61444.25] 个符号编程。因此preamble的符号长度为[12.25, 61444.25]范围内。在LoRa基础一章中,已经介绍LoRa的包长度为$2^{SF}$,也就是下面两图的总symbol数是$2^{SF}$个。

两种格式如下:

  • Explicit Header Mode(default)

    image-20240123175952581

    Explicit格式如图所示,相比于Implicit Header Mode,它多一个8个symbol长的header,其包含三部分:

    • 有效码字(payload) 长度
    • 前向纠错码编码率
    • 16bit-CRC是否使能
  • Implicit Header Mode

    image-20240123175412975

如果有效码字(payload)长度、前向纠错编码率、CRC使能状态已知,则可以省去header。此时有效码字(payload)长度、前向纠错编码率、CRC使能状态必须在通信链路双方进行手动预配置。

LoRa测距包格式

image-20240124010130578

测距的包格式如上,其包含一个指定的测距Header,包含了测距指令+测距ID+2bit的CRC。Rangging symbols内包含测距同步信息和时钟同步信息。LoRa规定测距时SF的范围是[5, 10],带宽BW范围是[400KHz, 1.6MHz].

主机视角测距过程如下:

image-20240124010545561

从机视角测距过程如下:

image-20240124010621166

测距引擎

测距误差的来源

  • 主、从设备的时钟频率不一致

  • 数字和模拟调制模块对信号产生了延迟,这种延迟需要手动补偿

  • 多径效应

针对以上误差,官方建议以交换主从设备,测好几遍来进行补偿。一个测两遍的补偿例子如下:

官方给出了交换测距次数和测距误差的关系图( SF9 1600 kHz 条件下)

image-20240124020804572

距离分辨率

LoRa的最小距离分辨率由如下公式计算得到:

其中c是光速,BW是设置的带宽(与SF有关)

2倍测量距离(也就是飞行时间换算出的距离)和$D_{LSB}$可以由如下公式转换:

RxTx造成DELAY的补偿

在初始测试时,需要在一段已知距离为D的空间内进行测距,来确定距离补偿误差。补偿误差可由如下公式计算:

补偿时间可由如下公式进一步算得:

SEMTECH公司给出了一部分已知的Delay补偿值:

image-20240124014924763

在LoRa中,TxRx延迟的补偿是自动的,补偿值(Calibration)必须被写入RxTxDelay寄存器

时钟误差产生的测距误差的补偿

LoRa在收发信号时,有一个频率误差指示器,由于射频信号的频率是参考各自的晶振频率产生的,因此可以使用LoRa频率误差指示器(FEI)对主设备和从设备之间的频率误差进行简单的频率误差测量,以准确评估定时误差和等效距离误差。其中官方给出的距离误差如下:

image-20240124015930104

官方给出的BW和SF对测距精度的影响如下:

image-20240124020345728

官方宣称在视线内,它具有和激光测距同等的精度。下图红色表示激光测距仪的误差范围。

image-20240124020611211

测距参数设计准则

LoRa测距,SF和BW会影响广播时间(直接影响功耗)和测距距离,其关系图如下:

image-20240124021355928

可以看到SF影响测距距离,BW影响广播时间。当这俩个参数都最大时,测距可有最高精度。

超短距离(<18.5m)的补偿

在小于18.5m时,LoRa测距会非常不精确,STMTECH给出了以下补偿公式:

补偿效果图如下:

image-20240124021812831

测距的计算:

image-20240124022454968

image-20240124022730601

一个例子:配置测距参数如下,得到如下测距结果: