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

PAN211x汇编代码开发指南

1.概览

序号

当前页

寄存器操作

备注

1

0

寄存器0x00写0x00

切至第0页

2

0

(1)如果使用SPI_3LINE总线
a.寄存器0x04 写0x83
b.寄存器0x03 写0x02
(2)如果使用SPI_4LINE总线
a.寄存器0x04 写0x03
b.寄存器0x03 写0x03
(3)如果使用IIC总线
无需配置

初始化SPI或IIC接口

3

0

寄存器0x02写0x02

进入STB1模式

4

0

寄存器0x02写0x72

打开电源开关

5

0

延时200us以上

等待电源稳定

6

0

寄存器0x02写0x73

进入 STB2 模式

7

1

寄存器0x00写0x01

切第1页

9

1

持续读取寄存器 0x6F 的 bit7,直至其值为 1

等待外部晶振稳定

10

1

寄存器0x4C写0x68

关闭快速启振开关

11

1

寄存器0x02写0x74

进入STB3模式

12

1

批量写入gPN211Page1Table(请参考3.2章节)

第1页射频参数写入
注:由PAN211x_ES_TOOL生成

13

0

寄存器0x00写0x00

切至第0页

14

0

批量写入gPN211Page0Table(请参考3.2章节)

第0页射频参数写入
注:由PAN211x_ES_TOOL生成

15

1

寄存器0x00写0x01

切至第1页

16

1

寄存器0x1B[3]写1

触发VCO校正

17

1

持续读取寄存器 0x70 的 bit6,直至其值为 1

等待VCO校正完成

18

1

寄存器0x1B[4]写1

触发两点式校正

19

1

延时55ms

等待两点式校正完成

20

1

寄存器0x02写0x76

进入Rx模式

21

延时200us以上

等待Rx状态稳定

22

1

寄存器0x1B[5]写1

触发Offset校正

23

1

持续读取寄存器 0x7f 的 bit7,直至其值为 1

等待Offset校正完成

24

1

寄存器0x1B[6]写1

触发BW校正

25

1

持续读取寄存器 0x6d 的 bit7,直至其值为 1

等待BW校正完成

26

1

(1) 寄存器0x00 写0x00(切至page0)
(2) 读取寄存器0x36[5:4],记为bw_mode
(3) 寄存器0x00 写0x01(切至page1)
bw_mode为0
读取0x6b[6:0]记为bw_code
寄存器0x1e写入0x80 + bw_code + 6
bw_mode为1
读取0x6c[6:0]记为bw_code
寄存器0x1e写入0x80 + bw_code + 6
bw_mode为2
寄存器0x1e[7]写0

BW校正值手动修正

27

1

寄存器0x00写0x01

切至第1页

28

1

寄存器0x1B[7]写1

触发DCOC校正

29

1

持续读取寄存器 0x7f 的 bit7,直至其值为 1

等待DCOC校正完成

30

0

寄存器0x00写0x00

切至第0页

31

进入接收或者发送流程

请见第5章节

2.上电初始化流程

2.1.切至第0页

  • 寄存器0x00写0x00,寄存器0x00为特殊寄存器,直接进行单字节操作即可,不用关心页面问题

2.2.初始化总线接口

(1) 如果使用SPI_3LINE方式

  • 寄存器0x04(page0)写0x83

  • 寄存器0x03(page0)写0x02

(2) 如果使用SPI_4LINE方式

  • 寄存器0x04(page0)写0x03

  • 寄存器0x03(page0)写0x03

(3) 如果使用IIC方式

  • 无需配置

2.3.进入STB1模式

  • 寄存器0x02(page0)写0x02

2.4.打开电源开关

  • 寄存器0x02(page0)写0x72

2.5.延时200us

2.6.进入STB2模式

  • 寄存器0x02(page0)写0x73

2.7.切至第1页

  • 寄存器0x00(page0)写0x01

2.8.等待外部晶振稳定

  • 持续读取寄存器0x6F(page1)的 bit7,直至其值为1

2.9.关闭快速启振开关

  • 寄存器0x4C(page1)写0x68

2.10.进入STB3模式

  • 寄存器0x02写0x74,无需切页

说明:操作寄存器0x00~0x03时,不用关心页面问题,可以直接操作。

3.参数配置流程

3.1.生成配置参数

● 打开PAN211x代码生成工具,按以下图片提示生成配置参数gPN211Page1Table和gPN211Page0Table。

img

img

● 生成的配置参数说明

const uint8_t gPN211Page1Table[][2] = {
    {0x27, 0xCA}, // 配置tp_code_cover和code_offset
    {0x37, 0x15}, // 配置RXLNA_ICORE = 0b101
    {0x3A, 0x14}, // 配置RXFLTR_VCM = 0b100
    {0x3C, 0x15}, // 配置TXPA_DUTY
    {0x3D, 0x85}, // 配置FSYNVCO_FC_TUNE=0b01
    {0x3F, 0xD2}, // 配置RFMTCHNTWK_C2VAL_TX=0
    {0x40, 0x20}, // 配置LDO_TRIM
    {0x41, 0xA2}, // 配置TX_DAC_ISEL=0b10
    {0x42, 0xA8}, // 
    {0x43, 0x11}, // 
    {0x48, 0xA6}, // 
    {0x4C, 0x48}, // 配置TX_DAC_BW=0
};
const uint8_t gPN211Page0Table[][2] = {
    {0x05, 0xC8}, // 配置LP_TRIM和VBG_TRIM
    {0x07, 0x89}, // 配置CRC/ChipMode/Enhance/Scr/TxNoack/Endian
    {0x08, 0xA3}, // 打开128bytes Fifo开关
    {0x09, 0x20}, // 配置rx_payload_length
    {0x0A, 0x20}, // 配置tx_payload_length
    {0x0F, 0x55}, // 配置rx address
    {0x10, 0x44}, // 配置rx address
    {0x11, 0x33}, // 配置rx address
    {0x12, 0x22}, // 配置rx address
    {0x13, 0x11}, // 配置rx address
    {0x14, 0x55}, // 配置tx address
    {0x15, 0x44}, // 配置tx address
    {0x16, 0x33}, // 配置tx address
    {0x17, 0x22}, // 配置tx address
    {0x18, 0x11}, // 配置tx address
    {0x2A, 0x41}, // 配置tx&rx模式:Single/Continuous
    {0x2B, 0x00}, // 配置rx_timeout(rx Single生效,其余情况不可配置)
    {0x2C, 0x00}, // 配置rx_timeout(rx Single生效,其余情况不可配置)
    {0x39, 0x02}, // 配置频点为2402
    {0x43, 0x3A}, // 打开ADC_CLK
    {0x44, 0x8C}, // Ramp 电压的I*R的I控制
    {0x5A, 0x09}, // 配置rssi修正值
    {0x5B, 0xF6}, // 配置rssi修正值
    {0x5C, 0xE2}, // 配置rssi修正值
    {0x66, 0x34}, // 配置lp的TX状态机从TX_ANA_ON到TX_PA_ON等待时间选择
    {0x68, 0x0D}, // 配置lp的RX状态机从RFPLL_ON到RX_ANA_ON等待时间选择
    {0x6E, 0x20}, // 配置EN_PA拉低的延时
};

3.2.刷写配置参数

按照以下代码形式将,gPN211Page1Table和gPN211Page0Table的配置参数依次刷写相关配置寄存器,汇编代码请根据以下C代码流程进行转换。

PAN211_WriteReg(0x00, 0x01); /* switch to page1 */
/* Write preconfigured registers on Page 1 */
for (int i = 0; i < (sizeof(gPN211Page1Table)/2); i++)
{
	PAN211_WriteReg(gPN211Page1Table[i][0], gPN211Page1Table[i][1]);
}
PAN211_WriteReg(0x00, 0x00);/* switch to page0 */
/* Write preconfigured registers on Page 0*/
for (int i = 0; i < (sizeof(gPN211Page0Table)/2); i++)
{
	PAN211_WriteReg(gPN211Page0Table[i][0], gPN211Page0Table[i][1]);
}

注:PAN211_WriteReg按照spi/iic单字节寄存器写时序进行操作

4.RF校正流程

4.1.切至第1页

  • 寄存器0x00写0x01

4.2.VCO校正

  • 寄存器0x1B[3](page1)写1 // 将fsm_vco_cal(0x1B-bit3)置1,触发VCO校正

  • 等待寄存器0x70[6](page1)变为1,VCO校正完成

4.3.两点式校正

  • 寄存器0x1B[4](page1)写1 // 将fsm_2p_cal(0x1B-bit4)置1,触发两点式校正

  • 延时55ms,两点式校正完成

4.4.BW&DCOC校正

(1) 进入RX状态

  • 寄存器0x02(page1)写0x76

  • 延时200us,等待接收状态稳定

(2) Offset校正

  • 寄存器0x1B[5](page1)写1 // 将fsm_ofst_cal(0x1B-bit5)置1,触发Offset校正

  • 等待寄存器0x7f[7](page1)变为1,Offset校正完成

(3) BW校正

  • 寄存器0x1B[6](page1)写1 // 将fsm_ofst_cal(0x1B-bit6)置1,触发BW校正

  • 等待寄存器0x6D[7](page1)变为1,BW校正完成

  • 寄存器0x00写0x00,切至page0

  • 读取寄存器0x36[5:4](page0),记为bw_mode

  • 寄存器0x00写0x01,切至page1

​ 若bw_mode为0

​ ○ 读取0x6b[6:0](page1)bw_code

​ ○ 寄存器0x1e(page1)写入0x80 + bw_code + 6

​ 若bw_mode为1

​ ○ 读取0x6c[6:0](page1)bw_code

​ ○ 寄存器0x1e(page1)写入0x80 + bw_code + 6

​ 若bw_mode为2

​ ○ 寄存器0x1e[7](page1)写0

(4) DCOC校正

  • 寄存器0x1B[7](page1)写1 // 将fsm_dcoc_cal(0x1B-bit7)置1,触发DCOC校正

  • 等待寄存器0x7f[7]变为1,DCOC校正完成

4.5.切至第0页

  • 寄存器0x00 写0x00,用户操作寄存器一般都处于page0,所以校正完成后切换至page0

5.数据收/发流程

5.1.使能中断复用

​ (1) 如果使用SPI_3LINE方式

  • 寄存器0x06(page0)写0x05 // LP_CFG[BIT3]置0,禁用IIC复用中断

  • 寄存器0x03(page0)写0x06 // SYS_CFG[BIT2]置1,使能SPI-3LINE复用中断

​ (2) 如果使用SPI_4LINE方式,可使用独立的IRQ中断引脚,无需配置

​ (3) 如果使用IIC方式

  • 寄存器0x06(page0)写0x0D // LP_CFG[BIT3]置1,使能IIC复用中断

  • 寄存器0x03(page0)写0x03 // SYS_CFG[BIT2]置0,禁用SPI-3LINE复用中断

5.2.清所有中断

  • 寄存器0x73 (page0)写0xFF // 对各个中断位写1时清零

5.3.发送流程

​ (1) 寄存器0x0A (page0)写入要发送数据的长度,如果是固定包长,只需要在初始化时写一次即可

​ (2) FIFO寄存器0x01 (page0)写入要发送的数据,请参考“PAN211_Err_t PAN211_WriteFifo(uint8_t addr, uint8_t *buffer, uint8_t size)”函数的写法

​ (3) 开始发送命令

  • 寄存器0x02(page0)写入0x74;// standby 命令

  • 寄存器0x02(page0)写入0x75;// 开始 tx 命令

​ (4) 等待MOSI(SDA)引脚变低

​ (5) 等待中断寄存器0x73[7](page0)置1,表示数据发送成功

​ (6) 寄存器0x73写0x80清除发送中断事件

​ (7) 如果发送下一包重新回到步骤(1)开始下一个循环

5.4.接收流程(接着上面步骤2)

​ (1) 寄存器0x09(page0)写入要发送数据的长度,如果是普通模式(固定包长),只需要在初始化时写一次即可

​ (2) 开始接收命令

  • 寄存器0x02(page0)写入0x74;// standby 命令

  • 寄存器0x02(page0)写入0x76;// 开始 rx 命令

​ (3) 等待MOSI(SDA)引脚变低

​ (4) 等待中断寄存器0x73[1](page0)置1,表示接收数据成功

​ (5) 读取接收到的数据:

  • 如果是普通模式(固定包长模式),数据长度由步骤(1)设置的接收长度来定

  • 如果是增强型模式(可变包长模式),收到的数据长度需先从寄存器0x77(page0)中读取

  • 根据数据长度从FIFO寄存器0x01 (page0)读出收到数据

​ (6) 寄存器0x73写0x01清除接收中断事件

​ (7) 如果接收下一包重新回到步骤(1)开始下一个循环

5.5.周期性发送和休眠唤醒流程(接着上面步骤2)

​ (1) 寄存器0x0A (page0)写入要发送数据的长度,如果是固定包长,只需要在初始化时写一次即可

​ (2) FIFO寄存器0x01 (page0)写入要发送的数据,请参考“PAN211_Err_t PAN211_WriteFifo(uint8_t addr, uint8_t *buffer, uint8_t size)”函数的写法

​ (3) 开始发送命令

  • 寄存器0x02(page0)写入0x74;// 进入STB3状态

  • 寄存器0x02(page0)写入0x75;// 开始TX命令

​ (4) 等待MOSI(SDA)引脚变低

​ (5) 等待中断寄存器0x73[7](page0)置1,表示数据发送成功

​ (6) 寄存器0x73写0x80清除发送中断事件

​ (7) 寄存器0x02写0x74,PAN211x进入STB3状态

​ (8) 寄存器0x02写0x21,PAN211x进入SLEEP状态

​ (9) 根据应用场景进行延时(ms级别,一般大于100ms)

​ (10) 寄存器0x02写0x22,PAN211x退出SLEEP状态进入STB1状态

​ (11) 寄存器0x02写0x74,PAN211x进入STB3状态

​ (12) 延迟200us以上,等待晶振稳定

​ (13) 如果发送下一包重新回到步骤(1)开始下一个循环