经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Arduino » 查看文章
普冉PY32系列(十四) 从XL2400迁移到XL2400P
来源:cnblogs  作者:Milton  时间:2023/12/26 9:49:48  对本文有异议

目录

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

这里有一个坑: 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

  1. // 拉低
  2. XL2400_ReadToBuf(XL2400_CMD_R_REGISTER | XL2400_REG_CFG_TOP, cbuf, 2);
  3. *(cbuf + 1) &= 0xBF;
  4. XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, cbuf, 2);
  5. // 拉高
  6. XL2400_ReadToBuf(XL2400_CMD_R_REGISTER | XL2400_REG_CFG_TOP, cbuf, 2);
  7. *(cbuf + 1) |= 0x40;
  8. XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, cbuf, 2);

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

  1. // 拉低
  2. XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, 0xEE);
  3. // 拉高
  4. XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, 0xEF);

初始化

XL2400

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

XL2400P

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

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

设置频点

XL2400

  1. if (channel > 80) channel = 80;
  2. // AFC reset
  3. XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_ANALOG_CFG0, 0x06);
  4. // AFC on
  5. XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_ANALOG_CFG0, 0x0E);
  6. // Frequency(MHz) 2400:0x960 -> 2480:0x9B0
  7. *(cbuf + 0) = 0x60 + channel;
  8. *(cbuf + 1) = 0x09;
  9. XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_RF_CH, cbuf, 2);
  10. // AFC Locked
  11. *(cbuf + 1) |= 0x20;
  12. XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_RF_CH, cbuf, 2);

XL2400P

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

设置功率

XL2400

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

XL2400P

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

休眠

XL2400

  1. XL2400_CE_Low();
  2. XL2400_ClearStatus();
  3. *(xbuf + 0) = 0x7C;
  4. *(xbuf + 1) = 0x82;
  5. *(xbuf + 2) = 0x03;
  6. XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, xbuf, 3);

XL2400P

  1. XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, 0x00);

切换收发模式

XL2400

  1. // 切换发送模式
  2. XL2400_CE_Low();
  3. XL2400_ClearStatus();
  4. XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, 0x7E);
  5. XL2400_RxCalibrate();
  6. LL_mDelay(1);
  7. // 切换接收模式
  8. XL2400_CE_Low();
  9. XL2400_ClearStatus();
  10. XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, 0x7F);
  11. XL2400_CE_High();
  12. LL_mDelay(1);

XL2400P

  1. // 切换发送模式
  2. cbuf[0] = 0xee;
  3. cbuf[1] = 0x80;
  4. XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, cbuf, 2);
  5. XL2400_ClearStatus();
  6. LL_mDelay(1);
  7. // 切换接收模式
  8. cbuf[0] = 0xee;
  9. cbuf[1] = 0xc0;
  10. XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, cbuf, 2);
  11. XL2400_ClearStatus();
  12. XL2400_CE_High();
  13. LL_mDelay(1);

其它问题

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

原文链接:https://www.cnblogs.com/milton/p/17927253.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号