当前文档版本为 v1.0.0,您可以访问当前页面的 开发中 版本以获取最近可能的更新。

Sub-1G 开发指南

1 概述

本文档将介绍Sub-1G模块的相关内容,以供开发者参阅。

Sub-1G支持半双工无线通信,工作频段为 370~590 MHz,740~1180MHz。最高具有-140dBm 的灵敏度,22dBm 的最大输出功率。

2 配置

  • 通信频率

    频率设置范围为370~590 MHz,740~1180MHz。收发两端需要配置相同的频率。

  • 扩频因子(SF)

    SF因子的设置范围为7-12。数值越大传输速度越慢,传输距离越远。收发两端需要配置相同的SF参数。

  • 信道带宽(BW)

    带宽支持62.5KHz、125KHz、250KHz、500KHz。带宽越小,传输速度越慢,传输距离越远。收发两端需要配置相同的BW参数。

  • 编码率(CR)

    码率支持4/5,4/6,4/7,4/8。码率越小,传输速度越慢,传输距离越远。收发两端需要配置相同的CR参数。

  • 低速率模式

    低速率模式提供了更低速率的传输,0.08~20.4Kbps。会使得传输距离上更远一些。初始化时将ldr_en置1即可使能。

  • 前导码符号数量(Preamble)

    取值范围 8—65535,默认值为 8。在实现空中唤醒应用场景时可以将前导码符号数量增大,同时发射时间也会增大,从而实现接收端在低功耗模式下被长的前导码唤醒的功能。

  • 同步字(syncword)

    同步字用于设备的通信识别,只有设置了相同同步字的设备才能进行通信。

  • 功率

    发射功率表(433MHz)如下:

    功率配置值

    实际发射功率(dbm)

    发射电流(mA)

    0

    -23.50

    11

    1

    -18.00

    13

    2

    -11.00

    15

    3

    -8.00

    16

    4

    -7.00

    17

    5

    -6.00

    18

    6

    -4.00

    20

    7

    -2.00

    23

    8

    0

    25

    9

    0.60

    29

    10

    1.10

    30

    11

    4.60

    34

    12

    7.10

    38

    13

    9.00

    42

    14

    10.00

    46

    15

    11.70

    50

    16

    12.70

    53

    17

    13.70

    57

    18

    14.40

    60

    19

    15.10

    64

    20

    16.10

    69

    21

    17.00

    74

    22

    17.60

    79

    23

    18.60

    87

    24

    19.70

    100

    25

    21.00

    113

    26

    22.00

    135

    27

    22.00

    136

    28

    22.00

    137

    29

    22.00

    138

    30

    22.00

    139

    发射电流仅为Sub-1G模块的电流,不包含MCU及其他部分的电流

3 通信模式

3.1 发射模式

  • 单包发送:TX完成后会退出TX,下一次TX需要重新调用TX函数

  • 连续发送:设置完连续TX模式后,可以一直调用写数据函数进行TX,不需要每次都调用TX函数

    一般我们推荐使用单包发送的模式进行。

3.2 接收模式

  • 无超时单包接收:打开接收后,不会超时退出,一直等到接收到一包数据为止,接收完成后退出RX模式。

  • 有超时单包接收:打开接收后,如果设置时间内没有收到数据,将超时退出RX模式,并上报超时中断。

  • 连续接收模式:连续接收模式没有超时设置,RX启动后会一直等到数据,然后上报RX中断。之后自动再次进入RX。

3.3 接收提前中断功能

Sub-1G模块在RX模式下提供了一种提前中断的功能。提前中断功能需要设置确定从第几个字节开始计数,以及检查多少个字节的数据(目前仅支持8字节或者16字节两种),也就是要求发送端至少需要发送超过8字节的数据,此功能才会有效。

当接收到指定大小的数据后,芯片就会产生中断,此时我们读取接收到的数据,如果判断是我们预期的数据,可以继续让芯片接收,如果不是我们预期的数据则可以直接让芯片退出接收。在一些特定的场景下,此功能对于系统的执行效率是有帮助的。

4 低功耗

Sub-1G模块提供了两种休眠模式,一种是sleep,另一种是deepsleep

  • Sleep:调用sub_oneg_pm_ctrl函数控制进入sleep模式,或者从sleep模式唤醒

  • Deepsleep:调用sub_oneg_pm_ctrl函数控制进入或退出deepsleep模式。但是需要注意的是,从deepsleep模式下醒来之后,需要重新初始化,收发模式也需要重新选择。

5 DCDC功能

DCDC 功能开启后,可以使芯片的接收电流降低至 12.5mA,默认该功能关闭。

开启 DCDC 功能后,当芯片需要休眠时,需要提前手动关闭 DCDC 功能。

6 CAD功能

CAD功能可以检测空中是否有Sub-1G信号。MCU可以在一段时间内检测CAD-IRQ(GPIO11)是否被拉高来判断是否有信号。在初始化中将cad_en置1,就会开启CAD检测功能。CAD功能仅在接收模式有效。

开启CAD功能将会修改芯片的接收阈值,所以我们在使用完成CAD功能之后应该调用关闭函数,关闭CAD功能。

7 智能搜索功能

Sub-1G模块可实现在接收模式下智能化的识别信道中的SF参数,达到接收不同SF信号的目的。

使用此功能需要在TX端将配置结构体intelligent_search_en设置为1即可。RX端需要将配置结构体intelligent_search_en设置为1后,调用sub_oneg_intelligent_search函数设置搜索范围,目前版本的芯片只支持搜索 SF7~11,暂不支持 SF12 智能搜索。但是不建议全部开启,因为全部开启后会出现丢包现象。一般开启范围不超过3个。需要关闭智能搜索时将配置结构体intelligent_search_en设置为0,再次调用sub_oneg_intelligent_search函数。

开启智能搜索功能,会修改RF的接收阈值,所以在不使用搜索功能的时候建议关闭此功能。

7 Sub-1G驱动API

  • sub_oneg_configure函数实现了Sub-1G模块的初始化。

/**
 * @brief Configure the sub-1G module.
 *
 * @param cfg Pointer to the sub-1G config struct.
 *
 * @retval 0 If successful.
 * @retval -errno Negative errno code on failure.
 */
int sub_oneg_configure(sub_oneg_cfg *cfg);
  • sub_oneg_intelligent_search函数实现了智能搜索的开关以及配置搜索范围。

    设置范围可以选择以下一个宏或者多个宏的或值。

#define SUB_ONEG_SF_SEARCH_7          (1 << 0)
#define SUB_ONEG_SF_SEARCH_8          (1 << 1)
#define SUB_ONEG_SF_SEARCH_9          (1 << 2)
#define SUB_ONEG_SF_SEARCH_10         (1 << 3)
#define SUB_ONEG_SF_SEARCH_11         (1 << 4)

/**
 * @brief Control intelligent search.
 *
 * @param cfg        Pointer to the sub-1G config struct.
 * @param sf_range   SF range of search.
 *
 * @retval 0 If successful.
 * @retval -errno Negative errno code on failure.
 */
int sub_oneg_intelligent_search(sub_oneg_cfg *cfg, uint8_t sf_range);
  • sub_oneg_cad_off函数实现了关闭CAD功能

/**
 * @brief Disable CAD function
 *
 */
void sub_oneg_cad_off(void);
  • sub_oneg_receive_start函数实现了开启接收。

/**
 * @brief Start receive mode.
 *
 * @param cfg      Pointer to the sub-1G config struct.
 * @param mode     Set continue rx mode or single rx mode.
 *					CONTINUE_RX_MODE: After the rx is finished,
 *						it will not exit the rx mode and will remain in the rx mode.
 *					SINGLE_RX_MODE: When rx is finished, it exits rx mode
 * @param timeout  Set rx timeout(ms), 0 indicates no timeout until data is received.
 *
 * @retval 0 If successful.
 * @retval -errno Negative errno code on failure.
 */
int sub_oneg_receive_start(sub_oneg_cfg *cfg, sub_oneg_rx_mode_t mode, uint32_t timeout);
  • sub_oneg_receive_stop函数实现了停止接收。

/**
 * @brief Exit receive mode.
 *
 * @param cfg     Pointer to the sub-1G config struct.
 */
void sub_oneg_receive_stop(sub_oneg_cfg *cfg);
  • sub_oneg_send函数实现了发送数据。

/**
 * @brief Start send mode.
 *
 * @param cfg      Pointer to the sub-1G config struct.
 * @param buffer   Send data buffer.
 * @param length   Send data length.
 * @return int     The time it takes to send.
 */
int sub_oneg_send(sub_oneg_cfg *cfg, uint8_t *buffer, size_t length);
  • sub_oneg_pm_ctrl函数实现了低功耗的控制。

/**
 * @brief Power management control.
 *
 * @param pm       Power management mode.
 *                   DEEPSLEEP_TO_STANDBY3: from deepsleep to run mode.
 *                   SLEEP_TO_STANDBY3: from sleep to run mode.
 *                   STANDBY3_TO_DEEPSLEEP: from run mode to deepsleep.
 *                   STANDBY3_TO_SLEEP: from run mode to sleep.
 * @retval 0 If successful.
 * @retval -errno Negative errno code on failure.
 */
int sub_oneg_pm_ctrl(sub_oneg_pm_ctrl_t pm);
  • sub_oneg_plhd_switch函数实现了提前中断功能的开关,其中参数start_address表示开始的位置,可以从0开始也就是数据的头部开始,也可以从数据的中间位置,例如2,3,4等位置开始。on_off参数0表示disable,1表示enable。

/**
 * @brief The phld function was enabled.
 *
 * @param start_address     Match the number of start bytes.
 * @param length            Matches the length of bytes. You can just choose 8 or 16 bytes.
 *								SUB_ONEG_PLHD_LEN8      8 bytes
 *								SUB_ONEG_PLHD_LEN16     16 bytes
 * @param on_off            Enable or disable this function.
 */
void sub_oneg_plhd_switch(uint8_t start_address, uint8_t length, uint8_t on_off);
  • sub_oneg_dcdc_switch函数实现了控制dcdc的开关。

/**
 * @brief The dcdc mode was enabled.
 *
 * @param on_off            1-enable    0-disable.
 */
void sub_oneg_dcdc_switch(uint8_t on_off);
  • sub_oneg_irq_cb 函数是中断的回调函数,用户需要实现该回调函数以便处理中断事件。具体的事件类型以及使用方式可以参考Sub-1G的例程。

/**
 * @brief Sub-1G event callback function. Application need implementation.
 *
 * @param irq_type  event type.
 * @param rx_msg  Point to the rx message struct. Only if the rx event is valid.
 *
 */
typedef void (*sub_oneg_irq_cb)(uint8_t irq_type, rx_message_t *rx_msg);