【轉】BLE_CC2540_初學者入門指導

原文網址:http://www.deyisupport.com/question_answer/wireless_connectivity/bluetooth/f/103/t/61462.aspxphp

看了下問題,發現不太會回答了,好久沒弄,全忘記了,只好貼出以前的一些東西,幫助初學者入下門吧:編程

1、初識BLE緩存

經過這兩天對《 CC2540 BLE Software Developer Guider V1.2.pdf 》的學習對 CC2540以及藍牙4.0有了一個總體上的認識:
 
一、藍牙4.0協議:BR/EDR(標準藍牙)+ BLE     目前 CC2540硬件只支持BLE這種單模無線標準,不可以與4.0之前的版本通訊。
 
二、針對 CC2540  BLE-Stack 重點學習了該協議棧的結構,TI的藍牙平臺支持兩種協議棧/應用配置:單一設備配置、網絡處理器配置(application/profile在另外的處理器或者PC上的應用)。
 
三、重點學習了協議棧最頂層的兩個通用profile:GAP(通用接入規範)、GATT(通用屬性規範)。
 
四、GAP主要負責處理設備的接入方式以及接入的過程:設備發現、鏈路創建、鏈路終止、啓動安全功能、設備配置(主要是鏈接參數的配置)。
 
五、GATT主要完成服務器和客戶端之間通訊的相關子過程。
 
六、BLE支持40個通道的跳頻機制,其中3個通道用於advertise,剩下的用於數據通訊;而BR的通道數在80,相比而言BLE的機制更加節電。二者的跳頻偏移分別爲2MHz、1MHz。
 
七、OS抽象層相關過程學習,如何配置一個新的任務、任務優先級、事件觸發、消息傳遞等。
 
八、存在的問題:搞不清楚BLE協議內部的GAP、GATT profile與application profile的聯繫與區別,是否BLE可以在app上添加:A2DP(藍牙立體聲音訊傳輸協議)、HID(人機界面規範)等這些規範。
 
2、開始瞭解stack
 
進一步學習GAP,主要扮演四種角色:broadcaster(廣播者)、obseerver(觀察者)、peripheral(外圍)、central(中央)。
 
一、 BLE-Stack中有每一種角色的Sample程序,且正對不一樣的示例程序對應的lib也不相同,eg: CC2540_ble_single_chip_peri.lib 、 CC2540_ble_network_processor_all.lib 等。
 
二、對於應用程序的profile須要按照規範本身編寫,目前ti提供幾個醫療上使用的profile,對於文件傳輸、音頻傳輸等profile,個人理解是BLE不適用於這些場合(參考wiki網上一些話題討論、BLE_TechDay_2011.pdf、 BLE_ CC2540_DeepDive_Training_2011.pdf 來源於wiki網)。
 
 
我理解的classic就是傳統的那種藍牙應用,BLE的應用主要是用於第一幅圖。BLE目前一個數據包支持的最大字節數爲20Byte,基本上都是幾個字節的應用,ti例程。
 
三、在wiki網上找到一個相關的例子:Serial App 經過串口實現兩臺PC之間的數據傳輸,打算從這個例子入手,在轉向USB的,初步看了一下這個Serial App,在該頁上可以下載一個HCI Tester的腳本測試工具,並非直接經過兩個串口實現數據傳輸,須要上層的profile和HCI Command。
 
 
四、Btool工具經過鏈接usb dongle看了一下軟件的選項,嘗試鏈接兩個usb dongle,在wiki上看到有人說可以創建鏈接,實測沒法搜索到設備。
 
五、初步計劃先移植keyfob的程序到dongle上,實現兩個設備之間創建鏈接,keyfob經過一個按鈕觸發30s的dicoverable狀態,這時候啓動dongle進行scan等一系列操做。
 
 
3、摸着石頭過河
 
一、移植KeyFob例程到USB dongle上面,修改按鍵等宏,刪除了加速度、蜂鳴器程序,該Sample與HostTestApp之間能夠創建連接並通訊,參考wiki地址以下:
 
 
存在的問題:
     1)KeyFob例程使用按鍵啓動30秒的advertising,此後由Btool經過USB dongle向KeyFob(另一個dongle模擬的)發送請求連接的命令。按鍵使用輪詢的方式可以正常進入相應事件,使用IO中斷的方式沒法進入,檢查了不少遍未找到緣由所在。
 
     2)創建連接以前USB dongle須要Scan設備,這是在KeyFob發送advertising以後,會存在沒法查找到設備,猜想是因爲使用了輪詢按鍵的方式致使的。
 
二、 CC2540的接收發送緩存都爲128Byte:
 
 
再去看了下以前wiki上看到的關於發送字節不超過20Byte的說法,是限制在10ms之內的。
 
三、Btool創建鏈接的狀態:
 
[25]中代表GAP_EstablishLink Success,在Read/Write選項中經過操做關鍵字、描述符來實現通訊中數據的交互,參考1中網址。
 
eg:經過USB dongle讀取KeyFob電池的電量等,實際讀取錯誤,無效的數據(我想是否須要購買一個keyFob加快開發)
 
 
四、想要實現兩臺PC之間的通訊:
 
1)若是採用HostTestApp的方式,上位機須要與Btool相似,產生HCI Command讀寫數據也須要相關命令和操做序列。
 
2)採用單芯片方式(區別於網絡處理器模式,HostTestApp模式),不直接和外界PC或者MCU交互。
 
最終如何選擇,還須要花時間進一步學習 BLE-stack
 
 
4、站的高一點點
 
一、基本上搞清楚一個應用程序由哪些部分組成,須要作哪些初始化,App函數的位置,以及各類事件的響應方式。
 
二、關於 CC2540 RF寄存器的問題:
 
1)User Guide上面未詳細介紹寄存器的各個位,只有簡單的寄存器說明,查閱E2E肯定TI未開放,因此沒法編寫RF部分的驅動。
 
2)TI建議的方式:Note, that OSAL and HAL source is avail, a free sniffer is avail, and RF studio can access RF directly.
 
3)打開RF Studio  CC2540界面,好好看看有哪些部分,對於測試等等有很大用處的。
 
 
原則上可以進行數據包的收發測試。
 
三、查閱相關TI Bluetooth的器件,簡單對好比下:
 
 
 
5、開始搞起了
 
經過對TI_BLE_Vendor_Specific_HCI_Guide.pdf 和e2e上相關討論的學習,總結以下;
 
一、能夠經過HIC Command對 CC2540進行相關操做,整體描述見下圖。
 
 
二、關於 CC2540 Production Test Mode參考網址:
 
 
三、建立 CC2540測試工程文件,主要是刪除協議部分的和某些無關的OSAL初始化程序。
 
uint16 UserApp_ProcessEvent( uint8 task_id, uint16 events )
{
    if ( events & USER_START_DEVICE_EVT )
    {
        HCI_EXT_SetTxPowerCmd (HCI_EXT_TX_POWER_4_DBM);
        HCI_EXT_ModemTestTxCmd (HCI_EXT_TX_MODULATED_CARRIER,37);
        
        //HCI_EXT_ModemHopTestTxCmd ();
        //HCI_EXT_ModemTestRxCmd (37) ;
        //HCI_EXT_EndModemTestCmd ();
        
        return ( events ^ USER_START_DEVICE_EVT );
    }
    return 0;
}
 
主要涉及的函數:
 
HCI_EXT_SetTxPowerCmd             設置發射功率
HCI_EXT_ModemTestTxCmd          開始連續的發送測試,須要指定信道和是否調製  
HCI_EXT_ModemHopTestTxCmd     開始連續的發送測試,發送37Byte 數據包(僞隨機數),且信道從0-39遞增
HCI_EXT_ModemTestRxCmd          開始接收測試,須要指定信道
HCI_EXT_EndModemTestCmd        中止Modem測試
 
 
6、簡單分析
 
一、以Central、Peripheral之間通訊爲例,學習BLE-stack設備之間的數據通訊:
 
1)Peripheral 經過GATT_Notification函數實現數據發送,這種狀況下外圍設備扮演Seriver(注1)。
2)Central 經過GATT_MSG_EVENT事件觸發任讀取 gattMsgEvent_t 結構體中的 msg對應的 Indication and Notification messages(參考程序中相關結構體)實現數據接收,這種狀況下中央設備扮演Client(注2)。
 
 注1:
  static attHandleValueNoti_t *pReport= NULL;
 
  if ( GATT_Notification( 0, pRepor, FALSE )==SUCCESS)
  {
 
   //用戶可在這裏進行發送成功後的相關操做,pRepor爲待發送的Notification
 
  }
 
  /**
   * Handle Value Notification format.
   */
  typedef struct
  {
    uint16 handle;                             //!< Handle of the attribute that has been changed (must be first field)
    uint8 len;                                   //!< Length of value
    uint8 value[ATT_MTU_SIZE-3];      //!< New value of the attribute
  } attHandleValueNoti_t;
 
  注2:
  if ( pMsg->method == ATT_HANDLE_VALUE_NOTI ||pMsg->method == ATT_HANDLE_VALUE_IND )
  {
    
     attHandleValueNoti_t noti;
    
     dataCount = dataCount+ 1;
      
     LCD_WRITE_STRING_VALUE( "Data Cnt: ", dataCount, 10, HAL_LCD_LINE_1 );
     
     noti.handle = pMsg->msg.handleValueNoti.handle;
 
     noti.len = pMsg->msg.handleValueNoti.len;
     
     osal_memcpy(&noti.value, &pMsg->msg.handleValueNoti.value,noti.len);
     
    //用戶可在這裏操做&noti,經過串口發送或者USB發送出去等等
         
  }
 
 
二、創建鏈接的某些細節函數還未搞清楚,發送數據所可以被用戶看到的最底層函數如1中描述
 
 
三、進一步計劃:
 
1)經過Central、Peripheral之間通訊爲基本模板先實現設備之間創建鏈接,而後使用1中方式實現數據交換。
2)在1)的基礎上加入串口通訊實現串口之間的通訊,並可以經過串口控制設備創建鏈接的過程等。
3)使用Dongle實現USB功能,主要是將HostTestApp中的CDC類USB程序提取出來,實現Dongle與PC間數據通訊,不涉及 BLE-stack協議棧相關只是一個USB程序。
4)因爲CDC類的USB相對而言要簡單一些,上位機編程可使用串口,在3)的基礎上再去實現HID,具體關於這一部分USB驅動和上位機等尚未很清晰的思路。
 
四、須要作的事情:
 
1)使用購買的 CC2540驗證連接創建數據交互的功能。
2)實現 CC2540的UART與PC通訊的功能。
3)使用Dongle實現CDC類USB與PC通訊的功能。
4)使用Dongle實現HID類USB與PC通訊的功能。
 
附件:
 
 
GATT_Notification、GATT_Indication函數的說明,不可以獨立運行須要在創建鏈接的基礎上。
 
 
7、換個硬件看看
 
一、使用購買的CC2540模塊實驗,修改了Debug接口,可以採用TI的CCDebug下載光盤自帶的程序測試正常。
 
光盤例程使用 BLE-Stack 1.1修改,分別下載KebFob和HostAppTest。
 
二、下載BLE-Stack 1.21中例程KebFob和HostAppTest測試鏈接過程也正常。
 
圖1:測試UUID讀取關鍵字成功,KeyFob的電量(百分比) 
 
 
圖2:測試Adv.Commands 讀取RSSI值
 
 
三、使用BLE-Stack 1.1例程中的虛擬鍵盤,測試鏈接失敗(光盤和協議棧原始例程都測試了),用HostAppTest測試搜索到的設備地址與待綁定的地址是匹配的。
 
待作的事情:
 
1)搞清楚3鏈接過程當中出現的問題。
2)花時間去熟悉API函數以及相關的結構體。
 
8、開始作硬件了
 
一、參考《CC2540EM_discrete_schematic.pdf 》繪製CC2540無線模塊原理圖。
 
1)引出P0(8pin)、P1(8pin)、P2(3pin)、電源(2pin)、USB(2pin)、RESET(1pin)共計24pin。
2)不知引腳排列是否合理,目前的排列有利於模塊佈線。
 
見附件: CC2540_BLE_RF.pdf
 
二、參考《CC2540_MiniDK_SCHEMATIC.pdf 》和購買套件的底板原理圖繪製CC2540底板原理圖。
 
1)添加低功耗加速度傳感器CMA3000(用於計步等,可缺省不焊接)。
2)添加CP2102用於USB轉串口,經過UART打印字符便於調試等。
3)可選USB供電、CCdebug供電、CR2032鈕釦電池供電。
4)設計中多處採用0R電阻,便於二次修改。
 
見附件: CC2540 Board.pdf
 
三、閱讀BLE的宣傳資料,以爲不適合在底板上添加傳統的傳感器,不知道是否須要添加傳感器?
 
見附件:TI BLE @ CES.pdf 
 
 
9、閒置階段,隨便玩玩
 
一、原理圖修改、檢查:
1)添加PCB天線和外置天線。
2)添加OLED顯示、電源指示燈、添加撥碼開關。
 
二、OLED選擇了一款內置升壓電路的型號與以前的像素一致:
1)選取內置升壓的OLED省去了升壓電路的設計。
2)實際通過調研科選擇 TPS61040做爲升壓芯片,知足需求(考慮到電感、續流二極管等物料很差採購的問題)。
 
三、肯定底板上物料在ERP中的型號,主要的器件目前都已經肯定、包括接插件。
 
四、調試CC2540的UART,調試OK可以打印信息:
1)發如今Advertising過程當中會出錯(測試了多種發送狀況,確認是Advertising時RF引發的)。
2)使用DMA、ISR都是一樣的狀況。
 
 
 
 
10、開始玩弄她吧
 
一、CC2540通訊創建過程調試:
1)找到UART在advertising過程當中發送數據亂碼的問題,使能低功耗(PWRMGR_BATTERY)會伴隨主時鐘的切換,致使波特率不穩定照成的,關閉低功耗數據正常,有待進步一學習,暫時不作深刻研究。
2)在調通串口的基礎上實現基本的通訊創建過程調試,主要是經過peripheral、central的例子,實現了PC經過串口向peripheral設備發送數據經過無線被central設備接收再經過串口傳輸至另外一臺PC。
 
Peripheral(Send):
 
01 82 fe 07 00 05 11 11 11 11 11
01 82 fe 07 00 05 22 22 22 22 22
 
 
Central(Receive):
 
04 FF 0D 1B 05 00 01 00 07 07 00 11 11 11 11 11 
04 FF 0D 1B 05 00 01 00 07 07 00 22 22 22 22 22 
 
以上參考:附件1、附件二。
 
二、Blood Pressure例程測試:
1)在新版本BLE-Stack1.21中未提供BP的Collector,只有一個BP Sensor,因此還須要花點時間創建Collector的工程。
2)在TI Wiki上找到了關於BLE-Stack1.1關於BP演示的說明,須要一個BleHealthDemo(C#開發)上位機的配合,Collector是工做在Network Process模式下。
 
測試效果參考:附件三。
 
三、開會提出的問題小結:
1)爲何要有Proflie?
A:Profile由藍牙SIG發佈,描述了不一樣設備使用藍牙協議棧時的差別性和統一性。好比一個血壓計,你們都按照這個BP Profile、BP Service來進行規範定義,那麼一個BP收集器就可以收集不一樣廠家生產的BP Sensor測量的血壓值等。若是沒有Profile關有協議那麼你們都只能閉門造車,我生產的手機帶藍牙功能,那麼你使用的藍牙耳機就必須是我生產的,由於那些數據格式、設備描述等只有我知道,因此纔有音頻Profile(A2DP)以後你們按照這個規範去嚴格定義本身的設備就能夠了。
 
2)BT流行版本的Profile比較:
我所理解的在BT2.0、BT2.一、BT3.0這些版本可以使用傳統Profile,而4.0以後會多出一部分GATT-Basic規範Profile。
 
這裏咱們須要理解的是:
BT2.0 = Core Version2.0 +EDR
BT2.1 = Core Version2.1 +EDR
BT3.0 = Core Version3.0 +HS
BT4.0 = Core Version4.0 +BLE = BR/EDR + BLE(這裏和以往不一樣,V4.0有兩個核心, CC2540只有BLE)
 
對於血壓計:
 
V4.0 版本使用BP Profile(Blood Pressure Profile)+ BP Service
V4.0 以前版本使用HD Profile(Human Device Profile)
 
HD Profile(健康規範)包括 BP Profile(血壓規範) + HT Profile(溫度規範)+ ……
 
這些規範能夠從官方網站查看:
 
以上參考:附件4、附件五。
 
三、附件:
 
附件一
 
附件二
 
附件三
 
附件四
 
附件五
 
 
11、血壓計分析
 
 
一、Blood Pressure示例程序佔用資源(256K Flash + 8K RAM):
 
二、Blood Pressure Profile規定的數據格式:
 
 
三、Profile 定義了數據格式、過程、服務的UUID等:
 
 
以上這些會在協議屬性表中體現,而這個屬性表會經過相關API將他做爲參數傳給協議棧。
 
static gattAttribute_t bloodPressureAttrTbl[] = 
{
    // BloodPressure Service
    { 
        { ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */
        GATT_PERMIT_READ,                                 /* permissions */
        0,                                                          /* handle */
        (uint8 *)&bloodPressureService                   /* pValue */
    },
    
    // 1. Characteristic Declaration
    { 
        { ATT_BT_UUID_SIZE, characterUUID },
        GATT_PERMIT_READ,
        0,
        &bloodPressureTempProps 
    },
    
    // 2. Characteristic Value
    { 
        { ATT_BT_UUID_SIZE, bloodPressureTempUUID },
        0, //return READ_NOT_PERMITTED
        0, 
        &bloodPressureTemp 
    },
    
    // 3.Characteristic Configuration
    { 
        { ATT_BT_UUID_SIZE, clientCharCfgUUID },
        GATT_PERMIT_READ | GATT_PERMIT_WRITE, 
        0, 
        (uint8 *)&bloodPressureMeasConfig
    },
    // 4.Presentation Format
    { 
        { ATT_BT_UUID_SIZE, charFormatUUID },
        GATT_PERMIT_READ, 
        0, 
        (uint8 *)&bloodPressureTempFormat
    },
    
    
    //////////////////////////////////////////////
    // IMMEDIATE MEASUREMENT
    //////////////////////////////////////////////
    
    // 5.Characteristic Declaration
    { 
        { ATT_BT_UUID_SIZE, characterUUID },
        GATT_PERMIT_READ, 
        0,
        &bloodPressureImeasProps 
    },
    
    // 6.Characteristic Value
    { 
        { ATT_BT_UUID_SIZE, bloodPressureImeasUUID },
        0, //return READ_NOT_PERMITTED
        0, 
        &bloodPressureImeas 
    },
    
    // 7.Characteristic Configuration
    { 
        { ATT_BT_UUID_SIZE, clientCharCfgUUID },
        GATT_PERMIT_READ | GATT_PERMIT_WRITE, 
        0, 
        (uint8 *)&bloodPressureIMeasConfig
    },
    
    
    //////////////////////////////////////////////
    // FEATURE
    //////////////////////////////////////////////
    
    // 8.Characteristic Declaration
    { 
        { ATT_BT_UUID_SIZE, characterUUID },
        GATT_PERMIT_READ, 
        0,
        &bpFeatureProps 
    },
    
    // 9.Characteristic Value
    { 
        { ATT_BT_UUID_SIZE, bpFeatureUUID },
        GATT_PERMIT_READ,
        0, 
        (uint8 *)&bpFeature 
    },
      
};

 
好吧,第一章分享到這裏結束了,只是簡簡單單的幫助初學者入門,權當玩玩,專業開發者請忽略。不排除本身理解和排版形成的問題,請自行判斷,謝謝。
 
 
後續會上傳代碼和相關文檔,並繼續開貼說第二章
 
 
哈,但願ti能給個包包硬盤啥的,鼓勵一下。
相關文章
相關標籤/搜索