普冉PY32系列(九) GPIO模擬和硬體SPI方式驅動無線收發晶片XL2400

2023-10-15 15:01:09

目錄

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位元組, 這個速度已經可以傳輸雙聲道音訊了.