普冉PY32系列(九) GPIO模拟和硬件SPI方式驱动无线收发芯片XL2400

news2025/1/28 1:18:44

目录

  • 普冉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

XL2400

前面介绍了 XN297LBW, 顺带再介绍一个非常类似的型号 XL2400, 生产商是深圳芯岭技术, 同时市面上还有一个 WL2400, 从数据手册看和 XL2400 是一模一样的. XL2400 和XN297LBW 一样都是 SOP8 封装的2.4GHz频段无线收发芯片, 但是零售价格更便宜, 在0.7元左右. 寄存器设置也存在大量 NRF24L01 的痕迹, 但是有一些区别.

产品页地址: http://www.xinlinggo.com/pd.jsp?id=1

芯岭对 XL2400 的介绍: “XL2400 系列芯片是工作在 2.400~2.483GHz 世界通用 ISM 频段的单片无线收发芯片. 该芯片集成射频收发机、频率收生器、晶体振荡器、调制解调器等功能模块, 并且支持一对多组网和带 ACK 的通信模式. 发射输出功率、工作频道以及通信数据率均可配置. 芯片已将多颗外围贴片阻容感器件集成到芯片内部. 容易过 FCC 等认证.”

XL2400 主要特性

  • 无线
    • 通信频段:2.400GHz~2.483GHz
    • 数据速率:2Mbps,1Mbps,250Kbps,125Kbps
    • 调制方式:GFSK
  • 发射器
    • 输出功率:最高8dBm
  • 接收器
    • -90dBm@2Mbps
    • -92dBm@1Mbps
    • -95dBm@250Kbps
    • -96.5dBm@125Kbps
  • 协议引擎
    • 支持最大数据长度为 128 字节(4 级 FIFO)
    • 支持一对多组网和带 ACK 的通信模式
  • 电源管理
    • 工作电压:1.7V~3.6V
    • 发射模式(0dBm)工作电流 13.7mA
    • 接收模式工作电流 12.3mA
    • 休眠电流 2uA
  • 主机接口
    • 支持3引脚SPI, SPI接口速率最高支持 4Mbps
  • 封装
    • SOP8
    • 1M/2Mbps模式需要晶振精度 ±40ppm&C L =12pF
    • 125K/250kbps模式需要晶振精度 ±20ppm&C L =12pF
    • BLE 广播包模式需要晶振精度 ±10ppm&C L =12pF
    • 工作温度支持-40~+125℃

与XN297L相比

  1. 发射功率低2个dbm, 但是支持125Kbps速率, 有更高的灵敏度. 因为存在虚标的可能性, 需要在实际使用中验证
  2. 4级FIFO, 最大数据长度128字节, 支持更大的单组数据
  3. 支持BLE, 因为手册和SDK都未涉及这部分, 暂无法验证

PIN脚定义和应用电路

PIN脚定义和应用电路

XL2400 的PIN脚定义和 XN297LBW 是完全一样的

  • VDD 和 VSS 分别接 VCC 和 GND
  • XC1 和 XC2 接晶振
  • ANT 接天线
  • 用于MCU接口通信的只有 CSN, SCK 和 DATA 这三个PIN

推荐电路与XN297LBW相比更简单. 实际上外围电路只需要一个16MHz晶振.

模块实物

嘉立创打样的测试模块 (项目地址 https://oshwhub.com/iosetting/xn297lbw-xl2400-evb)

因为电路与XN297LBW相似, 所以PCB通用, 只是焊接的元件有区别

如果只是做验证, 可以用SOP8转接板加焊一个16MHz晶振和一截 5~10cm 漆包线作为天线.

使用 PY32F0 驱动 XL2400

XN297L最新的SDK可以从芯岭网站下载 下载地址 或者从百度网盘下载 下载地址. SDK中的例子使用GPIO模拟SPI方式进行驱动. 但是实际上也可以通过硬件SPI方式进行驱动.

硬件准备

  • XL2400 模块
  • PY32F002A/PY32F003/PY32F030 系列MCU的开发板, 建议在验证阶段使用 20PIN 及以上封装的型号, 避免PIN脚复用引起的干扰. 跑通后再迁移到低PIN型号
  • USB2TTL模块, 用于观察输出
  • 以上硬件需要两套, 测试中分别用于接收和发送

下面以PY32F002A为例. 代码不需调整可以直接运行于 PY32F003x 和 PY32F030x 系列的其它型号. 因为 XL2400 和 XN297LBW 的示例代码几乎是一模一样, 就不仔细介绍了, 大部分代码可以参考前面的 XN297LBW 的代码说明, 只介绍有区别的地方.

GPIO模拟方式

接线

接线和XN297LBW一样, 注意电源使用3.3V

PY32          XL2400 SOP8
PA1   ------> CLK/SCK
PA6   ------> CSN/NSS
PA7   ------> DATA/MOSI

              USB2TTL
PA2(TX) ----> RX
PA3(RX) ----> TX

代码说明

XL2400 的初始化. 这部分与XN297LBW是有区别的. XL2400 的寄存器中存在大量多字节的设置项, 设置时会需要先读取再写入

void XL2400_Init(void)
{
    // 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
    XL2400_WakeUp();
    // Enable Auto ACK on all pipes
    XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_EN_AA, 0x3F);
    // Enable all pipes
    XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_EN_RXADDR, 0x3F);
    // Address Width, 5 bytes
    XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_SETUP_AW, 0xAF);
    // Retries and interval
    XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_SETUP_RETR, 0x33);
    // RF Data Rate 1Mbps
    XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_RF_SETUP, 0x22);
    // Number of bytes in RX payload, pipe 0 and pipe 1
    *(cbuf + 0) = XL2400_PLOAD_WIDTH;
    *(cbuf + 1) = XL2400_PLOAD_WIDTH;
    XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_RX_PW_PX, cbuf, 2);
    // Dynamic payload width: off
    XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_DYNPD, 0x00);
    // Other features
    //bit7&6=00 return status when send register address
    //bit5=0 long data pack off
    //bit4=1 FEC off
    //bit3=1 FEATURE on
    //bit2=0 Dynamic length off
    //bit1=0 ACK without payload
    //bit0=0 W_TX_PAYLOAD_NOACK off
    XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_FEATURE, 0x18);
    // Enable RSSI
    *(cbuf + 0) = 0x10;
    *(cbuf + 1) = 0x00;
    XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_RSSI, cbuf, 2);
}

设置通信频道

void XL2400_SetChannel(uint8_t channel)
{
    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);
}

XL2400 的发送和接收函数和 XN297LBW 通用

完整代码

XL2400 示例代码的 GitHub 仓库地址: https://github.com/IOsetting/py32f0-template/tree/main/Examples/PY32F0xx/LL/GPIO/XL2400_Wireless

运行测试

修改 main.c 中的模式设置, 0为接收, 1为发送, 分别写入至两个PY32F002A开发板, 观察UART的输出.

// 0:RX, 1:TX
#define XL2400_MODE 0

接收端在每次接收到数据时, 输出第1,2,31个字节的值; 发送端每发送255组数据(每组32字节)后, 会显示发送成功的个数(十六进制), 这个输出可以用于计算发送成功率, 以及发送速度.

硬件SPI方式

接线

接线和XN297LBW的硬件SPI方式一样, 使用4线制全双工, PY32的MOSI和MISO都接到XL2400的DATA, 但是在MOSI(PA7)上串一个1K的电阻.

PY32                XL2400 SOP8
PA0   ------------> DATA/MOSI
PA7   ---> 1KR ---> DATA/MOSI
PA1   ------------> CLK/SCK
PA6   ------------> CSN/NSS

                    USB2TTL
PA2(TX) ----------> RX
PA3(RX) ----------> TX

代码说明

参考XN297LBW的代码说明, 两者是一样的.

完整代码

XL2400 示例代码的 GitHub 仓库地址: https://github.com/IOsetting/py32f0-template/tree/main/Examples/PY32F0xx/LL/SPI/XL2400_Wireless

运行测试

和GPIO模拟方式的一样, 修改 main.c 中的模式设置, 0为接收, 1为发送, 分别写入至两个PY32F002A开发板, 观察UART的输出.

// 0:RX, 1:TX, 2:TX_FAST
#define XL2400_MODE 0

利用FIFO队列提升发送速度

XL2400 也可以使用直接写入 FIFO 队列的方式提升发送速度, 发送相比普通发送方式有10%的性能提升.

在硬件SPI通信的示例中可以通过设置XL2400_MODE2可以启用快速发送模式

// 0:RX, 1:TX, 2:TX_FAST
#define XL2400_MODE 2

相关内容

  • STC8H开发(十六): GPIO驱动XL2400无线模块
    这是去年写的一篇STC8H驱动XL2400的文章, 当时还没有跑通硬件SPI方式的驱动. 另外测试结论的性能偏低, 可能与8位MCU的性能有关. 在PY32F002A上, 1Mbps速率时实测传输可以达到17KBps, 每秒17K字节, 这个速度已经可以传输双声道音频了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1094292.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初出茅庐的小李博客之SPI工作模式

SPI的工作模式 SPI(Serial Peripheral Interface)是一种同步串行通信协议,常用于连接微控制器和外围设备。SPI有四种模式,分别是0、1、2、3模式。 0模式:时钟空闲时为低电平,数据在时钟的下降沿采样&#…

Using sunbeam to deploy openstack (by quqi99)

作者:张华 发表于:2023-10-15 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99) What’s sunbeam sunbeam是一个部署openstack的工具,它会用ju…

利用ChatGPT练习口语

目录 ChatGPT 这两天发布了一个激动人心的新功能,App端(包括iOS和Android)开始支持语音对话以及图片识别功能。 这两个功能一如既往的优先开放给Plus用户使用,现在将App更新到最新版本,就能体验。 为什么说激动人心&a…

Android组件通信——PendingIntent(二十八)

1. PendingIntent 1.1 知识点 (1)了解PendingIntent与Intent的区别; (2)可以完成Notification功能的开发; (3)可以使用PendingIntent进行短信的发送; 1.2 具体内容 …

mysql作业(牛客60-80)

文章目录 606162636465666768697071727374757677787980 60 select cust_id from Customers;61 select distinct prod_id from OrderItems;62 select * from Customers;63 小小的脑袋大大的疑惑,按字母排?order by select cust_name from Customers orde…

计算机网络第2章-DNS(3)

DNS:因特网的目录服务 在因特网上,主机和人类都一样,可以用很多种方式进行标识,主机的一种标识方法是它的主机名。 但是主机名一般是用IP来表示,IP是由四个字节组成,并且有严格的层次结构,不利…

不止硬件,苹果的软件也是频出问题!iOS 17.0.3使iPhone在一夜之间随机开关机

就在我们以为iPhone的问题已经解决了一段时间的时候,一个新的问题似乎突然出现了。在Reddit和其他网站上,人们报告说,他们的iPhone在一夜之间莫名其妙地断电,有时会导致错过警报。 目前尚不清楚是什么原因导致了这个问题&#xf…

python利用多线程让http请求异步返回

嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 有时我们可能会碰到这样一种情况: 我们有一个功能,这个功能对外提供了一个http接口, 我们需要对这个http接口发起请求才能启…

Liunx中日志分析与网络设置(极其粗糙版)

liunx系统日志的管理 系统日志:操作系统本身和大部分服务器程序的日志文件 日志是记录系统所产生的各种事故,在某个时间节点发生了什么,发生的原因 liunx的路径是/var/log下 /var/log/messages:内核日志还有公共信息日志(所有…

冒泡排序(学习笔记)

冒泡排序(基于交换的排序,每一轮确定一个数的位置) 哨兵举例: 待排序序列:6 3 1 2 5 第一轮排列: 3 6 1 2 5 3 1 6 2 5 3 1 2 6 5 3 1 2 5 6(最大的数移动到了正确的位置) 第二轮排列…

Mall脚手架总结(五) —— SpringBoot整合MinIO实现文件管理

前言 在项目中我们经常有资源的上传和下载的功能需求,比如用户头像、产品图片、配置文件等等,大数据量的文件存储无疑需要更高性能的数据存储服务,对于无需对结构实现复杂查询的文件对象来说,对象存储服务无疑是一个较好的选择&am…

并查集路径压缩

我们来看看如果要是100个数,往20个数的集合合并如何 那么我们应该,把数据量小的集合往数据量大的合并 解决另一种极端场景的路径压缩

限制条件加入构造范围:Gym - 102832L

https://vjudge.net/contest/587311#problem/D 场上列方程求首项,假设是全部加1,然后一部分(后缀)减去 k 1 k1 k1,就用到了以下两个条件: 但在这两种情况符合情况下,这个条件不一定满足 然后…

【软件测试】 初识软件测试

文章目录 🌴什么是软件测试🎋软件测试和开发的区别🚩软件测试与调试的区别 🌳软件测试的发展🎄软件测试岗位🍀软件测试在不同类型公司的定位🎍一个优秀的软件测试人员具备的素质🌲软…

105AspectRatio调整宽高比组件_flutter

AspectRatio组件 AspectRatio 的作用是根据设置调整子元素 child 的宽高比。 AspectRatio 首先会在布局限制条件允许的范围内尽可能的扩展,widget 的高度是由宽 度和比率决定的,类似于 BoxFit 中的 contain,按照固定比率去尽量占满区域。 …

【Redis】Java Spring操作redis

目录 引入Redis依赖StringRedisTemplate使用String使用List使用Set使用hash使用zset 引入Redis依赖 StringRedisTemplate 此处RedisTemplate是把这些操作Redis的方法,分成了几个类别,分门别类的来组织的。 此处提供的一些接口风格,和原生的Re…

利达卓越:发挥金融力量,促进团队发展

随着中国经济的快速增长和金融改革的逐步深化,我国金融业取得了令人瞩目的发展。作为经济的重要支柱,我国金融业的规模和实力不断扩大,已经成为全球最大的金融市场之一。利达卓越是一支由管理精英组成的团队,专注于金融行业的投资…

Empowering Low-Light Image Enhancer through Customized Learnable Priors 论文阅读笔记

中科大、西安交大、南开大学发表在ICCV2023的论文,作者里有李重仪老师和中科大的Jie Huang(ECCV2022的FEC CVPR2022的ENC和CVPR2023的ERL的一作)喔,看来可能是和Jie Huang同一个课题组的,而且同样代码是开源的&#xf…

解密人工智能:KNN | K-均值 | 降维算法 | 梯度Boosting算法 | AdaBoosting算法

文章目录 一、机器学习算法简介1.1 机器学习算法包含的两个步骤1.2 机器学习算法的分类 二、KNN三、K-均值四、降维算法五、梯度Boosting算法和AdaBoosting算法六、结语 一、机器学习算法简介 机器学习算法是一种基于数据和经验的算法,通过对大量数据的学习和分析&…

数据结构与算法-(8)---队列(Queue)

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…