普冉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
普冉PY32系列(十四) 从XL2400迁移到XL2400P的更多相关文章
- 普冉PY32系列(四) PY32F002/003/030的时钟设置
目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...
- 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介
目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 PY32F0系列上市其实相 ...
- 普冉PY32系列(五) 使用JLink RTT代替串口输出日志
目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...
- 普冉PY32系列(六) 通过I2C接口驱动PCF8574扩展的1602LCD
目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...
- 普冉PY32系列(七) SOP8, SOP10和SOP16封装的PY32F003/PY32F002A管脚复用
目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...
- 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境
目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 以下介绍PY32F0系列在 ...
- 普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单
目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...
- struts2官方 中文教程 系列十四:主题Theme
介绍 当您使用一个Struts 2标签时,例如 <s:select ..../> 在您的web页面中,Struts 2框架会生成HTML,它会显示外观并控制select控件的布局.样式和 ...
- FreeSql (三十四)CodeFirst 迁移说明
FreeSql 支持 CodeFirst 迁移结构至数据库,这应该是(O/RM)必须标配的一个功能. 与其他(O/RM)不同FreeSql支持更多的数据库特性,而不只是支持基础的数据类型,这既是优点也 ...
- 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
随机推荐
- K8s 多集群实践思考和探索
作者:vivo 互联网容器团队 - Zhang Rong 本文主要讲述了一些对于K8s多集群管理的思考,包括为什么需要多集群.多集群的优势以及现有的一些基于Kubernetes衍生出的多集群管理架构实 ...
- 杰哥教你面试之一百问系列:java集合
目录 1. 什么是Java集合?请简要介绍一下集合框架. 2. Java集合框架主要分为哪几种类型? 3. 什么是迭代器(Iterator)?它的作用是什么? 4. ArrayList和LinkedL ...
- KRPano动态热点专用素材图50多个,加动态热点使用方法
KRPano动态热点专用素材是一种特定形式的序列图,该序列图要求帧的水平和垂直的具体位置必须准确,否则图的动作将会出现错乱,KRPano不支持动态图.目前网上比较匮乏动态热点素材,在此亲手整理制作了5 ...
- lvm格式化挂载分区
1.从物理磁盘创建lvm分区 物理磁盘 /dev/sdb 20G 2.使用fdisk工具创建lvm分区 3.修改默认的分区类型 4.查看新建的分区 5.创建物理卷pv 6.创建逻辑卷组vg,并查看详情 ...
- 解决软件安装无法自定义文件夹,自动安装在C盘 (Windows系统)
其实就是软链接的简单应用 1.软件已经自动安装 2.完全退出当前软件 3.通过软件图标的属性找到其实际的安装目录 4.进入该软件的安装目录 5.将该软件整个剪切(你没有看错)到指定文件夹(自定义的安装 ...
- MySQL系列之——MySQL体系结构、基础管理(用户、权限管理、连接管理、多种启动方式介绍、初始化配置、多实例的应用)
文章目录 一 体系结构 1.1 C/S(客户端/服务端)模型介绍 1.2 实例介绍 1.3 mysqld程序运行原理 1.3.1 mysqld程序结构 1.3.2 一条SQL语句的执行过程 1.3.2 ...
- 入门篇-其之五-Java运算符(上)
一元运算符之正负号 Java支持多种一元运算符,一元运算符中的"一元"是指一个操作数.我们初中学过的正负号就属于一元运算符,因为正负号后面只有一个数字. 正数使用+表示,其中+可以 ...
- Dotnet工具箱:开源、免费的纯前端工具网站,带你探索10大工具分类和73个实时在线小工具
1. 前言 大家好,我是沙漠尽头的狼. Dotnet工具箱是一个纯前端的.开源和免费的工具网站,周末我参考了开源项目it-tools,对网站界面文字进行了汉化,并重新部署了网站.该网站共有10大工具分 ...
- 【vulnhub】——DC-9靶机
[vulnhub]--DC-9靶机 1. 主机发现 扫描kali主机C段(Kali和DC-9主机在同一个网关下): 发现主机为192.168.108.146,进行详细端口扫描: 可以看到靶机开了一个s ...
- 【XXE漏洞】原理及实践演示
一.原理 XML是用于传输和存储数据的一种格式,相当于一种信息传输工具,其中包含了XML声明,DTD文档类型定义.文档元素. XXE是xml外部实体注入漏洞,发生在应用程序解析XML输入时,没有禁止外 ...