前面介绍了 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 等认证.”
与XN297L相比
XL2400 的PIN脚定义和 XN297LBW 是完全一样的

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

嘉立创打样的测试模块 (项目地址 https://oshwhub.com/iosetting/xn297lbw-xl2400-evb)
因为电路与XN297LBW相似, 所以PCB通用, 只是焊接的元件有区别

如果只是做验证, 可以用SOP8转接板加焊一个16MHz晶振和一截 5~10cm 漆包线作为天线.
XN297L最新的SDK可以从芯岭网站下载 下载地址 或者从百度网盘下载 下载地址. SDK中的例子使用GPIO模拟SPI方式进行驱动. 但是实际上也可以通过硬件SPI方式进行驱动.
下面以PY32F002A为例. 代码不需调整可以直接运行于 PY32F003x 和 PY32F030x 系列的其它型号. 因为 XL2400 和 XN297LBW 的示例代码几乎是一模一样, 就不仔细介绍了, 大部分代码可以参考前面的 XN297LBW 的代码说明, 只介绍有区别的地方.
接线和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字节)后, 会显示发送成功的个数(十六进制), 这个输出可以用于计算发送成功率, 以及发送速度.
接线和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
XL2400 也可以使用直接写入 FIFO 队列的方式提升发送速度, 发送相比普通发送方式有10%的性能提升.
在硬件SPI通信的示例中可以通过设置XL2400_MODE为2可以启用快速发送模式
// 0:RX, 1:TX, 2:TX_FAST
#define XL2400_MODE 2