PAN211x汇编代码开发指南¶
1.概览¶
序号 |
当前页 |
寄存器操作 |
备注 |
---|---|---|---|
1 |
0 |
寄存器0x00写0x00 |
切至第0页 |
2 |
0 |
(1)如果使用SPI_3LINE总线 |
初始化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页射频参数写入 |
13 |
0 |
寄存器0x00写0x00 |
切至第0页 |
14 |
0 |
批量写入gPN211Page0Table(请参考3.2章节) |
第0页射频参数写入 |
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) |
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
3.参数配置流程¶
3.1.生成配置参数¶
● 打开PAN211x代码生成工具,按以下图片提示生成配置参数gPN211Page1Table和gPN211Page0Table。
● 生成的配置参数说明
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)开始下一个循环