第九章為BLE&zigbee 無線模塊,本文內(nèi)容為9.1 BLE 核心板。
本章導(dǎo)讀
市面上現(xiàn)有zigbee&BLE 模塊最大的不足就是不能很好地支持用戶進行二次開發(fā),即便某些模塊能夠?qū)崿F(xiàn)二次開發(fā),卻因為不具備完整的軟硬件生態(tài)鏈和穩(wěn)定可靠的組網(wǎng)協(xié)議軟件。因此用戶還需要花很多時間學(xué)習(xí)與zigbee&BLE 相關(guān)的知識,非得將自己培養(yǎng)成通曉zigbee&BLE 技術(shù)的專家,才有可能開發(fā)出穩(wěn)定且具有競爭力的產(chǎn)品。
其實,人與人之間的差別不在于知識和經(jīng)驗,而是思維方面的差異決定了每個人的未來。雖然大多數(shù)開發(fā)者都很勤奮,但其奮斗目標不是企業(yè)和個人收益最大化,而是以學(xué)習(xí)與MCU和zigbee&BLE 相關(guān)的非核心域技術(shù)為樂趣。不愿意與市場人員和用戶交流,不注重提升個人挖掘用戶需求的創(chuàng)造力,還為自己的錯誤行為貼上高大上的標簽——一切都在掌握之中。
事實上,每個人不可能做到面面俱全,你只是自己所在領(lǐng)域的專家,所以不要將精力用錯了地方。以至于很多人在辛辛苦苦奮斗十多年之后,還是找不到失敗的原因時,只是表面地嘆息自己懷才不遇,甚至將失敗的責(zé)任推給他人。這種落后的開發(fā)思維,導(dǎo)致很多企業(yè)無法開發(fā)出具有行業(yè)領(lǐng)先地位產(chǎn)品。
基于此,ZLG 推出了各種功能的MCU+zigbee或BLE 模塊,MCU 包括M0+、M4、ARM9、A7 和A8 內(nèi)核,支持AMetal 和AWorks 平臺。
9.1 BLE 核心板
>>> 9.1.1 產(chǎn)品簡介
AW824BPTBLE 核心板是廣州致遠電子有限公司基于NXP 的藍牙4.0 BLE 芯片和MCU芯片LPC824 開發(fā)的,一款低功耗、高性能,支持二次開發(fā)的藍牙4.0 BLE 模塊。其中的LPC824 是基于ARM? Cortex?-M0+內(nèi)核設(shè)計的32 位處理器,30MHz 主頻,32KB 片內(nèi)Flash 和8KB 片內(nèi)SRAM,支持4 種低功耗模式。
如圖9.1 所示的AW824PBT 核心板采用外置天線的封裝、通過半孔工藝將I/O 引出,幫助客戶繞過繁瑣的射頻硬件設(shè)計、開發(fā)與生產(chǎn),加快產(chǎn)品上市。
圖9.1 AW824BPT 實物圖
完善的軟件開發(fā)平臺可滿足快速開發(fā)需求,減少軟件投入,縮短研發(fā)周期。該模塊方便迅速橋接電子產(chǎn)品和智能移動設(shè)備,可廣泛應(yīng)用于有此需求的各種電子設(shè)備,如儀器儀表、健康醫(yī)療、智能家居、運動計量、汽車電子和休閑玩具等。
1. 產(chǎn)品特征
-
32 位ARM? Cortex?-M0+內(nèi)核處理LPC824,32KB 片內(nèi)Flash,8KB 片內(nèi)SRAM;
-
3 路USART(可分配給任意I/O 管腳),4 路I2C,2 路SPI,12 路ADC,6 路PWM;
-
支持主從模式,主機最多連接8 個從機;
-
高達50kbps 數(shù)據(jù)傳輸速率,支持藍牙4.0;
-
寬工作電壓2.4~3.6V;
-
接收靈敏度:-93dBm;
-
發(fā)射功率:-20dbm~4dbm,通過AT 指令可調(diào);
-
天線類型:外置天線。
AW824BPT 模塊相關(guān)參數(shù)詳見表9.1。
表9.1 選型表
2. 硬件描述
AW824BPT 無線核心模塊默認運行在橋接模式(透傳模式)下,模塊啟動后會自動進行廣播,已打開特定 APP 的手機會對其進行掃描和對接,連接成功之后就可以通過 BLE 在模塊和手機之間進行數(shù)據(jù)傳輸。
在橋接模式下,用戶MCU 可以通過模塊的通用串口和移動設(shè)備進行雙向通訊;用戶也可以通過特定的串口AT 指令,對某些通訊參數(shù)進行修改,比如,串口波特率、廣播周期等。AW824BPT 的引腳分布詳見圖9.2,引腳說明詳見表9.2。
表9.2 AW824BPT 引腳說明
圖9.2 AW824BPT 引腳分布
為了便于快速開發(fā),在AW824BPT 內(nèi)部,已經(jīng)固定的將LPC824 的一些引腳(PIO0_16、PIO0_24 ~ PIO0_28)與AW824BPT 中的藍牙模塊相連接,示意圖詳見圖9.3。
圖9.3 LPC824 與藍牙模塊連接示意圖
藍牙模塊相關(guān)的引腳有7 個,但其中5 個引腳已經(jīng)在AW824BPT 內(nèi)部與LPC824 連接,另外兩個引腳BLE_LKSLP 和BLE_LKCON 作為藍牙模塊的輸出信號,直接通過AW824BPT 的1、2 腳引出。藍牙模塊的相關(guān)引腳簡介詳見表9.3。
表9.3 藍牙模塊引腳功能描述
特別注意,LPC824 的PIO0_26 和PIO0_27 與藍牙模塊的串口相連,當使用AW824BPT進行二次開發(fā)時,需要將LPC824 的PIO0_26 配置為串口TX 功能,PIO0_27 配置為串口的RX 功能。
>>> 9.1.2 協(xié)議說明
AW824BPT 中包含藍牙模塊,AW824BPT 可以快捷的與其它BLE 設(shè)備(如手機)之間進行雙向數(shù)據(jù)通訊。在BLE 的連接過程中,AW824BPT 是從機設(shè)備,與之連接的其它BLE設(shè)備(如手機)是主機設(shè)備。
為敘述方便,后文描述時,均假定與AW824BPT 連接的主機設(shè)備為手機端。由于BLE屬于藍牙4.0 的范疇,因此要求手機的藍牙模塊是4.0 以上的版本。iPhone4S 及后續(xù)版本的蘋果手機都支持;Android 手機則需要4.3.1 以上的版本才能夠支持。
AW824BPT 中藍牙模塊發(fā)送數(shù)據(jù)的速率理論可達5.5K byte/s,速率主要與BLE 的連接間隔相關(guān),若 BLE 連接間隔較短,則速率較高,平均功耗也較高;反之,若BLE 連接間隔較長,則數(shù)據(jù)傳輸?shù)乃俾蕰档?,但同樣平均功耗也會降低。藍牙模塊的BLE 連接間隔默認值為20ms(最小值),可以使用接口函數(shù)對其進行修改,最大支持2000ms。
每個連接間隔最多傳輸110 個字節(jié)的數(shù)據(jù),若連接間隔為T(單位:ms),那么每秒最高傳輸速率 V(單位:byte/s)為:V =110*1000 /T (byte s),式中乘以 1000 是由于 T 的單位為ms。顯然,T 值越小,數(shù)據(jù)傳輸速率越高,當T 為最小值20ms 時,可得到最高傳輸速率為:
當然,這只是理論值,實際測試表明,轉(zhuǎn)發(fā)速率在4K 以下,丟包率很低,高于4K 時,丟包率將有所提高。但是為了安全起見,無論是低速或者高速轉(zhuǎn)發(fā)大數(shù)據(jù)量應(yīng)用時,都建議在上層做校驗重傳處理。
使用藍牙進行數(shù)據(jù)傳輸是雙向的。對于AW824BPT 發(fā)送數(shù)據(jù)至手機端,其流程是首先通過LPC824 的串口發(fā)送數(shù)據(jù)至藍牙模塊,然后藍牙模塊通過BLE 將數(shù)據(jù)轉(zhuǎn)發(fā)至手機端。這就存在一個速率匹配的問題。若串口傳輸速率高于BLE 傳輸速率。則數(shù)據(jù)通過串口發(fā)送至藍牙模塊的速率高,而通過BLE 轉(zhuǎn)發(fā)數(shù)據(jù)的速率低,若數(shù)據(jù)不間斷傳輸,則會導(dǎo)致藍牙模塊內(nèi)部200 字節(jié)的緩沖區(qū)很快被填滿,使得后續(xù)數(shù)據(jù)不得不丟棄,這種情況下,LPC824通過串口每發(fā)送200 字節(jié)數(shù)據(jù)至藍牙模塊后,均需要延時一段時間,以確保下次發(fā)送數(shù)據(jù)前,藍牙模塊已經(jīng)通過BLE 完成對數(shù)據(jù)的轉(zhuǎn)發(fā),內(nèi)部有可用空間用于裝載新的數(shù)據(jù)。
同理,對于手機端發(fā)送數(shù)據(jù)至主控AW824BPT,其流程是首先手機端通過BLE 發(fā)送數(shù)據(jù)至藍牙模塊,然后藍牙模塊通過串口將數(shù)據(jù)發(fā)送至LPC824。若串口傳輸速率低于BLE 傳輸速率。則數(shù)據(jù)通過BLE 發(fā)送至ZLG9021 的速率高,而通過串口轉(zhuǎn)發(fā)數(shù)據(jù)的速率低,也將導(dǎo)致傳輸速率的不匹配。
最理想的情況就是,串口波特率與BLE 數(shù)據(jù)傳輸速率剛好匹配,發(fā)送至藍牙模塊一個數(shù)據(jù)的時間與BLE 轉(zhuǎn)發(fā)一個數(shù)據(jù)的時間恰好相等,這樣的話,就不存在速率不匹配的問題了。若BLE 的傳輸速率為5.5K,則平均傳輸一個數(shù)據(jù)的時間為:
若串口波特率為baudrate,由于串口使用格式為1 位起始位、8 位數(shù)據(jù)位、無校驗位、1位停止位。因此發(fā)送一個字節(jié)數(shù)據(jù)大約需要傳輸10 位的時間。即:
若UART 傳輸速率與BLE 傳輸速率恰好相等,可以得出:
由此可見,當BLE 傳輸速率為5.5K 時,串口波特率為55556 時,可以達到速率匹配。若波特率高于此值,則UART 傳輸速率高于BLE 傳輸速率。若波特率低于此值,則UART傳輸速率低于BLE 傳輸速率。
實際上,藍牙模塊的UART 只支持常見的波特率:4800、9600、19200、38400、57600、115200。因此,若使用AW824BPT 主要是用于發(fā)送大數(shù)據(jù)至手機端,則UART 傳輸速率應(yīng)該低于BLE 傳輸速率,此時,波特率設(shè)置為38400 較為合適。若使用AW824BPT 主要用于接收來自手機端的大數(shù)據(jù),則UART 傳輸速率應(yīng)該高于BLE 傳輸速率,此時,波特率設(shè)置為57600 較為合適。一般地,若雙方都有大數(shù)據(jù)傳輸,則確保每發(fā)送200 字節(jié)數(shù)據(jù)之間存在一定的時間間隔(30 ~ 60ms)即可。
>>> 9.1.3 藍牙模塊初始化
AMetal 已經(jīng)支持AW824BPT 中的藍牙模塊,提供了相應(yīng)的驅(qū)動,可以直接使用相應(yīng)的API 完成藍牙模塊的配置及數(shù)據(jù)的收發(fā),用戶無需關(guān)心底層的通信協(xié)議,即可快速使用AW824BPT 進行BLE 數(shù)據(jù)通信。使用其它各功能函數(shù)前必須先完成初始化,初始化函數(shù)的原型(am_zlg9021.h)為:
其中,p_dev 為指向am_zlg9021_dev_t 類型實例的指針,p_devinfo 為指向am_zlg9021_devinfo_t 類型實例信息的指針。
注,AW824BPT 中的藍牙模塊為ZLG9021,因此,接口使用zlg9021 作為藍牙模塊驅(qū)動的命名空間。對于用戶來講,只需要使用接口進行藍牙相關(guān)的操作即可,無需關(guān)心具體使用的何種藍牙模塊。
-
實例
定義am_zlg9021_dev_t 類型(am_zlg9021.h)實例如下:
其中,g_zlg9021_dev 為用戶自定義的實例,其地址作為p_dev 的實參傳遞。
-
實例信息
實例信息主要描述了與ZLG9021 通信時,與引腳、UART 波特率、緩沖區(qū)等相關(guān)的信息。其類型am_zlg9021_devinfo_t 的定義(am_zlg9021.h)如下:
其中,pin_en、pin_brts、pin_rst、pin_restore 分別表示LPC824 與藍牙模塊對應(yīng)功能引腳相連接的引腳號,通過圖9.3 可知,pin_en 與PIO0_16 連接,pin_brts 與PIO0_25 連接,pin_rst 與PIO0_28 連接。RESTORE 引腳用于恢復(fù)出廠設(shè)置,AW824BPT 未使用該引腳,pin_restore 的值設(shè)置為-1 即可。
baudrate 表示UART 使用的波特率,ZLG9021 出廠默認波特率為9600,對于出廠設(shè)置的模塊,該值必須設(shè)置為9600。初始化完成后,后續(xù)可以使用ZLG9021 控制函數(shù)修改波特率(支持的波特率有:4800、9600、19200、38400、57600、115200)。若修改了波特率,則必須確保下次調(diào)用初始化函數(shù)時,實例信息中baudrate 的值為修改后的波特率值。
為了提高數(shù)據(jù)處理的效率和確保接收數(shù)據(jù)不會因為正在處理事務(wù)而丟失。UART 發(fā)送和接收都需要一個緩沖區(qū),用于緩存數(shù)據(jù),緩沖區(qū)的實際大小由用戶根據(jù)實際情況確定,建議在64 字節(jié)以上,一般設(shè)置為128 字節(jié)。p_uart_rxbuf 和rxbuf_size 描述了接收緩沖區(qū)的首地址和大小,p_uart_txbuf 和txbuf_size 描述了發(fā)送緩沖區(qū)的首地址和大小。如分別定義大小為128 字節(jié)的緩沖區(qū)供發(fā)送和接收使用,定義如下:
其中,g_zlg9021_uart_txbuf[128]為用戶自定義的數(shù)組空間,供發(fā)送使用,充當發(fā)送緩沖區(qū),其地址(數(shù)組名g_zlg9021_uart_txbuf 或首元素地址&g_zlg9021_uart_txbuf[0])作為實例信息中p_uart_txbuf 成員的值,數(shù)組大?。ㄟ@里為128)作為實例信息中txbuf_size 成員的值。同理,g_zlg9021_uart_rxbuf[128]充當接收緩沖區(qū),其地址作為實例信息中p_uart_rxbuf成員的值,數(shù)組大小作為實例信息中rxbuf_size 成員的值。
基于以上信息,實例信息可以定義如下:
其中,g_zlg9021_devinfo 為用戶自定義的實例信息,其地址作為p_devinfo 的實參傳遞。
-
UART 句柄uart_handle
若使用LPC824 的USART2 與ZLG9021 通信,則UART 句柄可以通過LPC82x 的USART1 實例初始化函數(shù)am_lpc82x_usart2_inst_init()獲得。即:
獲得的UART 句柄即可直接作為uart_handle 的實參傳遞。
-
實例句柄
ZLG9021 初始化函數(shù)am_zlg9021_init()的返回值即為ZLG9021 實例的句柄。該句柄將作為其它功能接口函數(shù)的handle 參數(shù)的實參。
其類型am_zlg9021_handle_t(am_zlg9021.h)定義如下:
若返回值為NULL,說明初始化失??;若返回值不為NULL,說明返回了一個有效的handle?;谀K化編程思想,將初始化相關(guān)的實例、實例信息等的定義存放到ZLG9021的配置文件(am_hwconf_zlg9021.c)中,通過頭文件(am_hwconf_zlg9021.h)引出實例初始化函數(shù)接口,源文件和頭文件的程序范例分別詳見程序清單9.1 和程序清單9.2。
程序清單9.1 ZLG9021 實例初始化函數(shù)實現(xiàn)(am_hwconf_zlg9021.c)
程序清單9.2 ZLG9021 實例初始化函數(shù)聲明(am_hwconf_zlg9021.h)
后續(xù)只需要使用無參數(shù)的實例初始化函數(shù)即可獲取到ZLG9021 的實例句柄。即:
>>> 9.1.4 藍牙模塊控制接口
ZLG9021 控制接口用于控制ZLG9021,完成所有與ZLG9021 相關(guān)的控制,如參數(shù)設(shè)置、參數(shù)獲取、軟件復(fù)位等。其函數(shù)原型(am_zlg9021.h)為:
其中,cmd 用于指定控制命令,不同的命令對應(yīng)不同的操作。p_arg 為與命令對應(yīng)的參數(shù)。當命令不同時,對應(yīng)p_arg 的類型可能不同,因此,這里p_arg 使用的類型為 void *,其實際類型應(yīng)該與命令指定的類型一致。常見命令(am_zlg9021.h)及命令對應(yīng)的p_arg 類型詳見表9.4。
表9.4 支持的命令及命令對應(yīng)的p_arg 類型
有些命令無需參數(shù)(表中p_arg 類型標識為“—”),如復(fù)位模塊命令。此時,調(diào)用am_zlg9021_ioctl ()函數(shù)時,只需將p_arg 的值設(shè)置為NULL 即可。帶“*”的類型表示指針類型。若函數(shù)返回值為AM_OK,表示操作成功,否則表示操作失敗。
雖然控制命令較多,看似使用起來較為復(fù)雜,但由于在絕大部分應(yīng)用場合下,默認值即可正常工作,因此,若無特殊需求,可以直接使用讀寫數(shù)據(jù)接口完成“透傳數(shù)據(jù)”的發(fā)送和接收。一般地,也僅可能使用少量命令完成一些特殊應(yīng)用需求。下面詳細介紹各個命令的使用方法。
1. 設(shè)置/獲取BLE 連接間隔
模塊與手機相連時,會定時進行同步,保證手機與模塊一直處于連接狀態(tài),且數(shù)據(jù)交互操作也是在同步的時候進行的。若 BLE 連接間隔較短,則速率較高,平均功耗也教高;反之,若BLE 連接間隔較長,則數(shù)據(jù)傳輸?shù)乃俾蕰档?,但同樣平均功耗也會降低?/p>
連接間隔的單位為ms,有效值有:20、50、100、200、300、400、500、1000、1500、2000,出廠默認值為20,即最小時間間隔。
如設(shè)置連接間隔為50ms,范例程序詳見程序清單9.3。注意,設(shè)置連接間隔后掉電會丟失,并且連接間隔的修改只有在重新連接后才生效。
程序清單9.3 設(shè)置BLE 連接間隔范例程序
連接間隔設(shè)置成功與否主要取決于手機端對連接間隔的限制。不同手機的實際連接間隔也可能不同,如魅族手機的實際連接間隔會比設(shè)定值少25%左右;iPhone 手機在連接時均是先以30ms 間隔運行1 分鐘,然后切換成設(shè)定值。
可以通過命令獲取當前的連接間隔,范例程序詳見程序清單9.4。
程序清單9.4 獲取BLE 連接間隔范例程序
程序執(zhí)行結(jié)束后,interval_ms 的值即為當前使用的連接間隔。若使用程序清單9.3 所示的代碼修改了時間間隔,則此處獲取的值應(yīng)該為50。
2. 模塊重命名/獲取模塊名
模塊名即手機端發(fā)現(xiàn)ZLG9021 時,顯示的ZLG9021 模塊的名字。模塊名限定在15 字節(jié)以內(nèi)。如修改模塊名為“ZLGBLE”,范例程序詳見程序清單9.5。注意,修改模塊名后,掉電不會丟失。
程序清單9.5 模塊重命名范例程序
修改模塊名為“ZLGBLE”后,手機端發(fā)現(xiàn)ZLG9021 時,將顯示其名字為“ZLGBLE”。顯然,當使用ZLG9021 開發(fā)實際產(chǎn)品時,在同一應(yīng)用場合,可能存在多個ZLG9021 模塊,若全部命名為“ZLGBLE”,將不容易區(qū)分具體的ZLG9021 模塊。此時,可以使用自動添加MAC 后綴的模塊重命名命令,使用方法與AM_ZLG9021_RENAME 相同,范例程序詳見程序清單9.6。
程序清單9.6 模塊重命名(自動添加MAC 后綴)范例程序
使用該命令修改模塊名后,會自動添加6 個字符(MAC 地址后3 個字節(jié)的Hex 碼),若ZLG9021 模塊的MAC 地址為:08:7C:BE:CA:A5:5E,則重命名后,ZLG9021 的模塊名被設(shè)置為“ZLGBLECAA55E”??梢酝ㄟ^命令獲取當前的模塊名,范例程序詳見程序清單9.7。
程序清單9.7 獲取ZLG9021 模塊名范例程序
程序中,由于模塊名的最大長度為15 字符,為了存放'