pan_rf.h 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068
  1. /**
  2. * @file pan_rf.h
  3. * @brief PAN3029/PAN3060 driver implementation
  4. * @version V1.0.1
  5. * @date 2025-08-18
  6. * @copyright Panchip Microelectronics Co., Ltd. All rights reserved.
  7. * @code
  8. * ____ ____ _ _
  9. * | _ \ __ _ _ __ / ___| |__ (_)_ __
  10. * | |_) / _` | '_ \| | | '_ \| | '_ \
  11. * | __/ (_| | | | | |___| | | | | |_) |
  12. * |_| \__,_|_| |_|\____|_| |_|_| .__/
  13. * |_|
  14. * (C)2009-2025 PanChip
  15. * @endcode
  16. * @author PanChip
  17. * @addtogroup ChirpIOT
  18. * @{
  19. * @defgroup PAN3029/3060 Radio Driver API
  20. * @{
  21. */
  22. #ifndef __PAN_RF_H__
  23. #define __PAN_RF_H__
  24. #include <stdint.h>
  25. #include <math.h>
  26. #include "myRadio_gpio.h"
  27. /** TODO: 根据您的硬件做调整:
  28. * @note 当使用4线SPI时,本SDK使用硬件SPI接口进行数据传输。
  29. * - SPI_CS引脚配置为普通GPIO功能,模式为推挽输出
  30. * - SPI_SCK引脚配置为SPI功能,模式为推挽输出
  31. * - SPI_MOSI引脚配置为SPI功能,模式为推挽输出
  32. * - SPI_MISO引脚配置为SPI功能,模式为输入
  33. * @note 当使用3线SPI时,本SDK使用软件SPI接口进行数据传输。
  34. * - SPI_CS引脚配置普通GPIO功能,为推挽输出
  35. * - SPI_SCK引脚配置为普通GPIO功能,推挽输出
  36. * - SPI_MOSI引脚配置为普通GPIO功能,推挽输出或输入模式,
  37. * 低功耗模式下须配置为输入带上拉电阻
  38. */
  39. #define SPI_CS_HIGH() BOARD_SPI_NSS_H() /* 将SPI_CS引脚拉高 */
  40. #define SPI_CS_LOW() BOARD_SPI_NSS_L() /* 将SPI_CS引脚拉低 */
  41. #if INTERFACE_MODE == USE_SPI_3LINE /* 使用3线SPI */
  42. #define SPI_SCK_HIGH() //BOARD_SPI_SCK_H() /* 将SPI_SCK引脚拉高 */
  43. #define SPI_SCK_LOW() //BOARD_SPI_SCK_L() /* 将SPI_SCK引脚拉低 */
  44. #define SPI_MOSI_HIGH() //BOARD_SPI_MOSI_H() /* 将SPI_MOSI引脚拉高 */
  45. #define SPI_MOSI_LOW() //BOARD_SPI_MOSI_L() /* 将SPI_MOSI引脚拉低 */
  46. #define SPI_MOSI_STATUS() //PORT_GetBit(SPI_MOSI_PORT, SPI_MOSI_PIN) /* 检测SPI_MOSI引脚状态 */
  47. #define SPI_MOSI_OUTPUT() //BSP_SetGpioMode(SPI_MOSI_PORT, SPI_MOSI_PIN, Pin_Mode_Out) /* 设置SPI_MOSI引脚为输出模式 */
  48. #define SPI_MOSI_INPUT() //BSP_SetGpioMode(SPI_MOSI_PORT, SPI_MOSI_PIN, Pin_Mode_In) /* 设置SPI_MOSI引脚为输入模式 */
  49. #endif
  50. /**TODO: 根据您的硬件做调整:
  51. * @brief 定义PAN3029/3060中断引脚电平读取宏
  52. * @note 该宏用于读取PAN3029/3060的中断引脚电平状态,高电平表示中断触发,低电平表示中断未触发
  53. */
  54. #define CHECK_RF_IRQ() READ_RF_PAN3029_IRQ()
  55. /**TODO: 根据您的硬件做调整:
  56. * @brief 定义PAN3029/3060 CAD引脚电平读取宏
  57. * @note 该宏用于读取PAN3029/3060的CAD引脚电平状态,高电平表示信道忙,低电平表示信道空闲
  58. * @note 不使用CAD功能时,此宏可以不适配,保持PAN3029/3060的CAD(GPIO11)引脚上拉或者悬空即可
  59. */
  60. #define CHECK_RF_CAD() READ_RF_PAN3029_IO11()
  61. /**TODO: 根据您的硬件做调整:
  62. * @brief 定义PAN3029/3060复位引脚宏
  63. * @note RF_RESET_PIN_LOW()用于将复位引脚设置为低电平,复位芯片
  64. * @note RF_RESET_PIN_High()用于释放复位控制信号
  65. * @note 不用硬件复位时,此宏可以不适配,保持PAN3029/3060的复位引脚上拉或者悬空即可
  66. */
  67. #define RF_RESET_PIN_LOW() RF_PAN3029_NRST_L() /* 设置复位引脚为低电平 */
  68. #define RF_RESET_PIN_High() RF_PAN3029_NRST_H() /* 设置复位引脚为高电平 */
  69. /**TODO: 根据您的硬件做调整:
  70. * @brief PAN3029/3060 GPIO引脚定义
  71. */
  72. #define MODULE_GPIO_TX 0 /* PAN3029/3060 天线发射控制引脚,高电平时表示打开发射天线,低电平表示关闭发射天线 */
  73. #define MODULE_GPIO_RX 10 /* PAN3029/3060 天线接收控制引脚,高电平时表示打开接收天线,低电平表示关闭接收天线 */
  74. #define MODULE_GPIO_TCXO 3 /* PAN3029/3060 TCXO控制引脚,用于打开或关闭TCXO电源 */
  75. #define MODULE_GPIO_CAD_IRQ 11 /* PAN3029/3060 CAD中断引脚,检测CAD信号时输出高电平,否则输出低电平 */
  76. /**
  77. * @brief PAN3029/3060的频段定义
  78. */
  79. #define REGION_CN470_510 0x00 /* 中国470-510MHz频段 */
  80. #define REGION_EU_863_870 0x01 /* 欧洲863-870MHz频段 */
  81. #define REGION_US_902_928 0x02 /* 美国902-928MHz频段 */
  82. #define REGION_DEFAULT REGION_CN470_510 /* 默认频段为中国470-510MHz频段 */
  83. /**
  84. * @brief 定义PAN3029/3060的默认参数,用户根据需要修改这些RF参数
  85. */
  86. #define RF_FREQ_DEFAULT 433000000 /* 默认频率配置 */
  87. #define RF_SF_DEFAULT RF_SF9 /* 默认扩频因子配置 */
  88. #define RF_BW_DEFAULT RF_BW_125K /* 默认带宽配置 */
  89. #define RF_CR_DEFAULT RF_CR_4_5 /* 默认信道编码率配置 */
  90. #define RF_CRC_DEFAULT RF_CRC_ON /* 默认CRC校验配置 */
  91. #define RF_LDR_DEFAULT RF_LDR_OFF /* 默认低速率优化配置 */
  92. #define RF_PREAMBLE_DEFAULT 8 /* 默认前导码长度配置 */
  93. #define RF_IQ_INVERT_DEFAULT FALSE /* 默认IQ调制配置 */
  94. /**
  95. * @brief PAN3029/3060的外接晶振和复位引脚配置
  96. */
  97. #define USE_ACTIVE_CRYSTAL 0 /* 是否使用外部有源晶振(0:不使用, 1: 使用) */
  98. #define USE_RF_RST_GPIO 0 /* 是否使用MCU引脚控制RF复位功能(0:不使用, 1: 使用) */
  99. /**
  100. * @brief PAN3029/3060的寄存器回读确认功能开关
  101. * @note 该功能用于在写入寄存器后,通过读取寄存器值来确认写入是否成功
  102. */
  103. #define USE_RF_REG_CHECK 0 /* 是否使用寄存器回读确认功能(0:不使用, 1: 使用) */
  104. #if USE_RF_REG_CHECK
  105. #define RF_ASSERT(fn) \
  106. do \
  107. { \
  108. if (RF_OK != fn) \
  109. { \
  110. return RF_FAIL; \
  111. } \
  112. } while (0);
  113. #else
  114. #define RF_ASSERT(fn) fn
  115. #endif
  116. /**
  117. * @brief PAN3029/3060 中断标志位定义
  118. */
  119. #define RF_IRQ_TX_DONE 0x01 /* 发送完成中断标志 */
  120. #define RF_IRQ_RX_TIMEOUT 0x02 /* 单次接收超时中断标志 */
  121. #define RF_IRQ_CRC_ERR 0x04 /* CRC错误中断标志 */
  122. #define RF_IRQ_RX_DONE 0x08 /* 接收完成中断标志 */
  123. #define RF_IRQ_MAPM_DONE 0x40 /* MAPM中断标志 */
  124. /**
  125. * @brief PAN3029/3060 调制模式定义
  126. */
  127. #define MODEM_MODE_NORMAL 0x00 /* 普通调制模式 */
  128. #define MODEM_MODE_MULTI_SECTOR 0x01 /* 多段调制模式 */
  129. /**
  130. * @brief PAN3029/3060同步字定义
  131. * @note PAN3029/3060的同步字为单字节,范围为0x00-0xFF
  132. */
  133. #define RF_MAC_PRIVATE_SYNCWORD 0x12 /* 私有网络同步字,默认值使用0x12 */
  134. #define RF_MAC_PUBLIC_SYNCWORD 0x34 /* 公有网络同步字 */
  135. /**
  136. * @brief PAN3029/3060 功率档位定义
  137. */
  138. #define RF_MIN_RAMP 1 /* 最小功率档位 */
  139. #define RF_MAX_RAMP 22 /* 最大功率档位 */
  140. #ifndef TRUE
  141. #define TRUE 1
  142. #endif
  143. #ifndef FALSE
  144. #define FALSE 0
  145. #endif
  146. /**
  147. * @brief RF相关操作的返回值定义
  148. * - RF_OK: 操作成功
  149. * - RF_FAIL: 操作失败
  150. */
  151. typedef enum
  152. {
  153. RF_OK, //!< Operate ok
  154. RF_FAIL, //!< Operate fail
  155. } RF_Err_t;
  156. /**
  157. * @brief PAN3029/3060的工作状态定义
  158. */
  159. typedef enum
  160. {
  161. RF_STATE_DEEPSLEEP = 0x00, //!< The radio is in deep sleep mode
  162. RF_STATE_SLEEP = 0x01, //!< The radio is in sleep mode
  163. RF_STATE_STB1 = 0x02, //!< The radio is in standby mode 1
  164. RF_STATE_STB2 = 0x03, //!< The radio is in standby mode 2
  165. RF_STATE_STB3 = 0x04, //!< The radio is in standby mode 3
  166. RF_STATE_TX = 0x05, //!< The radio is in transmit mode
  167. RF_STATE_RX = 0x06, //!< The radio is in receive mode
  168. } RfOpState_t;
  169. /**
  170. * @brief PAN3029/3060的GPIO模式定义
  171. * - GPIO_MODE_INPUT: GPIO输入模式
  172. * - GPIO_MODE_OUTPUT: GPIO输出模式
  173. */
  174. typedef enum
  175. {
  176. RF_GPIO_MODE_INPUT = 0x00, //!< GPIO input mode
  177. RF_GPIO_MODE_OUTPUT = 0x01,//!< GPIO output mode
  178. } RfGpioMode_t;
  179. /**
  180. * @brief PAN3029/3060的发射模式定义
  181. * - RF_TX_MODE_SINGLE: 单次发送模式,大多数情况下使用此模式
  182. * - RF_TX_MODE_CONTINOUS: 连续发送模式,常用于载波信号发射
  183. */
  184. typedef enum
  185. {
  186. RF_TX_MODE_SINGLE = 0x00, //!< Single transmission mode
  187. RF_TX_MODE_CONTINOUS = 0x01, //!< Continuous transmission mode
  188. } RfTxMode_t;
  189. /**
  190. * @brief PAN3029/3060的接收模式定义
  191. * - RF_RX_MODE_SINGLE: 单次接收模式,接收到一包数据后自动进入待机模式,一般不用此模式
  192. * - RF_RX_MODE_SINGLE_TIMEOUT: 单次带超时接收模式,超时后自动进入待机模式
  193. * - RF_RX_MODE_CONTINOUS: 连续接收模式,接收到一包数据后继续接收
  194. */
  195. typedef enum
  196. {
  197. RF_RX_MODE_SINGLE = 0x00, //!< Single reception mode
  198. RF_RX_MODE_SINGLE_TIMEOUT = 0x01, //!< Single reception with timeout mode
  199. RF_RX_MODE_CONTINOUS = 0x02, //!< Continuous reception mode
  200. } RfRxMode_t;
  201. /**
  202. * @brief PAN3029/3060的供电模式定义
  203. * - USE_LDO: 使用LDO供电,电流略大一点,但接收灵敏度略好
  204. * - USE_DCDC: 使用DCDC供电,电流略小一点,但接收灵敏度略差1~2dB
  205. */
  206. typedef enum
  207. {
  208. USE_LDO = 0x00, //!< Use LDO for power regulation
  209. USE_DCDC = 0x01, //!< Use DCDC for power regulation
  210. } RfRegulatorMode_t;
  211. /**
  212. * @brief PAN3029/3060的芯片模式定义
  213. * - CHIPMODE_MODE0
  214. * - CHIPMODE_MODE1
  215. */
  216. typedef enum
  217. {
  218. CHIPMODE_MODE0 = 0, //!< Mode 0
  219. CHIPMODE_MODE1 = 1, //!< Mode 1
  220. } RfChipMode_t;
  221. /**
  222. * @brief CAD检测门限值配置定义
  223. * - 门限值越小,可检测到更弱的信号,但误报率会增加
  224. * - 门限值越大,误报率会降低,但可检测到的信号强度范围会减小
  225. */
  226. typedef enum
  227. {
  228. RF_CAD_THRESHOLD_0A = 0x0A,
  229. RF_CAD_THRESHOLD_10 = 0x10,
  230. RF_CAD_THRESHOLD_15 = 0x15,
  231. RF_CAD_THRESHOLD_20 = 0x20,
  232. } RfCadThreshold_t;
  233. /**
  234. * @brief CAD检测符号数配置定义
  235. */
  236. typedef enum
  237. {
  238. RF_CAD_01_SYMBOL = 0x01, //!< 实际检测时间可能会大于1个符号的时间
  239. RF_CAD_02_SYMBOL = 0x02, //!< 实际检测时间可能会大于2个符号的时间
  240. RF_CAD_03_SYMBOL = 0x03, //!< 实际检测时间可能会大于3个符号的时间
  241. RF_CAD_04_SYMBOL = 0x04, //!< 实际检测时间可能会大于4个符号的时间
  242. } RfCadSymbols_t;
  243. /**
  244. * @brief Represents the possible spreading factor values in ChirpIot packet types
  245. */
  246. typedef enum
  247. {
  248. RF_SF5 = 0x05, //!< 5 spreading factor
  249. RF_SF6 = 0x06, //!< 6 spreading factor
  250. RF_SF7 = 0x07, //!< 7 spreading factor
  251. RF_SF8 = 0x08, //!< 8 spreading factor
  252. RF_SF9 = 0x09, //!< 9 spreading factor
  253. RF_SF10 = 0x0A, //!< 10 spreading factor
  254. RF_SF11 = 0x0B, //!< 11 spreading factor
  255. RF_SF12 = 0x0C, //!< 12 spreading factor
  256. } RfSpreadFactor_t;
  257. /**
  258. * @brief Represents the bandwidth values for ChirpIot packet type
  259. */
  260. typedef enum
  261. {
  262. RF_BW_062K = 6, //!< 62.5KHz bandwidth
  263. RF_BW_125K = 7, //!< 125KHz bandwidth
  264. RF_BW_250K = 8, //!< 250KHz bandwidth
  265. RF_BW_500K = 9, //!< 500KHz bandwidth
  266. } RfBandwidths_t;
  267. /**
  268. * @brief Represents the coding rate values for ChirpIot packet type
  269. * @note The coding rate is expressed as 4/x where x is the value below
  270. */
  271. typedef enum
  272. {
  273. RF_CR_4_5 = 0x01, //!< 4/5 coding rate
  274. RF_CR_4_6 = 0x02, //!< 4/6 coding rate
  275. RF_CR_4_7 = 0x03, //!< 4/7 coding rate
  276. RF_CR_4_8 = 0x04, //!< 4/8 coding rate
  277. } RfCodingRates_t;
  278. /**
  279. * @brief CRC模式
  280. * @note RF_CRC_ON: 开启CRC校验
  281. * @note RF_CRC_OFF: 关闭CRC校验,需要用户自己校验数据完整性
  282. */
  283. typedef enum
  284. {
  285. RF_CRC_OFF = 0x00, //!< CRC not used
  286. RF_CRC_ON = 0x01, //!< CRC activated
  287. } RfCrcModes_t;
  288. /**
  289. * @brief 低速率优化模式
  290. * @note RF_LDR_ON: Low data rate optimization activated
  291. * @note RF_LDR_OFF: Low data rate optimization not used
  292. */
  293. typedef enum
  294. {
  295. RF_LDR_OFF = 0x00, //!< Low data rate optimization not used
  296. RF_LDR_ON = 0x01, //!< Low data rate optimization activated
  297. } RfLdr_t;
  298. /**
  299. * @brief Represents the IQ mode for ChirpIot packet type
  300. */
  301. typedef enum
  302. {
  303. RF_IQ_NORMAL = 0x00, //!< Normal IQ mode,default
  304. RF_IQ_INVERTED = 0x01, //!< Inverted IQ mode
  305. } RfIQModes_t;
  306. typedef enum
  307. {
  308. RF_MAPM_GRP_ADDR = 0x00, //!< Address group
  309. RF_MAPM_GRP_COUNTER = 0x01, //!< Counter group
  310. } RfMapmGrpType_t;
  311. /**
  312. * @brief RF configuration structure of mapm
  313. * @member Addr: the address of mapm, which is 4 bytes
  314. * @member fn: the number of field before the standard preamble
  315. * @member fnm: the clone number of one field, which can be 0, 1, 2, 3,
  316. * fnm=0 indicates clone the field 1 times
  317. * fnm=1 indicates clone the field 2 times
  318. * fnm=2 indicates clone the field 4 times
  319. * fnm=3 indicates clone the field 8 times
  320. * @member gfs: the function select of last address, which can be 0 or 1
  321. * 0: the last address is ordinary address
  322. * 1: the last address is field counter
  323. * @member gn: the number of group in one filed, which can be 1, 2, 3, 4
  324. * gn=1 indicates 1 group(when gn=1, the field has only one group, fgs must be 0)
  325. * gn=2 indicates 2 groups
  326. * gn=3 indicates 3 groups
  327. * gn=4 indicates 4 groups
  328. * @member pg1: the number of preamble in the first group, which can be 8~255
  329. * pg1=8 indicates 8 chirps in the first group
  330. * pg1=255 indicates 255 chirps in the first group
  331. * @member pgn: the number of preamble in the other group, which can be 0~255
  332. * pgn=0 indicates 0 chirp in the other group, addr2~addr3 will be combined to addr1
  333. * pgn=255 indicates 255 chirps in the other group
  334. * @member pn: the number of preamble between fields and syncword, which can be 1~65535
  335. * @note the total numer of chirp before syncword: Pl=(pg1+1+pgn+1)*gn*fn*Fmux+pn
  336. * @note The mapm frame structure is as follows:
  337. * 1. The number of fields is fn, so N in the following figure equals fn;
  338. * 2. Preamble length in the figure is pn which is equal to the preamble length of normal
  339. * ChirpIot packet;
  340. * |<---------------------------------- Mapm Frame------------------------------------------>|
  341. * | Field1 | Field2 | Field3 | ... | FieldN | Preamble | SyncWord | Header | Payload | CRC |
  342. * |-----------------------------------------------------------------------------------------|
  343. *
  344. * @note The mapm field structure is as follows(gn=4 && gfs=1):
  345. * 1. Each field has 4 groups, the preamble len of the fist group must be bigger than 8
  346. * and less than 255; the preamble len of the other groups can be 0~255;
  347. * 2. Each group carries 1byte payload, the type of first three groups is address, and
  348. * the type of last(fourth) group is counter which indicates the number of left fields;
  349. * 3. The coding rate of the address and counter is 4/8, so the number of chirps in the
  350. * first group is pg1 + 2, and the number of chirps in the other groups is pgn + 2;
  351. * |<---------------------------------- Field ---------------------------------------------->|
  352. * | Group1 | Group2 | Group3 | Group4 |
  353. * |-----------------------------------------------------------------------------------------|
  354. * | Preamble | Address1 | Preamble | Address2 | Preamble | Address3 | Preamble | Counter |
  355. * |-----------------------------------------------------------------------------------------|
  356. *
  357. * @note The mapm field structure is as follows(gn=3 && gfs=1):
  358. * 1. Each field has 4 groups, the preamble len of the fist group must be bigger than 8
  359. * and less than 255; the preamble len of the other groups can be 0~255;
  360. * 2. Each group carries 1byte payload, the type of first two groups is address, and
  361. * the type of last(third) group is counter which indicates the number of left fields;
  362. * 3. The coding rate of the address and counter is 4/8, so the number of chirps in the
  363. * first group is pg1 + 2, and the number of chirps in the other groups is pgn + 2;
  364. * |<---------------------------------- Field ----------------------->|
  365. * | Group1 | Group2 | Group3 |
  366. * |------------------------------------------------------------------|
  367. * | Preamble | Address1 | Preamble | Address2 | Preamble | Counter |
  368. * |------------------------------------------------------------------|
  369. */
  370. typedef struct
  371. {
  372. uint8_t Addr[4]; //!< the address of mapm, which is 4 bytes
  373. uint8_t fn; //!< the number of field before the standard preamble
  374. uint8_t fnm; //!< the clone number of one field, which can be 0, 1, 2, 3
  375. uint8_t gn; //!< the number of group in one filed
  376. uint8_t gfs; //!< the function select of last address
  377. uint8_t pg1; //!< the number of preamble in the first group
  378. uint8_t pgn; //!< the number of preamble in the other group
  379. uint16_t pn; //!< the number of preamble between fields and syncword
  380. } RF_MapmCfg_t;
  381. /**
  382. * @brief Represents the possible operating states of the radio
  383. */
  384. typedef struct
  385. {
  386. uint8_t RxLen; //!< Size of the payload in the ChirpIot packet
  387. uint8_t RxBuf[255]; //!< Buffer to store the received payload
  388. uint8_t MapmRxIndex; //!< Index of the received payload in the ChirpIot packet
  389. uint8_t MapmRxBuf[16]; //!< Buffer to store the received payload in mapm mode
  390. int8_t Rssi; //!< The RSSI of the received packet
  391. int8_t Snr; //!< The SNR of the received packet
  392. } RfRxPkt_t;
  393. /**
  394. * @brief PAN3029/3060的配置参数结构体
  395. * @note 方便用户快速获取之前设置的参数
  396. */
  397. typedef struct
  398. {
  399. uint8_t TxPower; //!< The power level to be used for transmission
  400. uint32_t Frequency; //!< The frequency to be used for transmission and reception
  401. RfSpreadFactor_t SpreadingFactor; //!< Spreading Factor for the ChirpIot modulation
  402. RfBandwidths_t Bandwidth; //!< Bandwidth for the ChirpIot modulation
  403. RfCodingRates_t CodingRate; //!< Coding rate for the ChirpIot modulation
  404. RfCrcModes_t CrcMode; //!< Size of CRC block in ChirpIot packet
  405. RfIQModes_t InvertIQ; //!< Allows to swap IQ for ChirpIot packet
  406. uint8_t SyncWord; //!< Sync word byte
  407. uint8_t LowDatarateOptimize; //!< Indicates if the modem uses the low datarate optimization
  408. uint16_t PreambleLen; //!< The preamble length is the number of ChirpIot symbols in the preamble
  409. RfChipMode_t ChipMode; //!< The Chip for Communication with This Device
  410. RfRegulatorMode_t RegulatorMode; //!< The regulator mode for the radio
  411. } RfConfig_t;
  412. /**
  413. * @brief PAN3029/3060接收数据包结构体
  414. * @note 该结构体用于存储接收到的数据包,包括数据长度、数据缓冲区、SNR和RSSI等信息
  415. */
  416. extern volatile RfRxPkt_t g_RfRxPkt;
  417. /**
  418. * RF definitions
  419. */
  420. /**
  421. * ============================================================================
  422. * Public functions prototypes
  423. * ============================================================================
  424. */
  425. /**
  426. * @brief 微秒级延时函数
  427. * @param us 延时的微秒数
  428. */
  429. void RF_DelayUs(uint32_t us);
  430. /**
  431. * @brief 毫秒级延时函数
  432. * @param ms 延时的毫秒数
  433. */
  434. void RF_DelayMs(uint32_t ms);
  435. /**
  436. * @brief 写入单个字节到指定寄存器
  437. * @param Addr 要写入的寄存器地址
  438. * @param Value 要写入寄存器的单字节数据
  439. * @return RF_Err_t 返回操作结果
  440. */
  441. RF_Err_t RF_WriteReg(uint8_t Addr, uint8_t Value);
  442. /**
  443. * @brief 从指定的寄存器读取单个字节
  444. * @param Addr 要读取的寄存器地址
  445. * @return uint8_t 从寄存器读取的值
  446. */
  447. uint8_t RF_ReadReg(uint8_t Addr);
  448. /**
  449. * @brief 连续写入多个字节到指定寄存器区
  450. * @param Addr 要写入的寄存器区的起始地址
  451. * @param Buffer 要写入寄存器的缓冲区指针
  452. * @param Size 要写入的字节数
  453. */
  454. void RF_WriteRegs(uint8_t Addr, uint8_t *Buffer, uint8_t Size);
  455. /**
  456. * @brief 从指定的寄存器连续读取多个字节
  457. * @param Addr 要读取的寄存器地址
  458. * @param Buffer 存储读取数据的缓冲区指针
  459. * @param Size 要读取的字节数
  460. */
  461. void RF_ReadRegs(uint8_t Addr, uint8_t *Buffer, uint8_t Size);
  462. /**
  463. * @brief 选择寄存器页
  464. * @param Page 要选择的寄存器页
  465. * @return RF_Err_t 返回操作结果
  466. */
  467. RF_Err_t RF_SetPage(uint8_t Page);
  468. /**
  469. * @brief 写入单个字节到指定页的寄存器
  470. * @param Page 要写入的寄存器页
  471. * @param Addr 要写入的寄存器地址
  472. * @param Value 要写入寄存器的单字节数据
  473. * @return RF_Err_t 返回操作结果
  474. */
  475. RF_Err_t RF_WritePageReg(uint8_t Page, uint8_t Addr, uint8_t Value);
  476. /**
  477. * @brief 写入多个字节到指定页的寄存器区间
  478. * @param Page 要写入的寄存器页
  479. * @param Addr 要写入的寄存器地址
  480. * @param Buffer 要写入寄存器的缓冲区指针
  481. * @param Size 要写入的字节数
  482. */
  483. void RF_WritePageRegs(uint8_t Page, uint8_t Addr, uint8_t *Buffer, uint8_t Size);
  484. /**
  485. * @brief 从指定页的寄存器读取单个字节
  486. * @param Page 要读取的寄存器页
  487. * @param Addr 要读取的寄存器地址
  488. * @return uint8_t 从寄存器读取的值
  489. */
  490. uint8_t RF_ReadPageReg(uint8_t Page, uint8_t Addr);
  491. /**
  492. * @brief 从指定页的寄存器区间读取多个字节
  493. * @param Page 要读取的寄存器页
  494. * @param Addr 要读取的寄存器地址
  495. * @param Buffer 存储读取数据的缓冲区指针
  496. * @param Size 要读取的字节数
  497. */
  498. void RF_ReadPageRegs(uint8_t Page, uint8_t Addr, uint8_t *Buffer, uint8_t Size);
  499. /**
  500. * @brief 置位指定页的寄存器位
  501. * @param Page 要设置的寄存器页
  502. * @param Addr 要设置的寄存器地址
  503. * @param Mask 要设置的位掩码
  504. * @return RF_Err_t 返回操作结果
  505. */
  506. RF_Err_t RF_SetPageRegBits(uint8_t Page, uint8_t Addr, uint8_t Mask);
  507. /**
  508. * @brief 复位指定页的寄存器位
  509. * @param Page 要重置的寄存器页
  510. * @param Addr 要重置的寄存器地址
  511. * @param Mask 要重置的位掩码
  512. * @return RF_Err_t 返回操作结果
  513. */
  514. RF_Err_t RF_ResetPageRegBits(uint8_t Page, uint8_t Addr, uint8_t Mask);
  515. /**
  516. * @brief 写入指定页的寄存器位
  517. * @param Page 要写入的寄存器页
  518. * @param Addr 要写入的寄存器地址
  519. * @param Value 要写入的值
  520. * @param Mask 要写入的位掩码
  521. * @return RF_Err_t 返回操作结果
  522. */
  523. RF_Err_t RF_WritePageRegBits(uint8_t Page, uint8_t Addr, uint8_t Value, uint8_t Mask);
  524. /**
  525. * @brief 配置GPIO模式
  526. * @param[in] <GpioPin> 引脚号
  527. * @param[in] <GpioMode> GPIO模式
  528. * @return RF_Err_t 返回操作结果
  529. */
  530. RF_Err_t RF_ConfigGpio(uint8_t GpioPin, uint8_t GpioMode);
  531. /**
  532. * @brief 控制GPIO输出电平
  533. * @param[in] <GpioPin> 引脚号
  534. * @param[in] <Level> GPIO电平
  535. * @return RF_Err_t 返回操作结果
  536. */
  537. RF_Err_t RF_WriteGpioLevel(uint8_t GpioPin, uint8_t Level);
  538. /**
  539. * @brief 读取GPIO电平
  540. * @param[in] <GpioPin> 引脚号
  541. * @return 读取的GPIO电平
  542. */
  543. uint8_t RF_ReadGpioLevel(uint8_t GpioPin);
  544. /**
  545. * @brief 初始化PAN3029/3060的天线控制GPIO
  546. */
  547. void RF_InitAntGpio(void);
  548. /**
  549. * @brief 打开PAN3029/3060的发射天线
  550. */
  551. void RF_TurnonTxAnt(void);
  552. /**
  553. * @brief 打开PAN3029/3060的接收天线
  554. */
  555. void RF_TurnonRxAnt(void);
  556. /**
  557. * @brief 关闭PAN3029/3060的天线
  558. */
  559. void RF_ShutdownAnt(void);
  560. /**
  561. * @brief 初始化TCXO控制GPIO
  562. */
  563. void RF_InitTcxoGpio(void);
  564. /**
  565. * @brief 打开TCXO的供电电源
  566. */
  567. void RF_TurnonTcxo(void);
  568. /**
  569. * @brief 关闭TCXO的供电电源
  570. */
  571. void RF_TurnoffTcxo(void);
  572. /**
  573. * @brief Turnon LDO PA
  574. */
  575. void RF_TurnonLdoPA(void);
  576. /**
  577. * @brief Turnoff LDO PA
  578. */
  579. void RF_TurnoffLdoPA(void);
  580. /**
  581. * @brief 打开内部和外部PA
  582. */
  583. void RF_TurnonPA(void);
  584. /**
  585. * @brief 关闭内部和外部PA
  586. */
  587. void RF_TurnoffPA(void);
  588. /**
  589. * @brief 设置芯片模式
  590. * @param[in] <ChipMode> 芯片模式
  591. */
  592. void RF_SetChipMode(RfChipMode_t ChipMode);
  593. /**
  594. * @brief 获取芯片模式
  595. * @return RfChipMode_t 当前芯片模式
  596. */
  597. RfChipMode_t RF_GetChipMode(void);
  598. /**
  599. * @brief 上电后初始化RF收发器到STB3状态
  600. * @return 初始化是否成功,0表示成功,1表示失败
  601. */
  602. RF_Err_t RF_Init(void);
  603. /**
  604. * @brief 配置RF芯片的用户参数
  605. */
  606. void RF_ConfigUserParams(void);
  607. /**
  608. * @brief 软件复位RF芯片控制逻辑
  609. */
  610. void RF_ResetLogic(void);
  611. /**
  612. * @brief 获取RF芯片的工作状态
  613. * @return RfOpState_t 当前工作状态
  614. */
  615. RfOpState_t RF_GetOperateState(void);
  616. /**
  617. * @brief 设置RF芯片的工作状态
  618. * @param[in] <RfState> 工作状态
  619. */
  620. void RF_SetOperateState(RfOpState_t RfState);
  621. /**
  622. * @brief 设置RF芯片的工作状态
  623. * @param[in] <RfState> 工作状态
  624. */
  625. void RF_SetRfState(uint8_t RfState);
  626. /**
  627. * @brief 进入深度睡眠模式
  628. * @note 该函数用于将RF芯片置于深度睡眠模式,关闭天线供电和TCXO电源
  629. * @note 该函数会将芯片的工作状态设置为MODE_DEEPSLEEP
  630. * @note 执行该函数后,如需唤醒RF芯片,需要调用RF_Init()函数唤醒芯片
  631. */
  632. void RF_EnterDeepsleepState(void);
  633. /**
  634. * @brief 进入睡眠模式
  635. * @note 该函数用于将RF芯片置于睡眠模式,关闭天线供电和TCXO电源
  636. * @note 该函数会将芯片的工作状态设置为MODE_SLEEP
  637. * @note 执行该函数后,如需唤醒RF芯片,需要调用RF_ExitSleepState()函数
  638. */
  639. void RF_EnterSleepState(void);
  640. /**
  641. * @brief 退出睡眠模式
  642. */
  643. void RF_ExitSleepState(void);
  644. /**
  645. * @brief 进入待机模式
  646. */
  647. void RF_EnterStandbyState(void);
  648. /**
  649. * @brief 检查RF芯片是否处于休眠状态
  650. */
  651. void RF_CheckDeviceReady(void);
  652. /**
  653. * @brief 设置芯片的供电模式
  654. * @param[in] <RegulatorMode> 供电模式
  655. */
  656. void RF_SetRegulatorMode(RfRegulatorMode_t RegulatorMode);
  657. /**
  658. * @brief 设置RF芯片的频率
  659. * @param[in] <Frequency> 频率值
  660. */
  661. RF_Err_t RF_SetFreq(uint32_t Frequency);
  662. /**
  663. * @brief 设置IQ反转
  664. * @param[in] <enable> 使能或禁用IQ反转
  665. */
  666. void RF_SetInvertIQ(bool NewState);
  667. /**
  668. * @brief 设置前导码长度
  669. * @param[in] <PreamLen> 前导码长度值
  670. */
  671. void RF_SetPreamLen(uint16_t PreamLen);
  672. /**
  673. * @brief 设置同步字
  674. * @param[in] <syncWord> 同步字值
  675. */
  676. void RF_SetSyncWord(uint8_t SyncWord);
  677. /**
  678. * @brief 设置发射功率
  679. * @param[in] <TxPower> 发射档位
  680. */
  681. void RF_SetTxPower(uint8_t TxPower);
  682. /**
  683. * @brief 设置调制带宽
  684. * @param[in] <BandWidth> 调制带宽值
  685. * - RF_BW_062K / RF_BW_125K / RF_BW_250K / RF_BW_500K
  686. * @note 调制带宽越大,数据速率越高,但传输距离越短
  687. * @note PAN3029芯片的调制带宽范围为RF_BW_062K - RF_BW_500K
  688. * @note PAN3060芯片的调制带宽范围为RF_BW_125K - RF_BW_500K
  689. */
  690. void RF_SetBW(uint8_t BandWidth);
  691. /**
  692. * @brief 设置扩频因子
  693. * @param[in] <SpreadFactor> 扩频因子值
  694. * - RF_SF5 / RF_SF6 / RF_SF7 / RF_SF8 / RF_SF9 / RF_SF10 / RF_SF11 / RF_SF12
  695. * @note 扩频因子越大,传输距离越远,但数据速率越低
  696. * @note PAN3029芯片的扩频因子范围为RF_SF5 - RF_SF12
  697. * @note PAN3060芯片的扩频因子范围为RF_SF5 - RF_SF9
  698. */
  699. void RF_SetSF(uint8_t SpreadFactor);
  700. /**
  701. * @brief 设置信道编码率
  702. * @param[in] <CodingRate> 信道编码率值
  703. */
  704. void RF_SetCR(uint8_t CodingRate);
  705. /**
  706. * @brief 设置CRC校验
  707. * @param[in] <NewState> 使能或禁用CRC校验
  708. */
  709. void RF_SetCRC(uint8_t CrcMode);
  710. /**
  711. * @brief 设置低速率模式
  712. * @param[in] <LdrMode> 低速率模式值
  713. */
  714. void RF_SetLDR(uint8_t LdrMode);
  715. /**
  716. * @brief set modem mode
  717. * @param[in] <modem_mode>
  718. */
  719. void RF_SetModemMode(uint8_t ModemMode);
  720. /**
  721. * @brief 设置发送模式
  722. * @param Buffer 要发送的数据缓冲区
  723. * @param Size 要发送的数据字节数
  724. */
  725. void RF_SetTx(uint8_t *Buffer, uint8_t Size);
  726. /**
  727. * @brief 设置接收模式
  728. * @param TimeoutMs 接收超时时间
  729. */
  730. void RF_SetRx(uint32_t TimeoutMs);
  731. /**
  732. * @brief CAD function enable
  733. * @param[in] <Threshold>
  734. */
  735. void RF_StartCad(uint8_t Threshold, uint8_t Chirps);
  736. /**
  737. * @brief 设置CAD检测阈值
  738. * @param[in] <Threshold> CAD检测阈值
  739. * - RF_CAD_THRESHOLD_0A
  740. * - RF_CAD_THRESHOLD_10
  741. * - RF_CAD_THRESHOLD_15
  742. * - RF_CAD_THRESHOLD_20
  743. */
  744. void RF_SetCadThreshold(uint8_t Threshold);
  745. /**
  746. * @brief 设置CAD检测符号数
  747. * @param[in] <Chirps> CAD检测符号数
  748. * - RF_CAD_01_SYMBOL
  749. * - RF_CAD_02_SYMBOL
  750. * - RF_CAD_03_SYMBOL
  751. * - RF_CAD_04_SYMBOL
  752. */
  753. void RF_SetCadChirps(uint8_t Chirps);
  754. /**
  755. * @brief CAD function disable
  756. */
  757. void RF_StopCad(void);
  758. /**
  759. * @brief 设置发射模式
  760. * @param[in] <TxMode>
  761. */
  762. void RF_SetTxMode(uint8_t TxMode);
  763. /**
  764. * @brief 发送单个数据包
  765. * @param[in] <Buffer> 要发送的数据缓冲区
  766. * @param[in] <Size> 要发送的数据字节数
  767. */
  768. void RF_TxSinglePkt(uint8_t *Buffer, uint8_t Size);
  769. /**
  770. * @brief 设置接收模式
  771. * @param[in] <RxMode> 接收模式
  772. */
  773. void RF_SetRxMode(uint8_t RxMode);
  774. /**
  775. * @brief 让芯片进入连续接收状态
  776. */
  777. void RF_EnterContinousRxState(void);
  778. /**
  779. * @brief 设置接收超时时间
  780. * @param[in] <TimeoutMs> 超时时间
  781. */
  782. void RF_SetRxTimeout(uint16_t TimeoutMs);
  783. /**
  784. * @brief 让芯片进入带超时的单次接收状态
  785. * @param[in] <TimeoutMs> 超时时间
  786. */
  787. void RF_EnterSingleRxWithTimeout(uint16_t TimeoutMs);
  788. /**
  789. * @brief 获取接收数据长度
  790. * @return 接收数据长度
  791. */
  792. uint8_t RF_GetRxPayloadLen(void);
  793. /**
  794. * @brief 函数用于获取接收数据长度及内容
  795. * @param *Buffer 待接收数据区指针地址
  796. * @return 接收到的数据长度
  797. */
  798. uint8_t RF_GetRecvPayload(uint8_t *Buffer);
  799. /**
  800. * @brief 获取接收数据包的RSSI值
  801. * @return RSSI值
  802. */
  803. int8_t RF_GetPktRssi(void);
  804. /**
  805. * @brief 获取实时RSSI值
  806. * @return RSSI值
  807. */
  808. int8_t RF_GetRealTimeRssi(void);
  809. /**
  810. * @brief 获取接收数据包的SNR值
  811. * @return SNR值
  812. */
  813. int32_t RF_GetPktSnr(void);
  814. /**
  815. * @brief 获取中断标志位
  816. * @return IRQ标志位
  817. */
  818. uint8_t RF_GetIRQFlag(void);
  819. /**
  820. * @brief 清中断标志位
  821. * @param[in] <IRQFlag> 中断标志位
  822. */
  823. void RF_ClrIRQFlag(uint8_t IRQFlag);
  824. /**
  825. * @brief 获取当前的频率设置
  826. */
  827. uint32_t RF_GetFreq(void);
  828. /**
  829. * @brief 获取IQ反转值
  830. */
  831. RfIQModes_t RF_GetInvertIQ(void);
  832. /**
  833. * @brief 获取当前的前导码长度设置
  834. */
  835. uint16_t RF_GetPreamLen(void);
  836. /**
  837. * @brief 获取当前的发射功率设置
  838. */
  839. uint8_t RF_GetTxPower(void);
  840. /**
  841. * @brief 获取当前的调制带宽设置
  842. */
  843. uint8_t RF_GetBandWidth(void);
  844. /**
  845. * @brief 获取当前的扩频因子设置
  846. */
  847. uint8_t RF_GetSF(void);
  848. /**
  849. * @brief 获取当前的CRC校验设置
  850. */
  851. uint8_t RF_GetCRC(void);
  852. /**
  853. * @brief 获取当前的编码率设置
  854. */
  855. uint8_t RF_GetCR(void);
  856. /**
  857. * @brief 获取当前的同步字设置
  858. */
  859. uint8_t RF_GetSyncWord(void);
  860. /**
  861. * @brief 获取当前的发射模式设置
  862. */
  863. uint8_t RF_GetLDR(void);
  864. /**
  865. * @brief 获取单个符号的时间
  866. * @param[in] <bw> 带宽
  867. * - RF_BW_062K / RF_BW_125K / RF_BW_250K / RF_BW_500K
  868. * @param[in] <sf> 扩频因子
  869. * - RF_SF5 / RF_SF6 / RF_SF7 / RF_SF8 / RF_SF9 / RF_SF10 / RF_SF11 / RF_SF12
  870. * @return 单个符号的时间,单位为us
  871. * @note 该函数用于计算单个符号的时间
  872. */
  873. uint32_t RF_GetOneSymbolTime(uint8_t bw, uint8_t sf);
  874. /**
  875. * @brief 计算发送数据包的时间
  876. * @param[in] <Size> 发送数据包的大小,单位为字节
  877. * @return 发送数据包的时间,单位为ms
  878. */
  879. uint32_t RF_GetTxTimeMs(uint8_t Size);
  880. /**
  881. * @brief 启动mapm模式
  882. */
  883. void RF_EnableMapm(void);
  884. /**
  885. * @brief 关闭mapm模式
  886. */
  887. void RF_DisableMapm(void);
  888. /**
  889. * @brief 配置mapm相关参数
  890. * @param[in] <pMapmCfg>
  891. */
  892. void RF_ConfigMapm(RF_MapmCfg_t *pMapmCfg);
  893. /**
  894. * @brief 设置mapm模式下的组地址
  895. * @param[in] <MapmAddr> mapm组地址
  896. * <AddrWidth> 地址宽度,范围为1~4
  897. * @note 接收端的MapmAddr[0]须与发送端的MapmAddr[0]一致,
  898. * 否则接收端不会触发mapm中断。
  899. */
  900. void RF_SetMapmAddr(uint8_t *MapmAddr, uint8_t AddrWidth);
  901. /**
  902. * @brief 计算1个field花费的时间(ms)
  903. * @param[in] <pMapmCfg> mapm配置参数
  904. * <SymbolTime> 单个symbol(chirp)时间
  905. * @note Group1中chirp的数量为(pg1 + 2),其中pg1为Group1中前导码的个数,2为Group1中地址占用的chirp数。
  906. * @note 其它Group中chirp的数量为(pgn + 2)*(gn-1),其中pgn为其它单个Group中前导码的个数,
  907. * 2为其它单个Group中地址(或计数值)占用的chirp数,(gn-1)为除去Group1后剩余的Group数。
  908. */
  909. uint32_t RF_GetMapmOneFieldTime(RF_MapmCfg_t *pMapmCfg, uint32_t SymbolTime);
  910. /**
  911. * @brief 获取mapm模式下的剩余Mapm时间
  912. * @param[in] <pMapmCfg> mapm配置参数
  913. * @param[in] <SynbolTime> 单个chirp时间
  914. * @return 剩余Mapm时间,单位为ms
  915. */
  916. uint32_t RF_GetLeftMapmTime(RF_MapmCfg_t *pMapmCfg, uint32_t SynbolTime);
  917. /**
  918. * @brief 开始发送连续载波
  919. */
  920. void RF_StartTxContinuousWave(void);
  921. /**
  922. * @brief 停止发送连续载波
  923. */
  924. void RF_StopTxContinuousWave(void);
  925. /**
  926. * @brief 处理RF中断
  927. * @note 此函数会在中断服务函数中调用
  928. */
  929. void RF_IRQ_Process(void);
  930. /** \} defgroup PAN3029/3060 */
  931. /** \} addtogroup ChirpIOT */
  932. #endif // __PAN_RF_H__