低功耗藍(lán)牙(BLE)學(xué)習(xí)記錄_第1頁
低功耗藍(lán)牙(BLE)學(xué)習(xí)記錄_第2頁
低功耗藍(lán)牙(BLE)學(xué)習(xí)記錄_第3頁
低功耗藍(lán)牙(BLE)學(xué)習(xí)記錄_第4頁
低功耗藍(lán)牙(BLE)學(xué)習(xí)記錄_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

RW_BLE_CORE記錄傳輸信道 BLE的傳輸信道在2.4G頻段有40個channel。包括2種物理信道:廣播信道和數(shù)據(jù)信道。數(shù)據(jù)幀中設(shè)置AccessAddress用于標(biāo)識該信道,防止信道碰撞。ChannelMAP如下:數(shù)據(jù)幀通信藍(lán)牙幀結(jié)構(gòu)如下:Preamble:根據(jù)AccessAddress而定,假如AA的LSB(最右bit)bit為1,則前導(dǎo)便是10101010b,反之則為01010101b。AccessAddress:廣播幀的AA為:0x8E89BED6。其他情況可以是一個32bit的隨機數(shù)。AA需滿足以下條件·不超過連續(xù)6個1或者0?!づc廣播幀的AA不同bit超過1個。·不能4byte相同?!?1跳變不能超過24次·MSB6bit01跳變超過2次。以下逐個介紹PDU。 掃描確認(rèn)。處于廣播狀態(tài)的設(shè)備在收到掃描請求后,需要回復(fù)掃描確認(rèn)幀。AdvA地址意義由TxAdd確定。ScanRspData為廣播端的附帶數(shù)據(jù)。三、InitiatingPDU該部分為連接發(fā)起協(xié)議。發(fā)起的幀格式僅一種:CONNECT_REQ。由發(fā)起方發(fā)送該幀,廣播方接收該幀。CONNECT_REQCONNECT_REQ幀格式如下:TxAdd確認(rèn)InitA地址為公共地址還是隨機地址;RxAdd確認(rèn)AdvA地址為公共地址還是隨機地址。LLData的數(shù)據(jù)格式如下:AA:AccessAddressCRCInit:CRC校驗的初始值,它應(yīng)該是LinkLayer產(chǎn)生的一個隨機值。WinSize:發(fā)送窗長度參數(shù)。transmitWindowSize=WinSize*1.25ms。WinOffset:發(fā)送窗起始偏移量。TransmitWindowOffset=WinOffset*1.25ms。上述兩個window意義如下:Interval:確定connectinterval的時間長度。connInterval=Interval*1.25ms。Latency:connSlaveLatency=Latency。TimeOut:connSupervisionTimeout=Timeout*10ms(100ms~32s之間),當(dāng)兩幀數(shù)據(jù)之間的時間間隔超過6*connInterval或者connSupervisionTimeout時,則認(rèn)為連接丟失。ChM:即ChannelMAP,一共0~36個信道。LSB代表channel0,哪一個是1,則哪一個信道有效。Channel37~39保留。Hop:5~16之間的隨機值,用于設(shè)置HopIncrement。用于計算不使用的信道編號。unmappedChannel=(lastUnmappedChannel+hopIncrement)mod37如果計算結(jié)果是屬于保留信道,則通過下式計算:remappingIndex=unmappedChannelmodnumUsedChannelsSCA:設(shè)置Master睡眠時鐘精確度的最大值。對應(yīng)表如下:四、DataChannelPDU 數(shù)據(jù)信道的幀格式如下:其中包括16bitHeader,長度可變的Payload,和一個信號完整性確認(rèn)字段(MIC)。1、關(guān)于Header和MIC Header的數(shù)據(jù)格式如下:每個字段的意義如下:MIC字段使用的時候,有兩個條件:1、不能使用于非加密的數(shù)據(jù)幀;2、數(shù)據(jù)幀payload長度不能為0。字長為4byte。2、關(guān)于PayloadPayload分為兩類,LLDataPDU和LLControlPDU(LLID==11b)。LLDataPDU里面又分為兩類,一類是完整數(shù)據(jù)幀或幀碎片起始幀(LLID==10b),另一類是幀碎片(LLID==01b)。其中,幀碎片幀的幀長度可以為0,而完整(起始)幀的長度不可以為0。下面具體介紹LLControlPDU:LLControlPDU的幀格式如下: 其幀長度不能為0,其中包含兩個字段:Opcode和CtrData。 Opcode用于確定控制幀類型: 假如收到的LLCPDU格式不支持或者是無用幀,則回復(fù)LL_UNKNOWN_RSPPDU,此時的Type字段需設(shè)置成收到的無用的opcode。LL_CONNECTION_UPDATA_REQ: 該幀的幀格式如下: 這些信息的意義在下一章的四中有詳述。LL_CHANNEL_MAP_REQ:LL_TERMINATE_IND: 這個ErrorCode在藍(lán)牙協(xié)議中有具體制定意義。[Vol2PartD]LL_ENC_REQ:和加密相關(guān)的請求幀LL_ENC_RSP:和加密相關(guān)的回復(fù)幀LL_START_ENC_REQ:沒有CtrData字段LL_START_ENC_RSP:沒有CtrData字段LL_UNKNOWN_RSP:LL_FEATURE_REQ:LL_FEATURE_RSP:LL_PAUSE_ENC_REQ:沒有CtrData字段LL_PAUSE_ENC_RSP:沒有CtrData字段LL_VERSION_IND:LL_REJECT_IND:關(guān)于藍(lán)牙通信協(xié)議的理解一、時鐘要求 Active狀態(tài)下小于±50ppm。 SleepMode下小于±500ppm。二、設(shè)備過濾 除了僅支持不可連接的廣播系統(tǒng)(non-connectableadvertising),其他模式均需支持設(shè)備過濾。廣播、掃描、連接發(fā)起均具有各自獨立的過濾機制。如果芯片不支持這幾種模式的話,那就可以不支持設(shè)備過濾。設(shè)備過濾是為了盡量減少不必要的數(shù)據(jù)通信。 設(shè)備過濾時需要具備一個白名單,白名單內(nèi)容包括不過濾設(shè)備的地址和地址類型(公共或隨機)。白名單內(nèi)容由HOST設(shè)置。以下對各種過濾模式作一個介紹:1、廣播過濾支持過濾方式如下,一次僅支持一種方式:·廣播設(shè)備僅處理來自白名單的設(shè)備的掃描、連接請求。·廣播設(shè)備處理一切設(shè)備的掃描、連接請求。(復(fù)位值)·廣播設(shè)備處理所有設(shè)備的掃描請求,僅處理白名單的連接請求?!V播設(shè)備處理所有設(shè)備的連接請求,僅處理白名單的掃描請求。2、掃描過濾支持過濾方式如下:·掃描設(shè)備僅處理來自白名單設(shè)備的廣播幀?!呙柙O(shè)備處理一切設(shè)備的廣播幀。 假如廣播方已經(jīng)過濾該掃描設(shè)備的話,通信不能成功。3、發(fā)起過濾 支持過濾方式如下:·被發(fā)起設(shè)備處理來自白名單內(nèi)所有設(shè)備的連接發(fā)起請求?!け话l(fā)起設(shè)備忽略白名單,僅處理host給出設(shè)備的連接發(fā)起請求。三、非連接狀態(tài)簡述1、standbyStandby是復(fù)位后的芯片初始狀態(tài),由它可以進(jìn)入廣播、掃描和連接狀態(tài)。2、advertising進(jìn)入廣播狀態(tài)后,便開始發(fā)送廣播幀。在發(fā)送完一幀廣播幀以后,advertisingevent將被關(guān)閉,來適應(yīng)其他功能。廣播事件有以下幾種類型:第一幀廣播幀應(yīng)該在channelindex中的最低的廣播信道發(fā)送。廣播事件是否有回復(fù)幀由廣播幀類型決定,具體如下表: 當(dāng)收到錯誤的返回幀時,廣播端會在下一個廣播信道發(fā)送廣播幀,或直接停止廣播事件。 廣播事件間隔必須是625us的倍數(shù),范圍在20ms~10.24s,其設(shè)置方式如下:T_advEvent=advInterval+advDelayscannableundirected和non-connectableundirected事件,advInterval長度必須大于100ms;connectableundirected事件,advInterval長度必須大于等于20ms。advDelay是0~10ms的偽隨機數(shù)。連續(xù)廣播幀發(fā)送示意圖如下:a)ConnectableUndirectedEventType 如圖4.5接收到CONNECT_REQ之后,廣播方便退出廣播狀態(tài),進(jìn)入Slave狀態(tài)。b)ConnectableDirectedEventTypec)ScannableUndirectedEventTyped)Non-connectableUndirectedEventTypescanning檢測狀態(tài)是用來監(jiān)聽廣播幀的,其狀態(tài)由HOST控制,分為主動掃描和被動掃描。掃描狀態(tài)下有兩個參數(shù)scanWindow、scanInterval用于設(shè)置一次掃描的時間。掃描時間不能長與10.24s,scanWindow<scanInterval。被動掃描(PassiveScanning):只接收幀,不發(fā)送幀。主動掃描(ActiveScanning):監(jiān)聽廣播幀,根據(jù)廣播幀格式,回復(fù)相應(yīng)幀。ADV_IND/ADV_SCAN_IND->SCAN_REQADV_DIRECT_INDPDU/ADV_NONCONN_IND不回復(fù)SCAN_REQ 掃描需進(jìn)行退避操作。具體看文檔吧,就不貼進(jìn)來了。initiatinginitiating沒有channelindex的限制。當(dāng)收到一個在過濾白名單內(nèi)的ADV_IND或ADV_DIRECT_IND,發(fā)起者將會發(fā)送一個CONNECT_REQ給廣播方。發(fā)送完CONNECT_REQ后退出發(fā)起狀態(tài),進(jìn)入連接狀態(tài)。四、連接狀態(tài)簡述:當(dāng)發(fā)起者發(fā)送CONNECT_PDU或者廣播方收到CONNECT_REQ,則認(rèn)為連接被創(chuàng)建,但此時并非認(rèn)為已經(jīng)建立連接。只有當(dāng)正式開始數(shù)據(jù)通信后,才認(rèn)為連接已經(jīng)被建立。連接建立后,連接中有兩個角色:Master和Slave。Master主控connectionevent的時序。每次connectionevent便是Master和Slave的一次同步結(jié)點。1、連接事件(ConnectionEvents)一次連接時間,使用同一個channelindex。每次連接至少進(jìn)行一次數(shù)據(jù)傳輸。Slave端在接收到來自Master的數(shù)據(jù)幀后,無論CRC是否正確,均需要回復(fù)數(shù)據(jù),除非多次連續(xù)CRC不正確。Master也是不管Slave發(fā)過來的幀是否正確,均需回復(fù)數(shù)據(jù),沒有除非。無論CRC是否正確,我們都認(rèn)為Header是對的。Master收不到來自Slave的數(shù)據(jù),則關(guān)閉connectionevent。Master和Slave都能關(guān)閉此次connection。連接事件持續(xù)時間長度由connInterval和connSlaveLatency決定。每次連接事件的起始點稱作anchorpoint。在anchorpoint,Master開始發(fā)送數(shù)據(jù),Slave開始接收數(shù)據(jù)。connInterval便是本次連接的持續(xù)時間。Master必須確保本次連接時間在下次anchorpoint之前間隔T_IFS的時間關(guān)閉。connInterval長度必須是1.25ms的倍數(shù),長度在7.5ms~4.0s不等。connInterval由發(fā)起者通過CONNNECT_REQ傳送給廣播方。connSlaveLatency是Slave端允許的監(jiān)聽延時時間,其長度范圍如下:0~((connSupervisionTimeout/connInterval)-1)且必須小于500。也就是說,假如connSlaveLatency=0,則Slave需要在每個anchorpoint時刻監(jiān)聽。沒收到設(shè)置connSlaveLatency的幀時,亦如是。 Master和Slave均有一個16bit的計數(shù)器connEventCounter每有一次connectionevent,計數(shù)器就加一,假如溢出則循環(huán)。它是用于LinkLayer作同步時用。Slave在等待connSlaveLatency時,該計數(shù)器亦計數(shù)。2、連接超時(SupervisionTimeout)藍(lán)牙系統(tǒng)為了檢測連接丟失,便設(shè)置了一個SupervisionTimeout計數(shù)器TLLconnSupervision。每次接收到數(shù)據(jù)幀,則計數(shù)器清零。SupervisionTime超過以下幾個范圍則認(rèn)為超時:·大于6*connInterval·大于connSupervisionTimeoutconnSupervisionTimeout為10ms的倍數(shù),范圍是100ms~32s,并且小于(1+connSlaveLatency)*connInterval。Timeout以后,設(shè)備停止發(fā)送,進(jìn)入Standby狀態(tài),并且上報中斷。發(fā)送窗(TransmitWindow)TransmitWindow的信息包含在CONNECT_REQ中,傳送給發(fā)起者。發(fā)送窗起始是在收到CONNECT_REQ之后transmitWindowOffset+1.25ms,transmitWindowSize定義發(fā)送窗的寬度。transmitWindowOffset范圍1.25ms的倍數(shù),0ms~connInterval。transmitWindowSize范圍1.25ms的倍數(shù),1.25ms~10ms|connInterval-1.25ms。4、主設(shè)備(MasterRole) 建立連接后,發(fā)起的一方成為Master。連接狀態(tài)建立以后,Master重新設(shè)置TLLconnSupervision,LinkLayer確認(rèn)連接已經(jīng)建立。隨后Master在transmitwindow時間內(nèi)開始發(fā)送第一個數(shù)據(jù)幀,Master的第一幀長度可以超過transmitwindow。Master決定第一個anchorpoint,下一個anchorpoint=connInterval+firstanchorpoint。 以下是一個例子:5、從設(shè)備(SlaveRole) 建立連接后,廣播的一方成為Slave。 Slave一方也相同,重新設(shè)置TLLconnSupervision,LinkLayer確認(rèn)連接已經(jīng)建立。連接建立后的第一幀,無論CRC是否收對,都把它作為第一次連接事件的anchorevent。 假如第一個transmitwindow沒有收到數(shù)據(jù)幀,則準(zhǔn)備在下一個transmitwindow下接收數(shù)據(jù),而此時事件同步計數(shù)器connEventCount亦加一。6、關(guān)閉連接事件(ClosingConnectionEvents) Header中的MD位標(biāo)識是否該次事件之后還有數(shù)據(jù)發(fā)送。假如MD置位,則Master接著發(fā),Slave接著收。任何一方收不到對方的幀了,均關(guān)閉連接事件。 連續(xù)兩次收到數(shù)據(jù)CRC不對,也關(guān)閉連接事件??偨Y(jié)如下:7、發(fā)送窗拓寬(WindowWidening) 由于發(fā)送端接收端都存在晶振頻偏,所以可能會導(dǎo)致Slave端anchorpoint不同步,因此Slave每次接收完一個數(shù)據(jù)幀,均需同步一次anchorpoint。 接收端需要根據(jù)發(fā)送端的頻偏MasterSCA和接收端頻偏SlaveSCA來計算接收端的接收窗拓寬參數(shù),以保證數(shù)據(jù)成功接收。計算方式如下: 其值應(yīng)小于((connInterval/2)-T_IFSus)。假如到達(dá)這個值,則認(rèn)為連接丟失。8、信道列表選擇(DataChannelIndexSelection) Master端需要給此次連接的信道分類:使用信道和不使用信道。使用信道最少為兩個。信道分類由HOST產(chǎn)生。而Slave的ChannelMap通過CONNECT_REQ幀接收到本地。 連續(xù)的connectionevent每次需要獲取兩個參數(shù)unmappedChannel和lastUnmappedChannel。前者是此次連接沒有使用過的信道列表,后者是前一次連接未用過的信道編號。 未用信道編號計算方法如下:unmappedChannel=(lastUnmappedChannel+hopIncrement)mod37 假如unmappedChannel為usedChannel的話,則此次的ChannelIndex則根據(jù)這個unmappedChannel得到該次connection所使用的Channel。 假如unmappedChannel為unusedChannel,則根據(jù)下面公式計算得到一個remappingIndex。remappingIndex=unmappedChannelmodnumUsedChannels總結(jié)如下圖:9、確認(rèn)機制和數(shù)據(jù)流控制(AcknowledgementandFlowControl) 數(shù)據(jù)的確認(rèn)依靠transmitSeqNum(SN)和nextExpectedSeqNum(NESN)來控制。NESN用于確認(rèn)前一幀是否接收正確,是否需要重發(fā)。剛剛進(jìn)入連接狀態(tài),SN和NESN均需設(shè)置成0。控制方式如下圖: NESN在一種情況下不會被更新,就是接收BUFFER不夠的情況。這會使發(fā)送端重傳該幀,如此實現(xiàn)數(shù)據(jù)流控制。五、LinkLayer控制描述 LLCP(LinkLayerControlProtocol)是用來控制兩個LinkLayer之間的控制和協(xié)商的。其中包括連接控制,加密控制等等。LinkLayer連接更新和ChannelMap更新每次進(jìn)入連接狀態(tài)后,設(shè)備均需更新connInterval,connSlaveLatency和connSupervisionTimeout。Master通過發(fā)送LL_CONNECTION_UPDATE_REQ幀來實現(xiàn)參數(shù)更新,Slave不能發(fā)送這種格式的幀,它通過使用L2CAP信道回復(fù)更新確認(rèn)來確認(rèn)參數(shù)更新。參數(shù)更新之前使用老的參數(shù),更新之后使用新參數(shù)。Slave端收到LL_CONNECTION_UPDATE_REQ之后,假如connEventCountmod65535小于32767,并且不等于本地的connEventCount,此時它需監(jiān)聽所有的ConnectionEvent,直到確認(rèn)Master收到自己的REQACK。Slave在確認(rèn)兩邊connEventCount相等之前的ConnectionEvent均需要監(jiān)聽。 假如connEventCountmod65535大于32767,則Slave認(rèn)為與Master丟失連接,回到Standby狀態(tài),并上報主機。 Master這邊,需要在第一個TransmitWindow內(nèi)發(fā)送數(shù)據(jù),它發(fā)送的這幀數(shù)據(jù)作為此次Connection的anchorpoint。Master在這個anchorpoint以后更新它的connInterval,并清零TLLconnSupervision計數(shù)。 假如使用自動發(fā)送LL_CONNECTION_UPDATE_REQ,則Timeout參數(shù)不跟新,與前次LL_CONNECTION_UPDATE_REQ或者CONNECT_REQ設(shè)置時相同。其他參數(shù)亦如是。 自動更新機制用于Master由于其他需求,需要更改anchorpoint時間。 ChannelMap的更新由LL_CHANNEL_MAP_REQ完成,2、加密加密參數(shù)設(shè)置通過LL_ENC_REQ和LL_ENC_RSP開始加密:LL_START_ENC_REQ和LL_START_ENC_RSP結(jié)束加密:LL_PAUSE_ENC_REQorLL_TERMINATE_INDPDUsEmptyPDUsorLL_PAUSE_ENC_RSPorLL_TERMINATE_IND3、FeatureSetExchange進(jìn)入連接狀態(tài)以后,藍(lán)牙設(shè)備之間需要交換各自所支持的功能參數(shù)。該過程通過LL_FE

溫馨提示

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

評論

0/150

提交評論