码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 普冉PY32系列(十四) 从XL2400迁移到XL2400P


    目录

    • 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介
    • 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境
    • 普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单
    • 普冉PY32系列(四) PY32F002A/003/030的时钟设置
    • 普冉PY32系列(五) 使用JLink RTT代替串口输出日志
    • 普冉PY32系列(六) 通过I2C接口驱动PCF8574扩展的1602LCD
    • 普冉PY32系列(七) SOP8,SOP10,SOP16封装的PY32F002A/PY32F003管脚复用
    • 普冉PY32系列(八) GPIO模拟和硬件SPI方式驱动无线收发芯片XN297LBW
    • 普冉PY32系列(九) GPIO模拟和硬件SPI方式驱动无线收发芯片XL2400
    • 普冉PY32系列(十) 基于PY32F002A的6+1通道遥控小车I - 综述篇
    • 普冉PY32系列(十一) 基于PY32F002A的6+1通道遥控小车II - 控制篇
    • 普冉PY32系列(十二) 基于PY32F002A的6+1通道遥控小车III - 驱动篇
    • 普冉PY32系列(十三) SPI驱动WS2812全彩LED
    • 普冉PY32系列(十四) 从XL2400迁移到XL2400P

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

    • https://www.xinlinggo.com/
      芯岭的网站, 资料下载页上的 XL2400P规格书V1.0a.pdf, 以及XL240X应用说明v2.1a.pdf
    • https://pan.baidu.com/s/1GJoXbWn9oOyeqGn6Igg5DA?pwd=6688
      百度盘的链接在资料下载页上有, 链接如果变了可以去资料下载页上找, 现在还是能访问的. 百度盘里的资料比较丰富.

    这里有一个坑: 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_XL2400P或USE_XL2400就能实现对两个型号的切换.

    • GPIO模拟SPI驱动: https://github.com/IOsetting/py32f0-template/blob/main/Examples/PY32F0xx/LL/GPIO/XL2400_Wireless/xl2400.c
    • 硬件SPI驱动: https://github.com/IOsetting/py32f0-template/blob/main/Examples/PY32F0xx/LL/SPI/XL2400_Wireless/xl2400.c

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

    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

  • 相关阅读:
    【回溯】组合
    实战PyQt5: 150-QChart图表之如何使用图例标记
    10.10c++作业
    win10 --docker
    100天精通Andriod逆向——第2天:Android基础知识和jadx的使用
    机器学习经验
    uniapp map polygons 区域填充色(fillColor)在ios显示正常,但在安卓手机显示是黑色的,怎么解决?
    如何使用IDE端通义灵码
    从 Google 离职,前Go 语言负责人跳槽小公司
    【操作系统和进程】深入理解计算机内部运行的基本原理
  • 原文地址:https://www.cnblogs.com/milton/p/17927253.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号