经典蓝牙Inquiry过程的跳频
目錄
BT RF&BB
Discovering Bluetooth Devices
?Frequency Hopping in Inquiry procedure
關鍵詞:Bluetooth Classic, Frequency Hopping, Inquiry
經典藍牙(以下簡稱BT)中,兩個設備建立連接后,會同步Clock和hopping sequence。在建立連接之前的Inquiry過程中,兩個設備是如何跳到同一個channel進行通信的呢?本文將通過解讀Bluetooth Core spec的相關章節的內容來回答這個問題。希望本文能對還工作在古舊的Bluetooth Classic領域的工程師有所幫助。
BT RF&BB
在解讀Inquiry過程的跳頻之前,有必要簡單介紹一下BT RF和BB的相關內容。
- BT channels一共有79個,編號從0到78,每個channel bandwidth為1MHz。
- ?Bluetooth Packet Format有以下兩種。Inquiry過程只使用Basic Rate Packet,而且還是非常特殊的一種:ID packet——只有Access Code部分而沒有Header和Payload部分。
- ?兩個BT設備之間處于同一個Physical Channel定義是:在同一個timeslot (625us)內,兩個設備的工作頻率都跳到同一個RF channel,且Access Code匹配。
- Access Code長度為68或72bits。Inquiry過程使用一種特定類型的Access Code: GIAC (General Inquiry Access Code),長度為68bits(ID packet只包含Access Code,所以ID packet length為68bits,duration也就是68us)。GIAC是用Core Spec規定的general inquiry?LAP address (0x9E8B33)生成的(生成算法詳見Core Spec)。
Discovering Bluetooth Devices
兩個BT devices是如何找到對方的呢?Core spec定義了兩個BT state:Inquiry and Inquiry Scan。一個設備(通常是做master/central那個)進入Inquiry state,并開始發送inquiries。另一個設備(通常是做slave/peripheral那個)進入Inquiry Scan state,試圖接收inquiries。(做過BLE產品研發的同學需要注意,BT Inquiry過程和BLE Advertising的區別:BLE中,是由peripheral?device發送advertisement,而在BT中,是由peripheral device 接收inquiry)
Frequency Hopping in Inquiry procedure
先簡單描述一下 Inquiry/Inquiry Scan 過程,然后再介紹跳頻的細節。
- Central和Peripheral使用各自的Native Bluetooth Clock (CLKN) 計算channel,所以一開始Central Tx channel和Peripheral Rx channel是不相同的。一段時間后,在某個時刻一定會出現Central Tx channel與Peripheral Rx channel相同。Figure 2.10中標注的 “hop f(k)”處,Central和Peripheral都工作在了f(k) channel。注意,在此時刻之前,peripheral就已經工作在f(k) channel上了。
- Peripheral接收到了Central發出的 ID packet后,會切換channel到 f'(k),并在625us后發送 FHS packet;與其同時Central也已經把channel切換到了 f'(k),Central會在該channel上接收到FHS packet。注意,在此過程中CLKN還在繼續變化,但是并不是用實時的CLKN來計算channel。
Inquiry/Inquiry Scan過程中,Central和Peripheral能夠跳到同一個channel的關鍵點在于他們都使用同一個“k”來計算ID packet傳輸channel和FHS packet傳輸channel。但是,計算ID packet傳輸channel的算法與計算FHS packet傳輸channel的算法不同,因此傳輸這兩種packet的channel是不同的。
下面將羅列出Inquiry/Inquiry Scan過程中跳頻的一些重要細節,以幫助理解上述過程。
- Inquiry scan physical channel使用一個較短的偽隨機跳頻序列 (pseudo-random hopping sequence),該序列沒有包含所有79個channel,而僅僅含有32個channel——分成A和B兩個train,每個train有16個channel。這32個channel以2MHz為間隔,分散在64MHz頻帶上。
- 該跳頻序列中包含的channels是由GIAC決定的。由于GIAC是定值,所以Inquiry/Inquiry Scan過程用到的跳頻序列也是一個固定channels的集合。
- 在某一個時刻,使用的channel是用native Bluetooth Clock做輸入參數,按照一定算法,從跳頻序列中選出來的。
- Central發ID Packet的跳頻速率是3200 hops per second,即在一個Tx Slot (625us)內,Central需要在2個不同的channel上發inquiry,即ID packet;在接下來的Rx Slot (625us)內,Central也會試圖在另外2個不同的channel上接收inquiry response,即FHS packet?(1,000,000us / 312.5us = 3200)。
- 在10ms內,Central可以完成在16個channel (即一個train) 上發送inquiry (每1.25ms在2個channel上發送inquiry,16個channel就需要1.25ms x 8 = 10ms)。
- Central在切換到一個新train之前,單個train至少要重復256次,即2.56s。為了在干擾環境收集到所有inquiry response,至少要做3次train切換,所以Central的Inquiry substate至少要持續2.56s x 4 = 10.24s,除非Baseband Resource Manager得到了足夠的responses或者被Host命令取消。
- Peripheral會以比Central慢得多的速率進行跳頻——每1.28s切換一次channel。CLKN[16:12]被用于選擇Inquiry scan的channel,而CLKN[16:12]每1.28s才變化一次(詳見后面的跳頻算法細節)。
- Peripheral會默認每2.56s進行一次Inquiry scan——可用參數Inquiry_Scan_Interval (11.25ms to 2560ms)改變。Peripheral會默認每次Inquiry scan運行11.25ms——可用參數Inquiry_Scan_Window (10.625ms to 2560ms)改變。Host用HCI_Write_Inquiry_Scan_Avtivity命令將這兩個參數配置給Controller。注意:Inquiry_Scan_Window應該小于等于Inquiry_Scan_Interval。
- BT由兩種Hop selection:Basic hop selection和Adapted hop selection (AFH)。Inquiry/Inquiry scan/Inquiry response使用Basic hop selection。兩種Hop selection的差異在于,AFH會將某些有干擾的channel標記為不可用,從而在跳頻的時候避開這些channel。
如果你想了解更多跳頻算法的細節,請閱讀Core Spec, Vol 2, Part B, 2.6 Hop selection。
- 對于basic hop, SELECTION BOX內部如圖Figure 2.16。
- Inquiry Scan/Inquiry/Inquiry response的hop selection控制字(Control word): X, Y1, Y2, A to?F 是由native Bluetooth Clock和GIAC決定的。可以看到, 在Table 2.2中,A to F都是相同的。
- 這些控制字的來源如下。CLKN[27:0]就是native bluetooth clock。它是由一個28 bit counter實現的。這個counter受一個3.2 kHz的時鐘驅動,所以CLKN[27:0]的單位時間是312.5us,即half a time slot。CLKN[0], CLKN[1], CLKN[2]和CLKN[12]分別對應著時間周期312.5us, 625us, 1.25ms和1.28s——這是Bluetooth System中四個重要的時間周期。
最后,歡迎討論交流!
參考文獻:
總結
以上是生活随笔為你收集整理的经典蓝牙Inquiry过程的跳频的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux Socket编程实战第1季第
- 下一篇: 每天进步一点点————MUMA架构优化和