參考文稿講稿_第1頁(yè)
參考文稿講稿_第2頁(yè)
參考文稿講稿_第3頁(yè)
參考文稿講稿_第4頁(yè)
參考文稿講稿_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)主從一體串口透?jìng)鲉纹瑱C(jī)2017-02-27v3.0AmoMcu:淘寶:1技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)目錄目錄2C.、脫機(jī)燒錄、量產(chǎn)必備31,要實(shí)現(xiàn)的功能42,開(kāi)發(fā)環(huán)境52.1 硬件52.2 軟件63,源碼位置64,源碼分析64.14.2工程來(lái)源6工程修改要點(diǎn)74.2.14.2.24.2.34.2.44.2.54.2.64.2.74.2.84.2.9實(shí)現(xiàn)主從一體代碼8實(shí)現(xiàn)數(shù)據(jù)掉電保存11實(shí)現(xiàn)串口代碼12實(shí)現(xiàn) AT 命令14實(shí)現(xiàn)主機(jī)連接15增加特征值 CHAR616主機(jī)數(shù)據(jù)20主機(jī)接收數(shù)據(jù)20從機(jī)數(shù)據(jù)214

2、.2.10 從機(jī)接收數(shù)據(jù)21主從一體公共文件主要函數(shù)分析214.34.3.14.3.24.3.34.3.4主從一體公共頭文件 simpleBLE.h21主從一體公共頭文件 simpleBLE.c24主設(shè)備文件27從設(shè)備文件275,源碼編譯286,運(yùn)行297,測(cè)試297.1 雙機(jī)主從一體串口透?jìng)?97.2 用 ios 的 lightblue 透?jìng)?27.3 用 AmoBleTool.apk 的測(cè)試338,我們349,附錄9.19.29.39.49.59.69.7AT 命令34AT 測(cè)試指令34AT+BAUD、設(shè)置串口波特率34AT+PARI 設(shè)置串口校驗(yàn)35AT+STOP 設(shè)置串口停止位35AT

3、+MODE 設(shè)置模塊工作模式36AT+NAME、設(shè)置設(shè)備名稱36AT+RENEW 恢復(fù)默認(rèn)設(shè)置(Renew)362技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)9.8 AT+RESET9.9 AT+ROLE模塊復(fù)位,重啟(Reset)36、設(shè)置主從模式369.109.119.129.139.149.159.169.179.189.199.209.219.22AT+PASS AT+TYPEAT+ADDR、設(shè)置配對(duì)·············

4、················································ 37設(shè)置模塊鑒權(quán)工作類

5、型37本機(jī) MAC 地址37AT+CONNL連接最后一次連接的從設(shè)備37AT+CON 連接指定藍(lán)牙地址的從設(shè)備37AT+CLEAR AT+RADDAT+VERS清除主設(shè)備配對(duì)信息38連接過(guò)的從機(jī)地址38軟件版本38AT+TCONAT+RSSI AT+TXPW設(shè)置主模式下嘗試連接時(shí)間38RSSI 信號(hào)值38改變模塊發(fā)射信號(hào)強(qiáng)度39AT+TIBE 改變模塊作為 ibeacon廣播時(shí)間間隔39AT+IMME 設(shè)置工作類型39C.、脫機(jī)燒錄、量產(chǎn)必備淘寶店 有研發(fā)的 CC2530 CC2540 CC2541 的脫機(jī)燒錄器,有 1 拖 2 與 1 拖 16路兩個(gè)型號(hào),均為并行燒錄,加密保護(hù),節(jié)約人工,提

6、高生產(chǎn)力,工廠日產(chǎn)萬(wàn)片的最佳選擇。經(jīng)過(guò)很多用戶量產(chǎn)驗(yàn)證,穩(wěn)定、可靠、首選:3技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)型號(hào)功能地址1 拖 2 型 脫機(jī)燒錄器CC2530 CC2540CC2541 可用,并行燒錄,加密保護(hù),2 路同時(shí)燒錄pm=a1z10.1-c-s.w5003- .4.cJBjnV&id=522559128353&sce ne=shop市單片機(jī)社區(qū)電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)1,要實(shí)現(xiàn)的功能【1】實(shí)現(xiàn)一份代碼,編譯一個(gè)固件,到后, 通過(guò) AT 命令或者按鍵切換來(lái)實(shí)4技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)1 拖 16 型 脫機(jī)燒錄器CC2530 CC2540CC2541 可用,

7、并行燒錄,加密保護(hù),16 路同時(shí)燒錄pm=a1z10.1-c-s.w4004- .44.cJBjnV&id=529447014444市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)現(xiàn)主機(jī)或從機(jī)功能(目前僅實(shí)現(xiàn)了 AT 命令切換),目前,市場(chǎng)上主從一體的, 既方便生產(chǎn),也方便客戶使用?!?】LED 狀態(tài)燈顯示, 用 P0.6 實(shí)現(xiàn)。LED 狀態(tài)燈已實(shí)現(xiàn)。狀態(tài)燈修改如下:連接前:主機(jī),未從機(jī)地址時(shí),每秒亮 100ms;的模塊絕大部分均為主機(jī),從機(jī)地址時(shí),每秒亮 900ms;從機(jī),每 2 秒亮 1 秒。連線后:主機(jī)與從機(jī)均為每 5 秒亮 100 毫秒。(閃亮, 以便省電)【3】 用4s+上的 l

8、ightblue(第app,我們無(wú)源碼可在 app store免費(fèi)使用)和 AmoMcu 我們的 AmoMcu.apk(有源碼)均可測(cè)試?!?】 透?jìng)髌陂g每個(gè)數(shù)據(jù)包不宜超過(guò) 120 字節(jié),波特率越高,發(fā)包間隔要求越長(zhǎng)。無(wú)線藍(lán)牙透數(shù)據(jù)傳均存在丟包率的問(wèn)題,所以用戶朋友們一定要做好應(yīng)用層的數(shù)據(jù)校驗(yàn)和丟包重 傳。【5】 所有 AT 命令 都是以 “rn”結(jié)尾。大部分 AT 命令都是在未連接前有效,連接后所有數(shù)據(jù)均為透?jìng)鳎ㄓ腥舾蓷l AT 指令在透?jìng)鲿r(shí)也有效, 例如 AT+RSSIrn強(qiáng)度的)。RSSI 信號(hào)【6】 iBeacon 簡(jiǎn)單已集成。 通過(guò) AT 命令 “AT+MODE2rn” 來(lái)設(shè)置, 只有

9、在從機(jī)下才可以。工作模式0:透?jìng)?, 1: 直驅(qū)(保留),2: iBeaconiBeacon 可蘋(píng)果應(yīng)用商店上的方法可見(jiàn)我們以前的 blog :應(yīng)用 Locate iBeacons 來(lái)測(cè)試,目前顯示距離,使用【7】 有數(shù)據(jù)掉電保存功能, AT 命令的設(shè)置絕大部分為調(diào)電保存的?!?】 按住按鍵開(kāi)機(jī)可恢復(fù)出廠設(shè)置。按鍵的 io 口為 P0.7, P0.7 已啟用內(nèi)部上來(lái)功能, 所以按鍵應(yīng)設(shè)計(jì)成通過(guò) 1K 電阻接地?!?】 可設(shè)置連接并綁定。【10】 其他的一些列參數(shù)也可設(shè)置, 詳見(jiàn)附錄的 AT 命令。2,開(kāi)發(fā)環(huán)境2.1 硬件1、2、3、SmartRF 系列開(kāi)發(fā)板 2 塊,板 CC2540 (或者

10、CC2541)CC-DebuggerMiniUSB 線器5技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)2.2軟件1、2、3、4、ble 協(xié)議棧,版本:1.3.2IAR for 8051 開(kāi)發(fā)環(huán)境,版本:8.10 Flash Programmer 固件燒寫(xiě)軟件。串口調(diào)試助手,我們使用的是 SSCOM3.2 , 打開(kāi)兩個(gè)。3,源碼位置AmoMcu 提供的這一份源碼是一個(gè)工程,不依賴與其他任何文件,理論上可放在任何地方進(jìn)行編譯和,但作為中國(guó)程序員需要有一個(gè)好習(xí)慣, 最好把這個(gè)工程放到不帶中文且比較短的路徑,否則有可能編譯出錯(cuò), 產(chǎn)生不必要的麻煩,例如我們推薦的路徑如下

11、所示:4,源碼分析4.1 工程來(lái)源該工程修改自 TI BLE 1.3.2 的 peripheral 從機(jī)工程, 在基礎(chǔ)上, 我們進(jìn)行添加了主機(jī)功能, 并實(shí)現(xiàn)啟動(dòng)時(shí)選擇啟動(dòng)從機(jī)或主機(jī)程序功能。主要的目錄結(jié)構(gòu)如下:6技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)4.2工程修改要點(diǎn)注: 如果想了解下這個(gè)工程是如何來(lái)的, 可以看一下以下的這一段, 不想看的話可以跳過(guò)?!?】 在 peripheral 從機(jī)工程 (默認(rèn)安le 1.3.2 協(xié)議棧的話, 其原路徑在:C:Texas InstrumentsBLE-CC254x-1.3.2ProjectsbleSimpleBLEP

12、eripheral)的基礎(chǔ)上增加主機(jī)工程, 其中主機(jī)工程的源碼也是現(xiàn)成的(默認(rèn)安le 1.3.2 協(xié)議棧的話, 其原路徑在:C:Texas InstrumentsBLE-CC254x-1.3.2ProjectsbleSimpleBLECentral ) , 把C:TexasInstrumentsBLE-CC254x-1.3.2ProjectsbleSimpleBLECentralSource 目錄下的以下三個(gè)文件到從機(jī)工程 的 SimpleBLEPeripheralSource 目錄中?!?】 我們以 cc2540 為例(cc2541 同樣的操作即可)打開(kāi) .SimpleBLEPeripher

13、alCC2540DBSimpleBLEPeripheral.eww 工程,然后增加剛才從主機(jī)工程那里進(jìn)來(lái)的三個(gè)文件(以及我們編寫(xiě)的 simpleBLE.c 與simpleBLE h), 并且在 profile 中再增加central.c與 central h,以便我們使用主機(jī)功能。增加完成后,:7技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū)電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)4.2.1 實(shí)現(xiàn)主從一體代碼我們直接來(lái)分析一下整體的執(zhí)行流程。在 SimpleBLEPeripheral_Main.c 的 main 函數(shù)中,8技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū)電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)108 行

14、至 115 行,是增加的用于先存貯到 nv flash 中的數(shù)據(jù),如果該段內(nèi)存未曾寫(xiě)入過(guò)數(shù)據(jù), 直接讀,會(huì)返回 NV_OPER_FAILED , 我們利用這個(gè)特點(diǎn)作為第一次燒錄后的運(yùn)行, 從而設(shè)置參數(shù)的出廠設(shè)置。118 行 , 執(zhí)行 串口初始化。125 行, 是在原來(lái)的 osal_init_system sys_config.role 的值 為 :BLE_ROLE_PERIPHERAL = 0,或BLE_ROLE_CENTRAL = 1,函數(shù)中增加了一個(gè)參數(shù) sys_config.role, 這個(gè)/從機(jī)/主機(jī)我們深入到 OSAL.c 的 uint8 osal_init_system( uint

15、8 Role )函數(shù)中, 有下面圖中這樣的調(diào)用:9技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū)電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)1060 行至 1067 行,就是根據(jù)傳入的參數(shù)來(lái)決定執(zhí)行主機(jī)代碼或從機(jī)代碼。以上就是我們主從提一體的主要修改點(diǎn)。另外, 在上圖的紅色方框內(nèi)的兩個(gè)函數(shù)基本內(nèi)容其實(shí)是一樣的, 我們下面來(lái)分析一下從機(jī)流程:88 行至 104 行, 定義了各個(gè)人物的處理函數(shù), 這些任何函數(shù), 就是 osal 所謂的“多任務(wù)”處理函數(shù),其中 103 行的 SimpleBLEPeripheral_ProcessEvent 就是我們的從機(jī)的應(yīng)用任務(wù)處理函數(shù)。106 行至 108 行,如果我們對(duì)照一下

16、 TI分出的從機(jī)參考代碼的話, 就會(huì)發(fā)現(xiàn),TI定義成了 const 的, 意思是不可改變的,我們主機(jī)相對(duì)應(yīng)的代碼中把它重用了, 這樣的話, 我們就不許要再定義一次嗎節(jié)省內(nèi)存空間, 詳見(jiàn)下圖:10技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)下面來(lái)看一下 osalInitPeripheralTasks這個(gè)函數(shù):127 行至 131 行, 這里對(duì)任務(wù)個(gè)數(shù)經(jīng)行了賦值,接下來(lái)是逐個(gè)任務(wù)的初始化。并且開(kāi)辟了任務(wù)的內(nèi)存。167 行, 是對(duì)應(yīng)用任務(wù)的初始化,4.2.2 實(shí)現(xiàn)數(shù)據(jù)掉電保存需要保存的數(shù)據(jù)為一個(gè)結(jié)構(gòu)體,詳見(jiàn):以下函數(shù)實(shí)現(xiàn)結(jié)構(gòu)體 sys_config 的讀數(shù)據(jù),我們是在

17、開(kāi)機(jī)階段進(jìn)行了讀 flash。osal_snv_read(0x80, sizeof(SYS_CONFIG), &sys_config);11技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)以下函數(shù)實(shí)現(xiàn)結(jié)構(gòu)體 sys_config 的寫(xiě)數(shù)據(jù),我們是在需要保存數(shù)據(jù)時(shí)進(jìn)行寫(xiě) flash。在 simpleBLE.c 文件中, 有些數(shù)據(jù)的函數(shù):113 行的 0x80 是可寫(xiě)的 flash 的應(yīng)用層可用的開(kāi)始 id, 這個(gè)開(kāi)始 id 的依據(jù),可以在文件 bcomdef h 的下面圖中獲得:172 行至 173 行定義了綁定的數(shù)據(jù)開(kāi)始和結(jié)束 id176 行至 177 行,

18、鼎醫(yī)療 GATT 配置文件的開(kāi)始和結(jié)束 id。所以, 我們可以用的 id 應(yīng)該是從 0x7A 開(kāi)始,我們的代碼中以 0x80 開(kāi)始存貯。4.2.3 實(shí)現(xiàn)串口代碼串口的實(shí)現(xiàn),TI 在 BLE1.3.2 協(xié)議棧的例程里邊,已經(jīng)封裝了串口代碼,使用串口, 我們只需要 2 步要在從機(jī)中1,增加宏 HAL_UART=TRUE12技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū)電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)2, 初始化串口函數(shù),并增加回調(diào)函數(shù)在我們?cè)黾拥?simpleBLE.c 文件中,有如下函數(shù)進(jìn)行串口初始化:400 行, 我們的串口初始化函數(shù)中,有參數(shù):波特率、奇偶校驗(yàn)和停止位的初始化。跟蹤到 _hal_

19、uart_dma.c 文件的 static void HalUARTOpenDMA(halUARTCfg_t *config)函數(shù)中, 即可發(fā)現(xiàn)我們?cè)黾拥?奇偶校驗(yàn)和停止位 的代碼, 如下:13技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū)電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)回到我們?cè)黾拥?simpleBLE.c 文件中,有如下串口回調(diào)函數(shù): static void simpleBLE_NpiSerialCallback( uint8 port, uint8 events ) 下面把該回調(diào)函數(shù)里實(shí)現(xiàn)的功能講解一下:當(dāng)串口收到數(shù)據(jù)后,就會(huì)馬上調(diào)用以下回調(diào)函數(shù),在實(shí)際測(cè)試中發(fā)現(xiàn),此回調(diào)函數(shù)調(diào)用頻繁(如果跟

20、蹤到底層驅(qū)動(dòng)中就會(huì)發(fā)現(xiàn), 只要收到一個(gè)字節(jié), 都會(huì)調(diào)用一次該回調(diào)函數(shù)),如果你不執(zhí)行 NPI_ReadTransport 函數(shù)進(jìn)行, 那么這個(gè)回調(diào)函數(shù)就會(huì)頻繁地被執(zhí)行,但是,你通過(guò)串口一段數(shù)據(jù), 你本意是想處理這一完整一段的數(shù)據(jù),所以,我們?cè)谙旅嬉肓藭r(shí)間的處理方法, 也即接收的數(shù)據(jù)夠多或者超時(shí),就一次數(shù)據(jù), 然后根據(jù)當(dāng)前的狀態(tài)決定執(zhí)行,如果沒(méi)有連接上,就把所有數(shù)據(jù)當(dāng)做 AT 命令處理, 如果連接上了,就把數(shù)據(jù)送到對(duì)端。4.2.4 實(shí)現(xiàn) AT 命令為了便于外部 MCU 的, 我們?cè)黾恿?AT 命令, AT 命令通過(guò)串口進(jìn)行,同時(shí),我們參考在工作中使用過(guò)各種模塊,大對(duì)數(shù)的 AT 命令,使用“rn

21、”即十六進(jìn)制的 0x0D 0x0A來(lái)作為 AT 命令的結(jié)束參考,這樣比較方便。在我們的代碼中, 總共實(shí)現(xiàn)了超過(guò) 20 條的 AT 命令,涵蓋串口參數(shù)設(shè)置、設(shè)備名稱修改、藍(lán)牙廣播參數(shù)設(shè)置、藍(lán)牙 設(shè)置以及藍(lán)牙連接設(shè)置等。這些 AT 命令詳見(jiàn)附錄 9。下面我們來(lái)看一下代碼, 在我們?cè)黾拥?simpleBLE.c 文件中,有如下函數(shù)進(jìn)行 AT 命令的處理:/ AT 命令處理bool simpleBLE_AT_CMD_Handle(uint8 *pBuffer, uint16 length)如果 AT 命令正確被執(zhí)行, 那么會(huì)返回 附錄 9 中的定義值, 否則一律返回 “ERRORrn”,特別需要注意的

22、是每一條 AT 命令后面都必須帶著“rn”, 下面我們以串口助手示例看看14技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)一個(gè) “ATrn”指令:如何如圖紅色框所示, 點(diǎn)擊“”按鍵后, 將會(huì)“ATrn”測(cè)試 AT 命令的指令, 正了 4 個(gè)字節(jié)。確執(zhí)行, 會(huì)返回 “OKrn”,我們也可以看到, 是4.2.5 實(shí)現(xiàn)主機(jī)連接在主機(jī)代碼文件 simpleBLECentral.c 中, 我們添加了自動(dòng)連接從機(jī)的代碼, 當(dāng)然, 這個(gè)自動(dòng)連接是有條件的, 這個(gè)條件就是 AT 命令的設(shè)置, 我們來(lái)先看代碼位置,如下: 在函數(shù) static void simpleBLECentr

23、alEventCB( gapCentralRoleEvent_t *pEvent ) 中:case GAP_DEVICE_DISCOVERY_EVENT:執(zhí)行的是從機(jī)發(fā)現(xiàn), 這里能夠得到每一個(gè)發(fā)現(xiàn)了得從機(jī)的地址,地址存放于 simpleBLEDevListi.addr ,simpleBLEScanRes 則是掃面到的從機(jī)個(gè)數(shù)。15技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū)電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)873 行, 先一下, 是否可以去連接, 如果可以的話, 需要需要去連接的從機(jī)地址是否在已被發(fā)現(xiàn)的從機(jī)列表中, 如果在列表中, 則使 ifDoConnect = TRUE;938 行, 是執(zhí)行對(duì)

24、從機(jī)的連接。這里只是講一下代碼流程,如果要真機(jī)實(shí)操,請(qǐng)看后面的測(cè)試篇章。4.2.6 增加特征值 CHAR6我們最重要的還是要實(shí)現(xiàn)透?jìng)?,要?shí)現(xiàn)透?jìng)鳎?我們有個(gè)前提, 就是需要建立連接后,需要對(duì)某個(gè)特征值進(jìn)行寫(xiě)和通知。目前我們是在 BLE1.3.2 的協(xié)議棧的 SimpleProfile 基礎(chǔ)上增加:#define SIMPLEPROFILE_CHAR6_UUID0xFFF6其位于:BLE-CC254x-1.3.2ProjectsbleProfilesSimpleProfilesimpleGATTprofile h16技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)下面

25、來(lái)梳理一下我們?cè)黾?CHAR6 后的代碼:注意: 我們?yōu)榱吮阌趯?duì)比, 使用了 以下的源碼對(duì)比軟件,請(qǐng)同學(xué)們使用這個(gè)哈這里來(lái)電題外話,對(duì)初學(xué)者應(yīng)該是有用的。磨刀不誤砍柴工, 要是問(wèn)什么感觸,我感觸頗多哦,驅(qū)動(dòng)軟件工程師裝機(jī)必備:一個(gè)是 Source Insight:了 10 年技術(shù),有另一個(gè)就是上面所提到的 Beyond Compare 2。左手,小米加齊上陣哈, 源碼分析、源碼修改、以及源碼修改后的 bug 查找對(duì)比,那是相當(dāng)?shù)姆奖愕?。言歸正傳?!?】頭文件 simpleGATTprofile h這個(gè) simpleGATTprofile.h 實(shí)現(xiàn)的是 TI 自定義的 5 個(gè) profile,我

26、們?cè)诖嘶A(chǔ)上增加了CHAR6 和 CHAR7,但是我們透?jìng)髦挥玫?CHAR6,CHAR7 大家可不必理會(huì)。62 行,增加 CHAR6 的 profile 參數(shù)。74 行,增加該特征值的 UUID。82 行,增加該特征值的長(zhǎng)度,這個(gè)是參考 CHAR5 來(lái)實(shí)現(xiàn)的,但是原版的 CHAR5 有個(gè)缺陷,就是讀寫(xiě)都只能是 5 個(gè)字節(jié),但是我們既然是串口透?jìng)?,意味著我們傳輸?shù)臄?shù)據(jù)長(zhǎng)度是隨意的,有可能是 1 個(gè)字節(jié),也有可能是 120 個(gè)字節(jié),所以在 82 行這里我們?cè)O(shè)置為 1917技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)個(gè)字節(jié)(理應(yīng)最大可設(shè)成 20, 但不知為何目前只能最

27、大設(shè)成 19, 后面有時(shí)間再找找,哪位朋友發(fā)現(xiàn)問(wèn)題所在,請(qǐng)告訴我哈,了)。152 行,原版的 SimpleProfile_GetParameter 是不帶第二個(gè)參數(shù) uint8 *returnBytes 的, 我們把他增加上,見(jiàn)名知意,returnBytes 就是返回多少個(gè)字節(jié)的意思,這里正好對(duì)應(yīng)到上面所說(shuō)到的 “我們傳輸?shù)臄?shù)據(jù)長(zhǎng)度是隨意的”。【2】C 文件 simpleGATTprofile.c文件位置:bleProfilesSimpleProfilesimpleGATTprofile.csimpleGATTprofile.c 是我們的自定義的 profile 的實(shí)現(xiàn)文件,包含了可悲應(yīng)用軟件

28、調(diào)用的GATT profile 和 GATT 服務(wù)( 0xfff0 ) 。 下面我們來(lái)分析一下我們?cè)黾拥拇a:111 行至 114 行,增加 16BIT 特征值的 UUID 定義。201 行使我們?cè)黾拥?CHAR6 特征值 profile 的特征描述,意思是這個(gè)主設(shè)備可對(duì)該特征18技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)值讀(目前不需要的,如果讀,則返回的數(shù)據(jù)不正確)、寫(xiě)、和通知。實(shí)際在透?jìng)鬟^(guò)程中, 我們只需用到寫(xiě)和通知即可, 具體來(lái)說(shuō)就是,主機(jī)對(duì)從機(jī)是寫(xiě),而從機(jī)到主機(jī)是是通知。下面我們來(lái)講一講 237 行的表格:static gattAttribute_t

29、 simpleProfileAttrTblSERVAPP_NUM_ATTR_SUPPORTED該 simpleProfileAttrTbl 是 GATT 的屬性表,提到屬性,我們可以理解成他的特點(diǎn),也就是具體可見(jiàn) SimpleProfile_AddService他都有什么特點(diǎn),這個(gè)是在增加服務(wù)的時(shí)候用到的,的函數(shù)體。依照 TI原本給出的 CHAR4, 我們同樣增加了上面這一段。19技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)485 行, 依照 CHAR4 增加了這一行,大家可能會(huì)問(wèn)為什么是參照 CHAR4 而不是CHAR1 或 CHAR2, 這主要是原本 CHA

30、R4 就是只具備 notify 的屬性,所以,我們既然有notify 的屬性, 必然需要它所需要的代碼和流程,只不過(guò) CHAR4 處理的是 1 個(gè)字節(jié),而我們?cè)黾拥?CHAR6 每次可處理的字節(jié)數(shù)可達(dá) 19 至 20 個(gè)字節(jié), 這才能應(yīng)用到數(shù)據(jù)透?jìng)魃稀O旅嫖覀儊?lái)看一下從機(jī)對(duì)主機(jī):bStatus_t SimpleProfile_SetParameter( uint8 param, uint8 len, void *value )4.2.7 主機(jī)數(shù)據(jù)這個(gè)函數(shù)是主機(jī)往從機(jī)透?jìng)鲾?shù)據(jù),這個(gè)速度非常的快。4.2.8 主機(jī)接收數(shù)據(jù)在以下函數(shù)中 有串口透?jìng)鞯慕邮諗?shù)據(jù):static void simpleBLE

31、CentralProcessGATTMsg( gattMsgEvent_t *pMsg )20技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)4.2.9 從機(jī)數(shù)據(jù)/ 處理: 串口過(guò)來(lái)的數(shù)據(jù), 通過(guò)無(wú)線出去void simpleBLE_UartDataMain(uint8 *buf, uint8 numBytes)4.2.10 從機(jī)接收數(shù)據(jù)在以下函數(shù)中,有串口透?jìng)鞯慕邮諗?shù)據(jù):static void simpleProfileChangeCB( uint8 paramID )4.3 主從一體公共文件主要函數(shù)分析4.3.1 主從一體公共頭文件 simpleBLE.h/ 系

32、統(tǒng)定時(shí)器間隔時(shí)間#define SBP_PERIODIC_EVT_PERIOD100/必須是 100ms/最大的從機(jī)地址#define MAX_PERIPHERAL_MAC_ADDR10/最大的從機(jī)地址/mac 地址的字符長(zhǎng)度 (一個(gè)字節(jié)等于兩個(gè)字符)#define MAC_ADDR_CHAR_LEN12/mac 地址的字符長(zhǎng)度 (一個(gè)字節(jié)21技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)等于兩個(gè)字符)/ 出廠設(shè)置或清除配對(duì)信息與從機(jī)信息typedef enumPARA_ALL_FACTORY = 0,PARA_PARI_FACTORY = 1,與從機(jī)信息PARA

33、_SET_FACTORY;/全部恢復(fù)出廠設(shè)置/配對(duì)信息恢復(fù)出廠設(shè)置-相當(dāng)于清除配對(duì)信息/ 當(dāng)前單片機(jī)運(yùn)行的typedef enumBLE_ROLE_PERIPHERAL = 0,BLE_ROLE_CENTRAL = 1,BLE_ROLE;/從機(jī)/主機(jī)/ 應(yīng)用程序狀態(tài)enumBLE_STATE_IDLE, BLE_STATE_CONNECTING, BLE_STATE_CONNECTED, BLE_STATE_DISCONNECTING, BLE_STATE_ADVERTISING;/無(wú)連接-/連接中./已連接上/斷開(kāi)連接中/從機(jī)廣播中態(tài)/ 系統(tǒng)裕興模式定義enumBLE_MODE_SERIAL

34、, BLE_MODE_DRIVER,BLE_MODE_iBeacon, BLE_MODE_MAX,;/ 串口透?jìng)髂J?【默認(rèn)】/ 直驅(qū)模式/ iBeacon 廣播模式/ 連接模式指示typedef enumCONNECT_MODE_FIX_ADDR_CONNECTED, CONNECT_MODE_LAST_ADDR_CONNECTED, CONNECT_MODE_MAX,CONNECT_MODE;/ 指定 mac 地址進(jìn)行連接/ 連接最后連接過(guò)的 mac 地址22技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)/ 應(yīng)用程序狀態(tài)typedef enumBLE_CENT

35、RAL_CONNECT_CMD_NULL,/主機(jī) AT 連接命令 空BLE_CENTRAL_CONNECT_CMD_CONNL, /主機(jī) AT 連接命令連接最近過(guò)的地址BLE_CENTRAL_CONNECT_CMD_CON,/主機(jī) AT 連接命令 連接指定地址BLE_CENTRAL_CONNECT_CMD_DISC,/主機(jī) AT 掃描從機(jī)命令BLE_CENTRAL_CONNECT_CMD_CONN, /主機(jī) AT 連接命令標(biāo)號(hào)對(duì)應(yīng)的地址BLE_CENTRAL_CONNECT_CMD;extern BLE_CENTRAL_CONNECT_CMD g_Central_connect_cmd ;連接

36、掃描到的地址的下/定于系統(tǒng)結(jié)構(gòu)變量, 該結(jié)構(gòu)會(huì)在開(kāi)機(jī)時(shí)從 nv flash 中數(shù)據(jù)有修改時(shí), 需要寫(xiě)入 nv flash這樣, 就實(shí)現(xiàn)了系統(tǒng)重啟后數(shù)據(jù)還是上一次設(shè)置的,typedef struct/*波特率0-96001-192002-384003-576004-115200*/uint8 baudrate; uint8 parity; uint8 stopbit;/波特率 , 目前支持的列表如上/校驗(yàn)位/停止位uint8 mode;/工作模式 0:透?jìng)?, 1: 直驅(qū) , 2: iBeacon/ 設(shè)備名稱,最長(zhǎng)uint8 name12;11位數(shù)字或字母,含中劃線和下劃線,不建議用其它字符BL

37、E_ROLE role;/主從模式 0: 從機(jī)1: 主機(jī)uint8 pass7;/, 最大 6 位 000000999999/*Para: 0 10: 連接不需要23技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)1: 連接需要*/uint8 type;/鑒權(quán)模式uint8 mac_addrMAC_ADDR_CHAR_LEN+1;/本機(jī)mac 地址 最大 12 位 字符表示uint8 connect_mac_addrMAC_ADDR_CHAR_LEN+1;/指定去連接的 mac 地址/曾經(jīng)連接過(guò)的從機(jī)個(gè)數(shù)uint8 ever_connect_peripheral_m

38、ac_addr_conut;/曾經(jīng)連接過(guò)的從機(jī)個(gè)數(shù),當(dāng)前 index, 用于增加從機(jī)地址時(shí)快速或uint8 ever_connect_peripheral_mac_addr_index;/最新一次連接過(guò)的從機(jī)地址 index, 用于AT+CONNL 這個(gè)指令uint8 last_connect_peripheral_mac_addr_index;/曾經(jīng)uint8連接過(guò)的從機(jī)地址ever_connect_mac_statusMAX_PERIPHERAL_MAC_ADDRMAC_ADDR_CHAR_LEN;/*Para: 000000009999000000 代表持續(xù)連接,其余代表嘗試的毫秒數(shù)De

39、fault:001000*/uint16 try_connect_time_ms; int8 rssi;uint8 rxGain; uint8 txPower;uint16 ibeacon_adver_time_ms;/嘗試連接時(shí)間-目前無(wú)效/RSSI 信號(hào)值接收增益強(qiáng)度發(fā)射信號(hào)強(qiáng)度/廣播間隔/模塊工作類型 0: 立即工作,uint8 workMode;SYS_CONFIG;1: 等待 AT+CON 或 AT+CONNL命令4.3.2 主從一體公共頭文件 simpleBLE.c/ 該函數(shù)延時(shí)時(shí)間為 1ms, 用示波器測(cè)量過(guò), 稍有誤差, 但誤差很小void simpleBLE_Delay_1m

40、s(int times);/ 字符串對(duì)比static uint8 str_cmp(uint8 *p1,uint8 *p2,uint8 len);24技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)/ 字符串轉(zhuǎn)數(shù)字uint32 str2Num(uint8* numStr, uint8 iLength);char *bdAddr2Str( uint8 *pAddr );/ 保存所有數(shù)據(jù)到 nv flashvoid simpleBLE_WriteAllDataToFlash();/自定義的 nv flash 數(shù)據(jù)未使用到void simpleBLE_ReadAllData

41、ToFlash();/flag: PARA_ALL_FACTORY:全部恢復(fù)出廠設(shè)置/flag: PARA_PARI_FACTORY: 清除配對(duì)信息void simpleBLE_SlParaDefault(PARA_SET_FACTORY flag);/ 打印所有到 nv flash 的數(shù)據(jù), 方便調(diào)試代碼void PrintAllPara(void);/ 返回設(shè)備/主從模式 0: 從機(jī)1: 主機(jī)BLE_ROLE GetBleRole();/ 0:/ 1:藍(lán)牙是否連接上未連接上已連接上bool simpleBLE_IfConnected();/ 增加從機(jī)地址, 注意, 需要連接后, 再增加該地

42、址void simpleBLE_SetPeripheralMacAddr(uint8 *pAddr);/ 用于/*從機(jī)地址, index < MAX_PERIPHERAL_MAC_ADDR是否系統(tǒng)中已存有該 Mac 地址index: 應(yīng)該是 < MAX_PERIPHERAL_MAC_ADDR,*/bool simpleBLE_GetPeripheralMacAddr(uint8 index, uint8 *pAddr);/開(kāi)機(jī)時(shí)到按鍵按下 3 秒, 恢復(fù)出廠設(shè)置/按鍵定義為 p0.7void CheckKeyForSlParaDefault(void);/ 串行口 uart 初始化

43、void simpleBLE_NPI_init(void);25技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)/ 設(shè)置接收增益void UpdateRxGain(void);/ 設(shè)置void UpdateTxPower(void);/ 設(shè)置 led 燈的狀態(tài)void simpleBle_LedSetState(uint8 onoff);/ 保存 RSSI 到系統(tǒng)變量void simpleBle_SetRssi(int8 rssi);/ 串口打印-測(cè)試用-void simpleBle_PrintPassword();/ 獲取設(shè)備名稱uint8* simpleBle_

44、GetAttDeviceName();/ 主機(jī)是否了從機(jī)地址bool simpleBle_IFfHavePeripheralMacAddr( void );/ 定時(shí)器任務(wù)定時(shí)執(zhí)行函數(shù), 用于設(shè)置 led 的狀態(tài)也可以增加一個(gè)定時(shí)器來(lái)做void simpleBLE_performPeriodik( void );/ 獲取鑒權(quán)要求, 0: 連接不需要bool simpleBle_GetIfNeedPassword();,1: 連接需要/ 獲取連接uint32 simpleBle_GetPassword();/是否是 iBeacon 廣播模式bool simpleBLE_CheckIfUse_iBe

45、acon();/是否使能串口透?jìng)鱞ool simpleBLE_CheckIfUse_Uart2Uart();/是輸入的形參-地址是否是需要去連接的地址,如果是,返回真, 否則返回假bool simpleBLE_GetToConnectFlag(uint8 *Addr);/ 設(shè)置 iBeacon 的廣播間隔uint32 simpleBLE_GetiBeaconAdvertisingInterral();/ 串口回調(diào)函數(shù), 下面把該回調(diào)函數(shù)里實(shí)現(xiàn)的功能講解一下/*26技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)1, 思路:當(dāng)串口收到數(shù)據(jù)后,就會(huì)馬上調(diào)用以下回調(diào)函數(shù),

46、在實(shí)際測(cè)試中發(fā)現(xiàn),此回調(diào)函數(shù)調(diào)用頻繁, 如果你不執(zhí)行 NPI_ReadTransport 函數(shù)進(jìn)行, 那么這個(gè)回調(diào)函數(shù)就會(huì)頻繁地被執(zhí)行,但是,你通過(guò)串口一段數(shù)據(jù), 你本意是想處理這一完整一段的數(shù)據(jù),所以,我們?cè)谙旅嬉肓藭r(shí)間的處理方法, 也即接收的數(shù)據(jù)夠多或者超時(shí),就一次數(shù)據(jù),然后根據(jù)當(dāng)前的狀態(tài)決定執(zhí)行,如果沒(méi)有連接上,就把所有數(shù)據(jù)當(dāng)做 AT 命令處理, 如果連接上了,就把數(shù)據(jù)送到對(duì)端。*/uart 回調(diào)函數(shù)static void simpleBLE_NpiSerialCallback( uint8 port, uint8 events );/ 處理: 串口過(guò)來(lái)的數(shù)據(jù), 通過(guò)無(wú)線出去void

47、simpleBLE_UartDataMain(uint8 *buf, uint8 numBytes);/ AT 命令處理 函數(shù)bool simpleBLE_AT_CMD_Handle(uint8 *pBuffer, uint16 length);/*很多朋友問(wèn)我們, 如何實(shí)現(xiàn)把主機(jī)或從機(jī)上的傳感器數(shù)據(jù)直接到對(duì)端并通過(guò)主機(jī)的串口透?jìng)鞒鋈ィ?下面我們就能實(shí)現(xiàn)這個(gè)功能, 不過(guò)到底需要什么樣的傳感器, 以及什么樣的數(shù)據(jù)就需要你來(lái)組織了, 下面這個(gè)函數(shù)每 100ms 執(zhí)行一次:都可以把數(shù)據(jù)到對(duì)端, 對(duì)端通過(guò)串口透?jìng)鞒鋈ァO旅娼o出一個(gè)樣例: 實(shí)現(xiàn)把字符串*/void simpleBLE_SendMyDat

48、a_ForTest();到對(duì)方4.3.3 主設(shè)備文件【1】simpleBLECentral.h【2】simpleBLECentral.c【3】OSAL_simpleBLECentral.c【4】SimpleBLEPeripheral_Main.c (這個(gè)是主設(shè)備與從設(shè)備的公用文件)4.3.4 從設(shè)備文件【1】simpleBLEPeripheral.h【2】simpleBLEPeripheral.c【3】OSAL_simpleBLEPeripheral.c【4】SimpleBLEPeripheral_Main.c (這個(gè)是主設(shè)備與從設(shè)備的公用文件)27技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū)

49、 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)5,源碼編譯(必須安裝了 IAR 8.10.3 或 IAR8.10.4 版本。如果沒(méi)有安裝,請(qǐng)先按照我們的1.BLE入門與提高來(lái)先安裝好 IAR)如果是 cc2540, 打開(kāi)BLE-132-ZCYTProjectsbleSimpleBLEPeripheralCC2540DBSimpleBLEPeripheral.eww工程,如果是 cc2541, 打開(kāi)BLE-132-ZCYTProjectsbleSimpleBLEPeripheralCC2541DBSimpleBLEPeripheral.eww程,工然后一定必須記得, 編譯選項(xiàng)選 CC2540 或 CC2541

50、,否則編譯會(huì)出錯(cuò)的。編譯將沒(méi)有任何錯(cuò)誤, 可能有若干個(gè) wanning,可忽略之。28技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)6,運(yùn)行兩種方法:之前需要先連接好我們開(kāi)發(fā)板, 如何連接, 請(qǐng)參考我們的 1.BLE 入門與提高, 還需提醒注意的是, 我們的 cc-debugger 一定是需要顯示綠色才是表明正確連接了開(kāi)發(fā)板的?!?】 IAR 直接:【2】用 SmartRF Flash Programmer固件:路徑如下:(文件名可能經(jīng)過(guò)升級(jí)后稍有不同)如果是 CC2540:SimpleBLEPeripheralCC2540DBCC2540ExeBLE_Maste

51、Slave_V1.2_cc2540.hex如果是 CC2541:SimpleBLEPeripheralCC2541DBCC2541ExeBLE_MasteSlave_V1.2_cc2541.hex7,測(cè)試7.1 雙機(jī)主從一體串口透?jìng)鳒y(cè)試前, 需要打開(kāi)兩個(gè) PC 上的 SSCOM.exe 串口助手, 并都如下圖設(shè)置:波特率 9600,數(shù)據(jù)位 8,停止位 1 校驗(yàn) none, 一定要選中新行(也就是 AT 命令均以新行結(jié)尾, 十六進(jìn)制是 0x0D 0x0A, 字符串表示就是 “rn”)我們的 AT 命令較多, 這里只介紹兩條 AT 指令, 實(shí)現(xiàn) AT 命令和主機(jī)從機(jī)切換即可。1, ATrn返回 O

52、Krn(注意: “rn”在返回時(shí)表示為回車換行了, 如果你切換成 hex 顯示,即可看到是 0x0D 0x0A 結(jié)尾 )2, AT+ROLE1rn這是切換成主機(jī)的意思。我們的源碼編譯出來(lái), 默認(rèn)會(huì)跑從機(jī)的, 既然要做主從透?jìng)鳎?必然有一個(gè)主機(jī),對(duì)吧。增加連接方法:主機(jī):29技術(shù)支持與項(xiàng)目開(kāi)發(fā)合作(TEL)市單片機(jī)社區(qū) 電裝科技專注藍(lán)牙 BLE 開(kāi)發(fā)按以下順序發(fā)指令:【1】 切換成主機(jī)發(fā) AT+ROLE1回 OK+Set:1Hello World Central【2】設(shè)置連接模式發(fā) AT+IMME0回 OK+Set:0(v1.6-20140904 版本增加)如果在這一步: 發(fā) AT+IMME1回 OK+Set:1那么后面的主機(jī)重啟后, 就會(huì)自動(dòng)連接最近連接的從機(jī)【3】掃描送機(jī)發(fā) AT+DISC?回OK+DISCSOK+DISC:78A50450354BOK+DISC:78A504502635 OK+DISCE

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論