目录

这个话题貌似和PY32没什么关系, 只是我用到XL2400以及现在改成XL2400P都是在PY32F002A的板子上, 代码是基于PY32F0xx的, 所以也就放到这个系列里. 对应的XL2400库文件是通用的, 要迁移到其它的MCU也非常容易.

上次购买XL2400是在10月份, 那时候还是XL2400, 但是最近这个型号已经被XL2400P代替了, 再买收到的就是XL2400P. XL2400去年7月的价格是0.9, 今年10月的价格是0.7, 现在换成XL2400P之后, 价格又降到了0.65, 几乎算是现在市面上价格最低的一款2.4GHz无线收发芯片了.

这两个型号的差异不小, 在迁移到 XL2400P 的过程中遇到了一些坑, 因此把这些坑记录一下, 避免后面使用的人浪费时间.

XL2400P

普冉PY32系列(十四) 从XL2400迁移到XL2400P-LMLPHP

这里有一个坑: XL2400P规格书V1.0a.pdf 上面的寄存器表格是错的, 这个表格是XL2400的寄存器设置, 不是XL2400P的.

那么哪里能找到XL2400P的寄存器说明呢? 在百度盘里找这个文件 XL2409 package v1.03.zip, 解开后, 在 XLtool 目录下有 XL2400P_Register Map_V1.1.xlsx, 这个才是 XL2400P 正确的寄存器说明.

XL2400P 对比 XL2400

首先说相同点

  • 封装相同, PIN脚布局相同, PIN脚定义相同, 电路相同, 因此硬件上是兼容的, 电路不用改
  • 频点, 调制方式和地址机制都相同, TX频点都比RX频点要高1MHz. 因此这两个型号之间可以互相通信, 如果你用的是 250Kbps 和 1Mbps, 可以无缝过渡

再说有差异的地方

  • 寄存器不一样, 一些常用的寄存器改动还挺大
  • XL2400P 上电后并不进入工作状态
  • XL2400P 取消了125Kbps速率, 可用频点数量比XL2400多

驱动代码上的差异

PY32F0模板库里的XL2400驱动已经更新, 通过宏判断实现对两个型号的兼容, 使用时, 修改头文件中的#define USE_XL2400P, 改为USE_XL2400PUSE_XL2400就能实现对两个型号的切换.

在上面的源码中能直接看到差异, 具体有以下几处

CE高低切换

XL2400

// 拉低
XL2400_ReadToBuf(XL2400_CMD_R_REGISTER | XL2400_REG_CFG_TOP, cbuf, 2);
*(cbuf + 1) &= 0xBF;
XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, cbuf, 2);
// 拉高
XL2400_ReadToBuf(XL2400_CMD_R_REGISTER | XL2400_REG_CFG_TOP, cbuf, 2);
*(cbuf + 1) |= 0x40;
XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, cbuf, 2);

XL2400P, 在 XL2400P 中控制CE的是寄存器的第一个字节的第一位, 最多只需要读写一个字节

// 拉低
XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, 0xEE);
// 拉高
XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, 0xEF);

初始化

XL2400

// Analog config
XL2400_ReadToBuf(XL2400_CMD_R_REGISTER | XL2400_REG_ANALOG_CFG0, xbuf, 13);
*(xbuf + 4) &= ~0x04;
*(xbuf + 12) |= 0x40;
XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_ANALOG_CFG0, xbuf, 13);
// Switch to software CE control, wake up RF
*(xbuf + 0) = 0x7E;
*(xbuf + 1) = 0x82;
*(xbuf + 2) = 0x0B;
XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, xbuf, 3);
XL2400_CE_Low();
XL2400_ClearStatus();

XL2400P

// Reset EN_PM, POWER_UP
XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, 0x02);
LL_mDelay(2);
// Set EN_PM, POWER_UP
XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, 0x3E);
LL_mDelay(2);
XL2400_ReadToBuf(XL2400_CMD_R_REGISTER | XL2400_REG_ANALOG_CFG3, xbuf, 6);
xbuf[5] = (xbuf[5] | 0x6d);
XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_ANALOG_CFG3, xbuf, 6);

需要注意的是, 在XL2400P上如果未初始化, 地址寄存器只读, 要初始化(POWER_UP)后才可以写入地址, 因此库文件中的 XL2400_SPI_Test() 方法要加上初始化的步骤

设置频点

XL2400

if (channel > 80) channel = 80;
// AFC reset
XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_ANALOG_CFG0, 0x06);
// AFC on
XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_ANALOG_CFG0, 0x0E);
// Frequency(MHz) 2400:0x960 -> 2480:0x9B0
*(cbuf + 0) = 0x60 + channel;
*(cbuf + 1) = 0x09;
XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_RF_CH, cbuf, 2);
// AFC Locked
*(cbuf + 1) |= 0x20;
XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_RF_CH, cbuf, 2);

XL2400P

if (channel > 80) channel = 80;
*cbuf = XL2400_ReadReg(XL2400_CMD_R_REGISTER | XL2400_REG_EN_AA);
XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_EN_AA, *cbuf & ~0x40);
XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_RF_CH, 0x60 + channel);
XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_EN_AA, *cbuf | 0x40);

设置功率

XL2400

XL2400_ReadToBuf(XL2400_CMD_R_REGISTER | XL2400_REG_RF_CH, xbuf, 3);
*(xbuf + 2) = power;
XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_RF_CH, xbuf, 3);

XL2400P

XL2400_ReadToBuf(XL2400_CMD_R_REGISTER | XL2400_REG_RF_SETUP, xbuf, 2);
*(xbuf + 1) = power;
XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_RF_SETUP, xbuf, 2);

休眠

XL2400

XL2400_CE_Low();
XL2400_ClearStatus();

*(xbuf + 0) = 0x7C;
*(xbuf + 1) = 0x82;
*(xbuf + 2) = 0x03;
XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, xbuf, 3);

XL2400P

XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, 0x00);

切换收发模式

XL2400

// 切换发送模式
XL2400_CE_Low();
XL2400_ClearStatus();
XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, 0x7E);
XL2400_RxCalibrate();
LL_mDelay(1);

// 切换接收模式
XL2400_CE_Low();
XL2400_ClearStatus();
XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, 0x7F);
XL2400_CE_High();
LL_mDelay(1);

XL2400P

// 切换发送模式
cbuf[0] = 0xee;
cbuf[1] = 0x80;
XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, cbuf, 2);
XL2400_ClearStatus();
LL_mDelay(1);

// 切换接收模式
cbuf[0] = 0xee;
cbuf[1] = 0xc0;
XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, cbuf, 2);
XL2400_ClearStatus();
XL2400_CE_High();
LL_mDelay(1);

其它问题

关于通信速率, XL2400P实际上 125Kbps 也能通信, 但是手册上并没有将这个速率列入, 从实际测试上看, 125Kbps 和 2Mbps 的通信效果都不太好, 在开启ACK时, 很容易出现错误的重发, 因此在实际使用中, 建议只使用 250Kbps 和 1Mbps, 或者不要开 ACK

12-26 08:08