精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何解決zigbee&BLE 模塊最大的不足

AGk5_ZLG_zhiyua ? 來源:未知 ? 作者:劉勇 ? 2017-12-06 06:30 ? 次閱讀

第九章為BLE&zigbee 無線模塊,本文內容為9.1 BLE 核心板。

本章導讀

市面上現有zigbee&BLE 模塊最大的不足就是不能很好地支持用戶進行二次開發,即便某些模塊能夠實現二次開發,卻因為不具備完整的軟硬件生態鏈和穩定可靠的組網協議軟件。因此用戶還需要花很多時間學習與zigbee&BLE 相關的知識,非得將自己培養成通曉zigbee&BLE 技術的專家,才有可能開發出穩定且具有競爭力的產品

其實,人與人之間的差別不在于知識和經驗,而是思維方面的差異決定了每個人的未來。雖然大多數開發者都很勤奮,但其奮斗目標不是企業和個人收益最大化,而是以學習與MCU和zigbee&BLE 相關的非核心域技術為樂趣。不愿意與市場人員和用戶交流,不注重提升個人挖掘用戶需求的創造力,還為自己的錯誤行為貼上高大上的標簽——一切都在掌握之中。

事實上,每個人不可能做到面面俱全,你只是自己所在領域的專家,所以不要將精力用錯了地方。以至于很多人在辛辛苦苦奮斗十多年之后,還是找不到失敗的原因時,只是表面地嘆息自己懷才不遇,甚至將失敗的責任推給他人。這種落后的開發思維,導致很多企業無法開發出具有行業領先地位產品。

基于此,ZLG 推出了各種功能的MCU+zigbee或BLE 模塊,MCU 包括M0+、M4、ARM9、A7 和A8 內核,支持AMetal 和AWorks 平臺。

9.1 BLE 核心板

>>> 9.1.1 產品簡介

AW824BPTBLE 核心板是廣州致遠電子有限公司基于NXP藍牙4.0 BLE 芯片和MCU芯片LPC824 開發的,一款低功耗、高性能,支持二次開發的藍牙4.0 BLE 模塊。其中的LPC824 是基于ARM? Cortex?-M0+內核設計的32 位處理器,30MHz 主頻,32KB 片內Flash 和8KB 片內SRAM,支持4 種低功耗模式。

如圖9.1 所示的AW824PBT 核心板采用外置天線的封裝、通過半孔工藝將I/O 引出,幫助客戶繞過繁瑣的射頻硬件設計、開發與生產,加快產品上市。

圖9.1 AW824BPT 實物圖

完善的軟件開發平臺可滿足快速開發需求,減少軟件投入,縮短研發周期。該模塊方便迅速橋接電子產品智能移動設備,可廣泛應用于有此需求的各種電子設備,如儀器儀表、健康醫療、智能家居、運動計量、汽車電子和休閑玩具等。

1. 產品特征

  • 32 位ARM? Cortex?-M0+內核處理LPC824,32KB 片內Flash,8KB 片內SRAM;

  • 3 路USART(可分配給任意I/O 管腳),4 路I2C,2 路SPI,12 路ADC,6 路PWM;

  • 支持主從模式,主機最多連接8 個從機;

  • 高達50kbps 數據傳輸速率,支持藍牙4.0;

  • 寬工作電壓2.4~3.6V;

  • 接收靈敏度:-93dBm;

  • 發射功率:-20dbm~4dbm,通過AT 指令可調;

  • 天線類型:外置天線。

AW824BPT 模塊相關參數詳見表9.1。

表9.1 選型表

2. 硬件描述

AW824BPT 無線核心模塊默認運行在橋接模式(透傳模式)下,模塊啟動后會自動進行廣播,已打開特定 APP 的手機會對其進行掃描和對接,連接成功之后就可以通過 BLE 在模塊和手機之間進行數據傳輸。

在橋接模式下,用戶MCU 可以通過模塊的通用串口和移動設備進行雙向通訊;用戶也可以通過特定的串口AT 指令,對某些通訊參數進行修改,比如,串口波特率、廣播周期等。AW824BPT 的引腳分布詳見圖9.2,引腳說明詳見表9.2。

表9.2 AW824BPT 引腳說明

圖9.2 AW824BPT 引腳分布

為了便于快速開發,在AW824BPT 內部,已經固定的將LPC824 的一些引腳(PIO0_16、PIO0_24 ~ PIO0_28)與AW824BPT 中的藍牙模塊相連接,示意圖詳見圖9.3。

圖9.3 LPC824 與藍牙模塊連接示意圖

藍牙模塊相關的引腳有7 個,但其中5 個引腳已經在AW824BPT 內部與LPC824 連接,另外兩個引腳BLE_LKSLP 和BLE_LKCON 作為藍牙模塊的輸出信號,直接通過AW824BPT 的1、2 腳引出。藍牙模塊的相關引腳簡介詳見表9.3。

表9.3 藍牙模塊引腳功能描述

特別注意,LPC824 的PIO0_26 和PIO0_27 與藍牙模塊的串口相連,當使用AW824BPT進行二次開發時,需要將LPC824 的PIO0_26 配置為串口TX 功能,PIO0_27 配置為串口的RX 功能。

>>> 9.1.2 協議說明

AW824BPT 中包含藍牙模塊,AW824BPT 可以快捷的與其它BLE 設備(如手機)之間進行雙向數據通訊。在BLE 的連接過程中,AW824BPT 是從機設備,與之連接的其它BLE設備(如手機)是主機設備。

為敘述方便,后文描述時,均假定與AW824BPT 連接的主機設備為手機端。由于BLE屬于藍牙4.0 的范疇,因此要求手機的藍牙模塊是4.0 以上的版本。iPhone4S 及后續版本的蘋果手機都支持;Android 手機則需要4.3.1 以上的版本才能夠支持。

AW824BPT 中藍牙模塊發送數據的速率理論可達5.5K byte/s,速率主要與BLE 的連接間隔相關,若 BLE 連接間隔較短,則速率較高,平均功耗也較高;反之,若BLE 連接間隔較長,則數據傳輸的速率會降低,但同樣平均功耗也會降低。藍牙模塊的BLE 連接間隔默認值為20ms(最小值),可以使用接口函數對其進行修改,最大支持2000ms。

每個連接間隔最多傳輸110 個字節的數據,若連接間隔為T(單位:ms),那么每秒最高傳輸速率 V(單位:byte/s)為:V =110*1000 /T (byte s),式中乘以 1000 是由于 T 的單位為ms。顯然,T 值越小,數據傳輸速率越高,當T 為最小值20ms 時,可得到最高傳輸速率為:

當然,這只是理論值,實際測試表明,轉發速率在4K 以下,丟包率很低,高于4K 時,丟包率將有所提高。但是為了安全起見,無論是低速或者高速轉發大數據量應用時,都建議在上層做校驗重傳處理。

使用藍牙進行數據傳輸是雙向的。對于AW824BPT 發送數據至手機端,其流程是首先通過LPC824 的串口發送數據至藍牙模塊,然后藍牙模塊通過BLE 將數據轉發至手機端。這就存在一個速率匹配的問題。若串口傳輸速率高于BLE 傳輸速率。則數據通過串口發送至藍牙模塊的速率高,而通過BLE 轉發數據的速率低,若數據不間斷傳輸,則會導致藍牙模塊內部200 字節的緩沖區很快被填滿,使得后續數據不得不丟棄,這種情況下,LPC824通過串口每發送200 字節數據至藍牙模塊后,均需要延時一段時間,以確保下次發送數據前,藍牙模塊已經通過BLE 完成對數據的轉發,內部有可用空間用于裝載新的數據。

同理,對于手機端發送數據至主控AW824BPT,其流程是首先手機端通過BLE 發送數據至藍牙模塊,然后藍牙模塊通過串口將數據發送至LPC824。若串口傳輸速率低于BLE 傳輸速率。則數據通過BLE 發送至ZLG9021 的速率高,而通過串口轉發數據的速率低,也將導致傳輸速率的不匹配。

最理想的情況就是,串口波特率與BLE 數據傳輸速率剛好匹配,發送至藍牙模塊一個數據的時間與BLE 轉發一個數據的時間恰好相等,這樣的話,就不存在速率不匹配的問題了。若BLE 的傳輸速率為5.5K,則平均傳輸一個數據的時間為:

若串口波特率為baudrate,由于串口使用格式為1 位起始位、8 位數據位、無校驗位、1位停止位。因此發送一個字節數據大約需要傳輸10 位的時間。即:

UART 傳輸速率與BLE 傳輸速率恰好相等,可以得出:

由此可見,當BLE 傳輸速率為5.5K 時,串口波特率為55556 時,可以達到速率匹配。若波特率高于此值,則UART 傳輸速率高于BLE 傳輸速率。若波特率低于此值,則UART傳輸速率低于BLE 傳輸速率。

實際上,藍牙模塊的UART 只支持常見的波特率:4800、9600、19200、38400、57600、115200。因此,若使用AW824BPT 主要是用于發送大數據至手機端,則UART 傳輸速率應該低于BLE 傳輸速率,此時,波特率設置為38400 較為合適。若使用AW824BPT 主要用于接收來自手機端的大數據,則UART 傳輸速率應該高于BLE 傳輸速率,此時,波特率設置為57600 較為合適。一般地,若雙方都有大數據傳輸,則確保每發送200 字節數據之間存在一定的時間間隔(30 ~ 60ms)即可。

>>> 9.1.3 藍牙模塊初始化

AMetal 已經支持AW824BPT 中的藍牙模塊,提供了相應的驅動,可以直接使用相應的API 完成藍牙模塊的配置及數據的收發,用戶無需關心底層的通信協議,即可快速使用AW824BPT 進行BLE 數據通信。使用其它各功能函數前必須先完成初始化,初始化函數的原型(am_zlg9021.h)為:

其中,p_dev 為指向am_zlg9021_dev_t 類型實例的指針,p_devinfo 為指向am_zlg9021_devinfo_t 類型實例信息的指針。

注,AW824BPT 中的藍牙模塊為ZLG9021,因此,接口使用zlg9021 作為藍牙模塊驅動的命名空間。對于用戶來講,只需要使用接口進行藍牙相關的操作即可,無需關心具體使用的何種藍牙模塊。

  • 實例

定義am_zlg9021_dev_t 類型(am_zlg9021.h)實例如下:

其中,g_zlg9021_dev 為用戶自定義的實例,其地址作為p_dev 的實參傳遞。

  • 實例信息

實例信息主要描述了與ZLG9021 通信時,與引腳、UART 波特率、緩沖區等相關的信息。其類型am_zlg9021_devinfo_t 的定義(am_zlg9021.h)如下:

其中,pin_en、pin_brts、pin_rst、pin_restore 分別表示LPC824 與藍牙模塊對應功能引腳相連接的引腳號,通過圖9.3 可知,pin_en 與PIO0_16 連接,pin_brts 與PIO0_25 連接,pin_rst 與PIO0_28 連接。RESTORE 引腳用于恢復出廠設置,AW824BPT 未使用該引腳,pin_restore 的值設置為-1 即可。

baudrate 表示UART 使用的波特率,ZLG9021 出廠默認波特率為9600,對于出廠設置的模塊,該值必須設置為9600。初始化完成后,后續可以使用ZLG9021 控制函數修改波特率(支持的波特率有:4800、9600、19200、38400、57600、115200)。若修改了波特率,則必須確保下次調用初始化函數時,實例信息中baudrate 的值為修改后的波特率值。

為了提高數據處理的效率和確保接收數據不會因為正在處理事務而丟失。UART 發送和接收都需要一個緩沖區,用于緩存數據,緩沖區的實際大小由用戶根據實際情況確定,建議在64 字節以上,一般設置為128 字節。p_uart_rxbuf 和rxbuf_size 描述了接收緩沖區的首地址和大小,p_uart_txbuf 和txbuf_size 描述了發送緩沖區的首地址和大小。如分別定義大小為128 字節的緩沖區供發送和接收使用,定義如下:

其中,g_zlg9021_uart_txbuf[128]為用戶自定義的數組空間,供發送使用,充當發送緩沖區,其地址(數組名g_zlg9021_uart_txbuf 或首元素地址&g_zlg9021_uart_txbuf[0])作為實例信息中p_uart_txbuf 成員的值,數組大小(這里為128)作為實例信息中txbuf_size 成員的值。同理,g_zlg9021_uart_rxbuf[128]充當接收緩沖區,其地址作為實例信息中p_uart_rxbuf成員的值,數組大小作為實例信息中rxbuf_size 成員的值。

基于以上信息,實例信息可以定義如下:

其中,g_zlg9021_devinfo 為用戶自定義的實例信息,其地址作為p_devinfo 的實參傳遞。

  • UART 句柄uart_handle

若使用LPC824 的USART2 與ZLG9021 通信,則UART 句柄可以通過LPC82x 的USART1 實例初始化函數am_lpc82x_usart2_inst_init()獲得。即:

獲得的UART 句柄即可直接作為uart_handle 的實參傳遞。

  • 實例句柄

ZLG9021 初始化函數am_zlg9021_init()的返回值即為ZLG9021 實例的句柄。該句柄將作為其它功能接口函數的handle 參數的實參。

其類型am_zlg9021_handle_t(am_zlg9021.h)定義如下:

若返回值為NULL,說明初始化失敗;若返回值不為NULL,說明返回了一個有效的handle。基于模塊化編程思想,將初始化相關的實例、實例信息等的定義存放到ZLG9021的配置文件(am_hwconf_zlg9021.c)中,通過頭文件(am_hwconf_zlg9021.h)引出實例初始化函數接口,源文件和頭文件的程序范例分別詳見程序清單9.1 和程序清單9.2。

程序清單9.1 ZLG9021 實例初始化函數實現(am_hwconf_zlg9021.c)

程序清單9.2 ZLG9021 實例初始化函數聲明(am_hwconf_zlg9021.h)

后續只需要使用無參數的實例初始化函數即可獲取到ZLG9021 的實例句柄。即:

>>> 9.1.4 藍牙模塊控制接口

ZLG9021 控制接口用于控制ZLG9021,完成所有與ZLG9021 相關的控制,如參數設置、參數獲取、軟件復位等。其函數原型(am_zlg9021.h)為:

其中,cmd 用于指定控制命令,不同的命令對應不同的操作。p_arg 為與命令對應的參數。當命令不同時,對應p_arg 的類型可能不同,因此,這里p_arg 使用的類型為 void *,其實際類型應該與命令指定的類型一致。常見命令(am_zlg9021.h)及命令對應的p_arg 類型詳見表9.4。

表9.4 支持的命令及命令對應的p_arg 類型

有些命令無需參數(表中p_arg 類型標識為“—”),如復位模塊命令。此時,調用am_zlg9021_ioctl ()函數時,只需將p_arg 的值設置為NULL 即可。帶“*”的類型表示指針類型。若函數返回值為AM_OK,表示操作成功,否則表示操作失敗。

雖然控制命令較多,看似使用起來較為復雜,但由于在絕大部分應用場合下,默認值即可正常工作,因此,若無特殊需求,可以直接使用讀寫數據接口完成“透傳數據”的發送和接收。一般地,也僅可能使用少量命令完成一些特殊應用需求。下面詳細介紹各個命令的使用方法。

1. 設置/獲取BLE 連接間隔

模塊與手機相連時,會定時進行同步,保證手機與模塊一直處于連接狀態,且數據交互操作也是在同步的時候進行的。若 BLE 連接間隔較短,則速率較高,平均功耗也教高;反之,若BLE 連接間隔較長,則數據傳輸的速率會降低,但同樣平均功耗也會降低。

連接間隔的單位為ms,有效值有:20、50、100、200、300、400、500、1000、1500、2000,出廠默認值為20,即最小時間間隔。

如設置連接間隔為50ms,范例程序詳見程序清單9.3。注意,設置連接間隔后掉電會丟失,并且連接間隔的修改只有在重新連接后才生效。

程序清單9.3 設置BLE 連接間隔范例程序

連接間隔設置成功與否主要取決于手機端對連接間隔的限制。不同手機的實際連接間隔也可能不同,如魅族手機的實際連接間隔會比設定值少25%左右;iPhone 手機在連接時均是先以30ms 間隔運行1 分鐘,然后切換成設定值。

可以通過命令獲取當前的連接間隔,范例程序詳見程序清單9.4。

程序清單9.4 獲取BLE 連接間隔范例程序

程序執行結束后,interval_ms 的值即為當前使用的連接間隔。若使用程序清單9.3 所示的代碼修改了時間間隔,則此處獲取的值應該為50。

2. 模塊重命名/獲取模塊名

模塊名即手機端發現ZLG9021 時,顯示的ZLG9021 模塊的名字。模塊名限定在15 字節以內。如修改模塊名為“ZLGBLE”,范例程序詳見程序清單9.5。注意,修改模塊名后,掉電不會丟失。

程序清單9.5 模塊重命名范例程序

修改模塊名為“ZLGBLE”后,手機端發現ZLG9021 時,將顯示其名字為“ZLGBLE”。顯然,當使用ZLG9021 開發實際產品時,在同一應用場合,可能存在多個ZLG9021 模塊,若全部命名為“ZLGBLE”,將不容易區分具體的ZLG9021 模塊。此時,可以使用自動添加MAC 后綴的模塊重命名命令,使用方法與AM_ZLG9021_RENAME 相同,范例程序詳見程序清單9.6。

程序清單9.6 模塊重命名(自動添加MAC 后綴)范例程序

使用該命令修改模塊名后,會自動添加6 個字符(MAC 地址后3 個字節的Hex 碼),若ZLG9021 模塊的MAC 地址為:08:7C:BE:CA:A5:5E,則重命名后,ZLG9021 的模塊名被設置為“ZLGBLECAA55E”。可以通過命令獲取當前的模塊名,范例程序詳見程序清單9.7。

程序清單9.7 獲取ZLG9021 模塊名范例程序

程序中,由于模塊名的最大長度為15 字符,為了存放'