//===================================================================================// // * @file RF.H // * @author droplin // * @version V1.1 // * @date 2020/12/16 // * @brief Main program body // * @modify user: droplin // * @modify date: 2019/12/19 //===================================================================================// #ifndef _RF_SETTING_H_ #define _RF_SETTING_H_ #include "stdbool.h" #include "stdint.h" #pragma pack(1) typedef struct { int8_t power; uint8_t pa1_lvl : 6; uint8_t pa2_lvl : 6; }rf_powerRaw_ts; //00 CONFIG - 0C - 工作寄存器 typedef union { uint8_t value; struct { uint8_t PRIM_RX : 1;// 0 0 R/W RX/TX 控制位 // 1:PRX // 0:PTX uint8_t PWR_UP : 1;// 1 0 R/W 芯片使能位 // 1:POWER_UP // 0:POWER_DOWN uint8_t CRC_SEL : 1;// 2 1 R/W CRC 选择 // 1:CRC16 // 0:CRC8 uint8_t EN_CRC : 1;// 3 1 R/W CRC 使能位 // 1:CRC 使能 // 0:CRC 不使能,并且不判 CRC 校验 uint8_t MASK_MAX_RT : 1;// 4 0 R/W 发送失败并达到最大传输次数的中断上 // 报使能位 // 1:中断不反映到 IRQ 引脚 // 0:MAX_RT 中断反映到 IRQ 引脚 uint8_t MASK_TX_DS : 1;// 5 0 R/W 发送数据成功的中断上报使能位 // 1:中断不反映到 IRQ 引脚 // 0:TX_DS 中断反映到 IRQ 引脚 uint8_t MASK_RX_DR : 1;// 6 0 R/W 接收数据成功的中断上报使能位 // 1:中断不反映到 IRQ 引脚 // 0:RX_DR 中断反映到 IRQ 引脚 uint8_t FAST_MODE : 1;// 7 0 R/W 快速发射使能 // 1:快速发射模式使能 // 0:快速发射模式不使能 }bits; }config_tu; //01 EN_AA Enhanced Burst- 01 - 接收通道的自动应答使能 typedef union { uint8_t value; struct { uint8_t ENAA_P0 : 1;// 0 1 R/W 使能 pipe0 自动应答 uint8_t ENAA_P1 : 1;// 1 0 R/W 使能 pipe1 自动应答 uint8_t ENAA_P2 : 1;// 2 0 R/W 使能 pipe2 自动应答 uint8_t ENAA_P3 : 1;// 3 0 R/W 使能 pipe3 自动应答 uint8_t ENAA_P4 : 1;// 4 0 R/W 使能 pipe4 自动应答 uint8_t ENAA_P5 : 1;// 5 0 R/W 使能 pipe5 自动应答 uint8_t Reserved : 1;// 7:6 00 R/W Only 00 allowed }bits; }en_aa_enhanced_burst_tu; //02 EN_RXADDR - 01 - 接收通道使能 typedef union { uint8_t value; struct { uint8_t ERX_P0 : 1;// 0 1 R/W 使能 data pipe 0 uint8_t ERX_P1 : 1;// 1 0 R/W 使能 data pipe 1 uint8_t ERX_P2 : 1;// 2 0 R/W 使能 data pipe 2 uint8_t ERX_P3 : 1;// 3 0 R/W 使能 data pipe 3 uint8_t ERX_P4 : 1;// 4 0 R/W 使能 data pipe 4 uint8_t ERX_P5 : 1;// 5 0 R/W 使能 data pipe 5 uint8_t Reserved : 1;// 7:6 00 R/W Only 00 allowed }bits; }en_rxAddr_tu; //03 SETUP_AW - 03 - 地址宽度设置 typedef union { uint8_t value; struct { uint8_t AW : 2;// 1:0 11 R/W RX/TX 地址宽度 // 00:无效 // 01:3 字节 // 10:4 字节 // 11:5 字节 // 如果地址宽度设置低于 5 字节,地址使 // 用低字节 uint8_t Reserved : 6;// 7:2 000000 R/W Only 000000 allowed }bits; }setUp_aw_tu; //04 SETUP_RETR - 03 - 自动传输设置 typedef union { uint8_t value; struct { uint8_t ARC : 4;// 3:0 0011 R/W 自动传输次数设置 // 0000:不带自动重传不带 ACK 的通信模 // 式 // 0001~1111:带自动重传的通信模式 // 0001:带 ACK 的 1 次传输 // 0002:带 ACK 的 2 次传输 // …… // 1111:带 ACK 的 15 次传输 uint8_t ARD : 4;// 7:4 0000 R/W 自动传输延时 // 0000:250us // 0001:570us // 0010:890us // …… // 1111:9530us // 时间计算方法: // {ARD,7’b1100100}x2.5us }bits; }setUp_retr_tu; //05 RF_CH - 20 - 通信频道设置 typedef union { uint8_t value; struct { uint8_t FC8_1 : 8;// 7:0 00100000 R/W 设置使用频道小数位, FC 的第 0bit 在 // RF_ CAL[3] }bits; }rf_ch_tu; //06 RF_SETUP - 52 - 通信参数配置 typedef enum { RF_DR_40KBPS, RF_DR_80KBPS, RF_DR_200KBPS, RF_DR_400KBPS, }rf_dr_te; typedef union { uint8_t value; struct { uint8_t FB5_0 : 6;// 5:0 010010 R/W 设置使用频道整数位 uint8_t RF_DR : 2;// 7:6 01 R/W 数据速率 // 11:400Kbps // 10:200Kbps // 01:80kbps 默认 // 00:40kbps }bits; }rf_setup_tu; // 07 STATUS - - - 状态寄存器 typedef union { uint8_t value; struct { uint8_t TX_FULL : 1;// 0 0 R TX FIFO 满标志 // 1:TX FIFO 满 // 0:TX FIFO 未满可用 uint8_t RX_P_NO : 3;// 3:1 111 R 可从 RX_FIFO 读取的 pipe 号 // 000-101:pipe 号 // 110:Not Used // 111:RX_FIFO 空 uint8_t MAX_RT : 1;// 4 0 R/W 发送达到最大传输次数未成功中断位。 // 写 1 清中断 // 产生该中断后,继续进行通信必须先清 // 该中断 uint8_t TX_DS : 1;// 5 0 R/W TX FIFO 发送数据成功中断位, // 在不带自动重传模式下,数据发送完成 // 后产生中断; // 在带自动重传模式下,仅在发送端收到 // ACK 信号后才会将该位置高。 // 写 1 清中断 uint8_t RX_DR : 1;// 6 0 R/W RX FIFO 接收数据中断位, // 在新数据被接收并到达 RX FIFO 时产生 // 中断。 // 写 1 清中断 uint8_t Reserved : 1;// 7 0 R/W Only 0 allowed }bits; }status_tu; // 08 OBSERVE_TX - - - 传输状态寄存器 typedef union { uint8_t value; struct { uint8_t ARC_CNT : 1;// 3:0 0 R 自动重传的传输次数计数器 // 自动重传增加一次,ARC_CNT 加一; // 在 ARC_CNT 达到 ARC 限定值时,视为 // 丢包,并将 PLOS_CNT 加一; // 当新数据写入 TX FIFO 时该计数器复 // 位。 uint8_t PLOS_CNT : 1;// 7:4 0 R 丢包计数器 // 该计数器达到最大值 15 时将停止计数, // 该计数器在写 RF_CH 时被复位, // 未复位该值时可以继续进行通信 }bits; }observe_tx_tu; // 09 DATAOUT - - - 数据读取寄存器(测试用) // 根据 DATAOUT_SEL 位选择输出,当 // DATAOUT_SEL 为 0 时,读取第一种测 // 试值;当 DATA OUT_SEL 为 1 时,读取 // 第二种测试值;DATAOUT_SEL 默认为 // 0。 typedef union { uint8_t value; struct { uint8_t ANADATA3 : 6;// 5:0 0 R analog_data[13:8] // packet_rssi[5:0] 或 // real_time_rssi[5:0],默认输出 packet_rssi uint8_t ANADATA2 : 1;// 6 0 R analog_data6 或 analog_data 2,默认输出analog_data6s uint8_t ANADATA1 : 1;// 7 0 R analog_data7 或 analog_data 3,默认输出analog_data7 }bits; }dataOut_tu; // 0A RX_ADDR_P0 39:0 0xE7E7E7E7E7 // R/W data pipe 0 的接收地址,最长 5 字节。(由低字开始写。地址长度由 SETUP_AW 定义) typedef struct { uint8_t value[5]; }rx_addr_p0_ts; // 0B RX_ADDR_P1 39:0 0xC2C2C2C2C2 // R/W data pipe 1 的接收地址,最长 5 字节。(由低字开始写。地址长度由 SETUP_AW 定义) typedef struct { uint8_t value[5]; }rx_addr_p1_ts; // 0C RX_ADDR_P2 7:0 0xC3 R/W data pipe 2 的接收地址,仅最低 8 位,高 // 位等于 RX_ADDR_P1[39:8] typedef struct { uint8_t addr; }rx_addr_p2_ts; // 0D RX_ADDR_P3 7:0 0xC4 R/W data pipe 3 的接收地址,仅最低 8 位,高 // 位等于 RX_ADDR_P1[39:8] typedef struct { uint8_t addr; }rx_addr_p3_ts; // 0E RX_ADDR_P4 7:0 0xC5 R/W data pipe 4 的接收地址,仅最低 8 位,高 // 位等于 RX_ADDR_P1[39:8] typedef struct { uint8_t addr; }rx_addr_p4_ts; // 0F RX_ADDR_P5 7:0 0xC6 R/W data pipe 5 的接收地址,仅最低 8 位,高 // 位等于 RX_ADDR_P1[39:8 typedef struct { uint8_t addr; }rx_addr_p5_ts; // 10 TX_ADDR 39:0 0xE7E7E7E7E7 R/W 发送端地址(由低字节开始写) // 只能在配置为 PTX 模式的芯片中使用, // 需要设置 RX_ADDR_P0 等于该地址以 // 便接收 ACK 自动应答。 typedef struct { uint8_t value[5]; }tx_addr_ts; // 11 RX_PW_P0 - 00 - data pipe 0 中的 RX payload 的数据长度 typedef union { uint8_t value; struct { uint8_t RX_PW_Px_LEN : 7;// 6:0 0000000 R/W data pipe 0 中的 RX payload 的数据长度 // (1 到 32/64 字节) // 0:该 Pipe 未用 // 1 = 1 byte // … // 32/64 = 32/64bytes uint8_t Reserved : 1;// 7 0 R/W Only 0 allowed }bits; }rx_pw_px_tu; // 11 RX_PW_P0 - 00 - data pipe 0 中的 RX payload 的数据长度 typedef union { uint8_t value; struct { uint8_t RX_PW_P0_LEN : 7;// 6:0 0000000 R/W data pipe 0 中的 RX payload 的数据长度 // (1 到 32/64 字节) // 0:该 Pipe 未用 // 1 = 1 byte // … // 32/64 = 32/64bytes uint8_t Reserved : 1;// 7 0 R/W Only 0 allowed }bits; }rx_pw_p0_tu; // 12 RX_PW_P1 - 00 - data pipe 1 中的 RX payload 的数据长度 typedef union { uint8_t value; struct { uint8_t RX_PW_P1_LEN : 7;// 6:0 0000000 R/W data pipe 0 中的 RX payload 的数据长度 // (1 到 32/64 字节) // 0:该 Pipe 未用 // 1 = 1 byte // … // 32/64 = 32/64bytes uint8_t Reserved : 1;// 7 0 R/W Only 0 allowed }bits; }rx_pw_p1_tu; // 13 RX_PW_P2 - 00 - data pipe 2 中的 RX payload 的数据长度 typedef union { uint8_t value; struct { uint8_t RX_PW_P2_LEN : 7;// 6:0 0000000 R/W data pipe 0 中的 RX payload 的数据长度 // (1 到 32/64 字节) // 0:该 Pipe 未用 // 1 = 1 byte // … // 32/64 = 32/64bytes uint8_t Reserved : 1;// 7 0 R/W Only 0 allowed }bits; }rx_pw_p2_tu; // 14 RX_PW_P3 - 00 - data pipe 3 中的 RX payload 的数据长度 typedef union { uint8_t value; struct { uint8_t RX_PW_P3_LEN : 7;// 6:0 0000000 R/W data pipe 0 中的 RX payload 的数据长度 // (1 到 32/64 字节) // 0:该 Pipe 未用 // 1 = 1 byte // … // 32/64 = 32/64bytes uint8_t Reserved : 1;// 7 0 R/W Only 0 allowed }bits; }rx_pw_p3_tu; // 15 RX_PW_P4 - 00 - data pipe 4 中的 RX payload 的数据长度 typedef union { uint8_t value; struct { uint8_t RX_PW_P4_LEN : 7;// 6:0 0000000 R/W data pipe 0 中的 RX payload 的数据长度 // (1 到 32/64 字节) // 0:该 Pipe 未用 // 1 = 1 byte // … // 32/64 = 32/64bytes uint8_t Reserved : 1;// 7 0 R/W Only 0 allowed }bits; }rx_pw_p4_tu; // 16 RX_PW_P5 - 00 - data pipe 5 中的 RX payload 的数据长度 typedef union { uint8_t value; struct { uint8_t RX_PW_P5_LEN : 7;// 6:0 0000000 R/W data pipe 0 中的 RX payload 的数据长度 // (1 到 32/64 字节) // 0:该 Pipe 未用 // 1 = 1 byte // … // 32/64 = 32/64bytes uint8_t Reserved : 1;// 7 0 R/W Only 0 allowed }bits; }rx_pw_p5_tu; // 17 FIFO_STATUS - - - FIFO 状 态 寄 存 器 以 及 analog_data[5:4]/[1:0] typedef union { uint8_t value; struct { uint8_t RX_EMPTY : 1;// 0 1 R RX FIFO 空标志位 // 1:RX FIFO 空 // 0:RX FIFO 有数据 uint8_t RX_FULL : 1;// 1 0 R RX FIFO 满标志位 // 1:RX FIFO 满 // 0:RX FIFO 可用 uint8_t ANADATA : 1;// 2 0 R analog_data[5]或analog_data[0], // 由 DATAOUT_SEL 选择, // 默认输出 analog_data5 uint8_t ANADATA2 : 1;// 3 0 R analog_data[4]或analog_data[1], // 由 DATAOUT_SEL 选择, // 默认输出 analog_data4 uint8_t TX_EMPTY : 1;// : 1;// 4 1 R TX FIFO 空标志位 // 1:TX FIFO 空 // 0:TX FIFO 有数据 uint8_t TX_FULL : 1;// 5 0 R TX FIFO 满标志位 // 1:TX FIFO 满 // 0:TX FIFO 可用 uint8_t TX_REUSE : 1;// 6 0 R 调用上一帧数据发送的指示位 // 在使用 REUSE_TX_PL 命令后,该位为 // 1,重传上一次发送中最后一帧数据。该 // 位可以由命令 W_TX_PAYLOAD 、W_TX_PAYLOAD_NOACK : 1;// 、 DEACTIVATE、FLUSH TX 进行复位操作。 uint8_t reserved : 1;// 7 0 R N/A }bits; }fifo_status_tu; // 18 RF_CAL3 39:0 9602A81000 - 补充射频寄存器 // (一般使用默认值) typedef struct { uint8_t value[5]; }rf_cal3_ts; // 19 DEMOD_CAL 39:0 8B7449DC01 // - 调制解调参数寄存器 // (可由方案需要来配置) typedef struct { uint8_t value[5]; }demo_cal1_ts; // 1A RF_CAL2 39:0 F608DDFECB // - 补充射频寄存器 // (一般使用默认值) typedef struct { uint8_t value[5]; }rf_cal2_ts; // 1B DEM_CAL2 31:0 0400E70B - 补充解调参数寄存器 // (一般使用默认值) typedef struct { uint8_t value[5]; }demo_cal2_ts; // 1C DYNPD - 00 - 动态 PAYLOAD 长度使能 typedef union { uint8_t value; struct { uint8_t DPL_P0 : 1;// 0 0 R/W 使能 PIPE 0 动态 PAYLOAD 长度(需要 EN_DPL 和 ENAA_P0) uint8_t DPL_P1 : 1;// 1 0 R/W 使能 PIPE 1 动态 PAYLOAD 长度(需要 EN_DPL 和 ENAA_P1) uint8_t DPL_P2 : 1;// 2 0 R/W 使能 PIPE 2 动态 PAYLOAD 长度(需要 EN_DPL 和 ENAA_P2) uint8_t DPL_P3 : 1;// 3 0 R/W 使能 PIPE 3 动态 PAYLOAD 长度(需要 EN_DPL 和 ENAA_P3) uint8_t DPL_P4 : 1;// 4 0 R/W 使能 PIPE 4 动态 PAYLOAD 长度(需要 EN_DPL 和 ENAA_P4) uint8_t DPL_P5 : 1;// 5 0 R/W 使能 PIPE 5 动态 PAYLOAD 长度(需要 EN_DPL 和 ENAA_P5) uint8_t Reserved : 2;// 7:6 00 R/W Only 00 allowed }bits; }dyn_payload_tu; // 1D FEATURE 7:0 00 R/W 特征寄存器 typedef union { uint8_t value; struct { uint8_t EN_NO_ACK : 1;// 0 0 R/W 使能W_TX_PAYLOAD_NOACK 命令 uint8_t EN_ACK_PAY : 1;// 1 0 R/W 使能 ACK 带 PAYLOAD uint8_t EN_DPL : 1;// 2 0 R/W 使能动态 PAYLOAD 长度 uint8_t DATA_LEN_SEL : 2;// 4:3 00 R/W 数据长度选择 // 11:64byte(512bit)模式 // 00:32byte(256bit)模式 uint8_t CE_SEL : 1;// 5 0 R/W 使能 CE 用命令方式开启 // 0:CE 由 CE PIN 控制 // 1:CE 由命令方式控制 uint8_t MUX_PA_IRQ : 1;// 6 0 R/W 选择 IRQ 信号输出还是 EN_PA 信号输出到 PIN // 0:IRQ 信号输出到 PIN // 1:EN_PA 信号输出到 PIN uint8_t Reserved : 1;// 7 0 R/W Only 00 allowed }bits; }feature_tu; // 1E RF_CAL 39:0 48DFFDFB10 R/W 射频参数寄存器 // (可由方案需要来配置) typedef struct { uint8_t value[5]; // struct // { // uint8_t HL_SEL : 1;// 0 0 R/W PLL 除 2 或除 3 设置 // // 0:除 2 // // 1:除 3 // uint8_t TST_TEMP : 1;// 1 0 R/W 温度敏感模块使能 // // 0:使能 // // 1:不使能 // uint8_t LS_SEL : 1;// 2 0 R/W 锁相环除 4 或除 6 输出设置 // // 1:除 6 // // 0:除 4 // uint8_t FC_0 : 1;// 3 0 R/W FC 最低位 // uint8_t HS_SEL : 1;// 4 1 R/W PLL 除 2 输出设置 // // HS_SEL LS_SEL=10:高频输出 // // HS_SEL LS_SEL=01:低频输出 // uint8_t HI_LO_SET : 1;// 5 0 R/W 接收高低本振设置 // // 1:高本振 // // 0:低本振 // uint8_t VCO_IB : 3;// 8:6 100 R/W 锁相环 VCO 电流设置 // // 111:高电流 // // 000:低电流 // uint8_t PA1_BC : 2;// 10:9 01 R/W 发射驱动级 PA 电流设置 // // 11:高电流 // // 00:低电流 // uint8_t PA1_LVL : 6;// 16:11 111111 R/W 发射驱动级 PA 输出幅度设置 // // 111111:最大幅度输出 // // 000000:最小幅度输出 // uint8_t PA2_BC : 2;// 18:17 10 R/W 发射输出级 PA 电流设置 // // 11:高电流 // // 00:低电流 // uint8_t PA2_LVL : 6;// 24:19 111111 R/W 发射输出级 PA 输出幅度设置 // // 11111:最大幅度输出 // // 00000:最小幅度输出 // uint8_t LNA_GC : 2;// 26:25 11 R/W LNA 增益选择 // // 11:最大增益 // // 00:最小增益 // uint8_t LNA_BC : 2;// 28:27 11 R/W LNA 电流设置 // // 11:高电流 // // 00:低电流 // uint8_t LO_PH_BC : 1;// 29 0 R/W LO 驱动器电流选择 // // 1:低电流 // // 0:高电流 // uint8_t MIXL_GC_CTR : 1;// 30 1 R/W MIX 增益设置 // // 1:高增益 // // 0:低增益 // uint8_t CTL_BW : 3;// 33:31 001 R/W 滤波器带宽控制: // // 40kbps:000; // // 80kbps:001; // // 200kbps:011; // // 400kbps:111; // uint8_t GC_BUF : 2;// 35:34 10 R/W 滤波器模块 3 增益设置 // // 10:高增益 // // 01:低增益 // uint8_t PD_RSSI : 1;// 36 0 R/W RSSI 功能使能 // // 1:使能 // // 0:不使能 // uint8_t RSSI_RES : 2;// 38:37 10 R/W RSSI 的信号增益选择位 // // 00:最小增益 // // 11:最大增益 // uint8_t RESERVED : 1;// 39 1 R/W N/A // }bits; }rf_cal1_ts; // 1F BB_CAL 39:0 041F671C09 R/W 数字基带参数寄存器 // (一般使用默认值) typedef struct { uint8_t value[5]; // struct // { // uint8_t RX_ACK_TIME : 6;// 5:0 001001 R/W PTX 转为接收模式后等待 ACK 的最长 // // 时间,超出该时间则认为本次传输失败: // // 400Kbps 模式下的时间计算: // // RX_ACK_TIME×40+37us,默认 397us, // // 37us~2557us // // 200Kbps 模式下的时间计算: // // RX_ACK_TIME×80+77us,默认 797us, // // 77us~5117us // // 80Kbps 模式下的时间计算: // // RX_ACK_TIME×160+157,默认 1597us, // // 157us~10237us // // 40Kbps 模式下的时间计算: // // RX_ACK_TIME×320+317,默认 3197us, // // 317us~20477us // uint8_t RX_SETUP_TIME : 5;// 10:6 10000 R/W RX 射频通路锁相环稳定时间,时间长度 // // 计算: // // RX_SETUP_TIME×20,单位为 us,默认 // // 320us,0us~620us // uint8_t TX_SETUP_TIME : 5;// 15:11 00011 R/W 发射 PA 使能到锁相环开环的时间间隔, // // 时间长度计算: // // TX_SETUP_TIME×20,单位为 us,默认 // // 60us,0us~620us // uint8_t EX_PA_TIME : 5;// 20:16 00111 R/W 发射锁相环使能到 PA 使能的时间间隔, // // 时间长度计算: // // EX_PA_TIMEx20,单位为 us // // 默认 140us,0us~620us // uint8_t TRX_TIME : 3;// 23:21 011 R/W 锁相环开环到开始发射数据的时间间隔,时间长度计算: // // TRX_TIMEx10+2.5,单位 us // // 默认 32.5us, 2.5us~72.5us // uint8_t DAC_BASAL : 6;// 29:24 011111 R/W 预发送阶段的 DAC 数据输入的初始值 // uint8_t Reserved : 1;// 30 0 R/W N/A // uint8_t INVERTER : 1;// 31 0 R/W 进入 RX_block 前是否取反 RX 通路数据 // // 1:取反 // // 0:保持不变 // uint8_t ldo_src : 1;// 32 0 R/W 1 :STB2 状态下 LDO_EN 控制线屏蔽LDO 操作; // // 0 :STB2 状态下 LDO_EN 控制线 LDO // // 特性受状态机操. // uint8_t CE_JUST_TIME : 7;// 39:33 0000010 R/W 默认 10us,fast_ mode 下如果不想修改PRX 的 pth , // // 可 适 当 加 大 PTX 的 // // CE_JUST_ TIME // // 时间长度计算: // // CE_JUST_TIME x 5,单位 us // // 最小值:0us // // 最大值:635us // }bits; }rf_bb_cal_ts; #endif /****************************************end of file********************************************/