STC8H開發(十六): GPIO驅動XL2400無線模塊

来源:https://www.cnblogs.com/milton/archive/2022/08/21/16609856.html
-Advertisement-
Play Games

小眾的2.4G射頻收發晶元, 和 Ci24R1, XN297L 一樣, 都屬於 nRF24L01 派生的 SOP8 版本. 在寄存器和操作上類似於nRF24L01, 但是寄存器中存在大量多位元組的設置, 沒有中斷, 完全靠輪詢工作, 這是這個型號的特點. 在相容性上, 和XN297L管腳佈局一致但是寄... ...


目錄

XL2400 簡介

小眾的2.4G射頻收發晶元, 和 Ci24R1, XN297L 一樣, 都屬於 nRF24L01 派生的 SOP8 版本. 在寄存器和操作上類似於nRF24L01, 但是寄存器中存在大量多位元組的設置, 沒有中斷, 完全靠輪詢工作, 這是這個型號的特點.

在相容性上, 和XN297L管腳佈局一致但是寄存器不一樣, 比XN297L的外圍電路元件更少, 只需要一個16MHz晶振, 兩個電容就能工作. 和Ci24R1比管腳和寄存器都不一樣.

具體的參數可以查看官網上的產品介紹 和手冊 XL2400規格書V2.0a.pdf, XL240X應用說明v2.1a.pdf, 市場上還有型號為 WL2400 的晶元, 看手冊應該是同一個晶元.

XL2400 管腳和典型電路

管腳定義

PIN Name I/O 說明
1 CSN DI SPI 片選信號
2 SCK DI SPI 時鐘信號
3 DATA/IRQ IO SPI 數據輸入/輸出/中斷信號
4 VDD Power 電源(+2.1 ~ +3.6V,DC)
5 XC1 AI 晶振輸入
6 XC2 AO 晶振輸出
8 VSS GND
7 ANT RF 天線介面

可以和 Ci24R1 對比一下, 僅僅是管腳位置不同

電路

電路非常簡單, C3可以省略, C7可以用1pF至3pF.

沒有現成的模塊, 在立創打的板子, 成品圖, 相容XN297, 因此多預留了一些焊盤

STC8H 驅動 XL2400

驅動說明

從測試的過程看, 基於GPIO模擬SPI驅動比較穩妥, 如果用硬體SPI, 收發的通信成功率太低, 主要遇到的問題是SPI讀取時, 有30%概率會讀到全為0xFF的內容, 猜測是XL2400的驅動能力較弱, 無法拉低讀周期的電平?

STC8H對三線SPI半雙工通信沒有說明, 還需要進一步嘗試. 因此以下僅說明基於GPIO模擬SPI驅動的方式.

接線

示例代碼中, 使用了與硬體SPI一樣的Pin, 實際上換成其他Pin也一樣, 因為都是通過GPIO模擬驅動.

Pin connection:
P35              => CSN
P34              => DATA
P32              => SCK
                    VDD1     => 3.3V
                    XC1,XC2  => 16MHz OSC
                    GND      => GND

示例代碼

代碼下載地址

在SPI目錄下也有硬體SPI驅動方式的代碼, 通信效果較差, 有興趣的可以試一下. 如果能改進為硬體SPI收發就更好.

基礎巨集定義

切換收發模式, 通過main.c中的XL2400_MODE設置

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

巨集定義和Ci24R1是一樣的, 只是XL2400的CE操作更複雜一點, 需要讀寫兩個位元組所以沒放到巨集定義里

#define XL2400_CSN  P35
#define XL2400_SCK  P32
#define XL2400_MOSI P34

#define XL2400_PLOAD_WIDTH       32   // Payload width

#define XL2400_DATA_OUT()        GPIO_P3_SetMode(GPIO_Pin_4, GPIO_Mode_Output_PP)
#define XL2400_DATA_IN()         GPIO_P3_SetMode(GPIO_Pin_4, GPIO_Mode_Input_HIP)
#define XL2400_DATA_LOW()        XL2400_MOSI = 0
#define XL2400_DATA_HIGH()       XL2400_MOSI = 1
#define XL2400_DATA_READ()       XL2400_MOSI

#define XL2400_CLK_LOW()         XL2400_SCK = 0
#define XL2400_CLK_HIGH()        XL2400_SCK = 1

#define XL2400_NSS_LOW()         XL2400_CSN = 0
#define XL2400_NSS_HIGH()        XL2400_CSN = 1

SPI基礎通信, 寄存器讀寫和多位元組讀寫

SPI基本讀寫和 Ci24R1 完全一致, 可以參考 Ci24R1 的對應部分. 從官方的代碼樣例移植時, 並沒有使用官方提供的操作方式, 因為相對比之下, 現在這種寫法更穩妥. XL2400 沒有單位元組命令, 只有普通的雙位元組命令讀寫, 其它的多位元組讀寫也和 Ci24R1 是一樣的.

XL2400的CE操作

void XL2400_CE_Low(void)
{
    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);
}

void XL2400_CE_High(void)
{
    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);
}

XL2400 的初始化

XL2400的初始化, 有一部分和nRF24L01一致, 另一部分是特有的

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();
    // 開啟所有 Pipe 的 Auto ACK
    XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_EN_AA, 0x3F);
    // 啟用所有 Pipe
    XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_EN_RXADDR, 0x3F);
    // 地址寬度 5 bytes
    XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_SETUP_AW, 0xAF);
    // 重試次數和間隔
    XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_SETUP_RETR, 0x33);
    // 無線速率 1Mbps
    XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_RF_SETUP, 0x22);
    // 接收通道0和通道1的接收位元組數
    *(cbuf + 0) = XL2400_PLOAD_WIDTH;
    *(cbuf + 1) = XL2400_PLOAD_WIDTH;
    XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_RX_PW_PX, cbuf, 2);
    // 關閉動態接收大小
    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);
    // 開啟 RSSI
    *(cbuf + 0) = 0x10;
    *(cbuf + 1) = 0x00;
    XL2400_WriteFromBuf(XL2400_CMD_W_REGISTER | XL2400_REG_RSSI, cbuf, 2);
}

XL2400 發送

發送沿用了官方例子, 在寫入發送內容, 拉高CE後, 輪詢狀態等待發送結果. 如果是MAX_RT或TX_DS_FLAG 則返回結果.

uint8_t XL2400_Tx(uint8_t *ucPayload, uint8_t length)
{
    uint8_t y = 100, status = 0;
    XL2400_ClearStatus();
    XL2400_WriteFromBuf(XL2400_CMD_W_TX_PAYLOAD, ucPayload, length);
    XL2400_CE_High();
    // Retry until timeout
    while (y--)
    {
        SYS_DelayUs(100);
        status = XL2400_ReadStatus();
        // If TX successful or retry timeout, exit
        if ((status & (MAX_RT_FLAG | TX_DS_FLAG)) != 0)
        {
            break;
        }
    }
    XL2400_CE_Low();
    return status;
}

XL2400 接收

也沿用了官方例子, 輪詢等待待接收結果狀態, 並讀出接收到的位元組

uint8_t XL2400_Rx(void)
{
    uint8_t i, status, rxplWidth;
    status = XL2400_ReadStatus();
    if (status & RX_DR_FLAG)
    {
        XL2400_CE_Low();
        rxplWidth = XL2400_ReadReg(XL2400_CMD_R_RX_PL_WID);
        XL2400_ReadToBuf(XL2400_CMD_R_RX_PAYLOAD, xbuf, rxplWidth);
        XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_STATUS, status);
        // UART1_TxChar('>');
        // for (i = 0; i < rxplWidth; i++)
        // {
        //     UART1_TxHex(*(xbuf + i));
        // }
    }
    return status;
}

每次在調用 之前, 需要設置一下RX狀態, 否則不會接收

void XL2400_SetRxMode(void)
{
    XL2400_CE_Low();
    XL2400_ClearStatus();
    XL2400_WriteReg(XL2400_CMD_W_REGISTER | XL2400_REG_CFG_TOP, 0x7F);
    // XL2400_RxCalibrate();
    XL2400_CE_High();
    SYS_Delay(1);
}

XL2400通信速率

時間有限沒有充分測試, 僅測試了1Mbps速率開啟ACK情況下的通信情況. 接收不設間隔, 發送間隔為2 - 3 毫秒時達到最高速率, 大約每1.7秒發送256組, 每組32個位元組, 速率為4.8K 位元組每秒, 這樣看速度只有同等設置下nRF24L01的1/5, 可能和軟體模擬的SPI有關.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • button組件幾乎是每個組件庫都有的;其實實現一個button組件是很簡單的。本篇文章將帶你一步一步的實現一個button組件。如果你想瞭解完整的組件庫搭建,你可以先看使用Vite和TypeScript帶你從零打造一個屬於自己的Vue3組件庫,這篇文章有詳細介紹。當然如果你只想知道一個button ...
  • 在我們開發開發H5程式或者小程式的時候,有時候需要基於內置瀏覽器或者微信開發者工具進行測試,這個時候可以採用預設的localhost進行訪問後端介面,一般來說沒什麼問題,如果我們需要通過USB基座方式發佈到手機進行App測試的時候,那就需要使用區域網的IP地址了,否則就無法訪問後端的介面,本篇隨筆總... ...
  • 微任務 在js中,當使用promise,會將當前任務加入事件執行的微任務隊列,有且只有這一種方法可以,因為當使用了promise,在JS引擎中會觸發VM::queueMicrotask,會向m_microtaskQueue隊列中壓入事件,在V8中只有這一種暴露方式,沒有其他介面可以調用這個方法 vo ...
  • C# 在中國的採用需要一個殺手級應用的帶動, 那麼這樣的一個殺手級應用是 Unity嗎,我這裡大膽推測採用CoreCLR 的新一代完全採用C#構建的Unity 將是這樣的一個殺手級應用。Unity已被廣泛應用於數字孿生、數字城市、數字工廠等場景,成為各產業加速數字化轉型的一個通用技術平臺底座,而對接 ...
  • 學習內容及其引用 [ ] 委托的定義以及如何理解委托 [ ] 委托的聲明及其由來 [ ] 委托類型的實例 [ ] 多播委托 [ ] 委托的缺點 [ ] Action委托與Func委托 委托•語法篇 C#語言入門詳解 Delegate詳解 委托的定義以及如何理解委托 委托現實的定義: 本人不需要親自去 ...
  • #前言 前段時間需要在一個新項目里添加兩個後臺任務,去定時請求兩個供應商的API來同步數據;由於項目本身只是一個很小的服務,不太希望引入太重的框架,同時也沒持久化要求;於是我開始尋找在Quartz.Net、Hangfire之外,是否還有更為輕量級的框架滿足我的要求,最終我選擇了Coravel. #簡 ...
  • 由於net core 中預設沒有System.Drawing,可以通過nuget下載一個來代替System.Drawing.Common 直接壓縮圖片 /// <summary> /// 圖片壓縮 /// </summary> /// <param name="sFile">原圖片位置</param ...
  • Mac哪款三維人物動畫製作工具好用呢?DAZ Studio Pro for Mac是一款應用在Mac平臺上的3d人物動畫製作軟體,,它擁有輕鬆簡約的ui界面以及強大的虛擬化3d建模功能,通過軟體自帶的虛擬人物模型,您不僅可以自由的添加場景環境等虛擬元素,還可以進行相關主題以及光線效果的設置,用戶可以 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...