1

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

 8 months ago
source link: https://www.cnblogs.com/milton/p/17927253.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

这个话题貌似和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

650273-20231226002151581-970269875.png

这里有一个坑: 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 configXL2400_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_UPXL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, 0x02);LL_mDelay(2);// Set EN_PM, POWER_UPXL2400_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 resetXL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_ANALOG_CFG0, 0x06);// AFC onXL2400_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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK