CC2540藍牙模塊學習(1)
本篇隨筆摘自於:http://www.cnblogs.com/yygsj/p/5135150.html#undefined
一、整體
1.TI的藍牙平臺支持2種協議棧/應用配置:單一設備配置、網絡處理器配置
2.協議棧最頂層2個通用profile:
GAP 通用訪問配置文件層 Generic Access Profile
GATT 通用屬性配置文件層 Generic Attribute Profile
3. GAP:處理設備的接入方式及接入過程:①設備發現 ②鏈路建立 ③鏈路終止 ④啟動安全功能 ⑤設備配置(主要是連接參數配置)
GATT:完成服務器與客戶端之間通信的相關子過程
4.BLE支持40個信道的跳頻機制,其中3個通道用於Advertise,剩下的用於數據通信
5.OS抽象層:疑問 如何配置一個新的任務,任務的優先級,事件觸發機制,消息的傳遞
6.主要用於實現的是2個代碼文件:
OSAL_SimpleBLEPeripheral.c 任務回調函數數據的定義 和 任務初始化函數定義 作為OSAL的外部全局變量
SimpleBLEPeripheral.c BLE應用程序的實現代碼,該源文件調用一系列的BLE API函數,完成復雜的藍牙協議
通過 const pTaskEventHandleFn tasksArr[] 數組來存儲要調用的函數
simpleBLEPeripheral.h 一些常量的定義,和藍牙應用程序任務初始化和任務回調函數聲明。
7.LL層任務函數優先級 最高, 而應用程序函數的優先級最低
8.OSAL為每個任務分配了1個16位的Event,每一位代表一個事件,最高位代表SYS_EVENT_MSG,這個事件被OSAL系統保留
9.main()函數中最後進入的 void osal_run_system( void ),這個函數就是看相應任務有沒有事件發生,有時間發生就跳轉到相應的函數
10.任務間通信,一般通過 事件 和 消息 進行,每當任務間有消息傳遞,都會觸發SYS_EVENT_MSG事件,並且每次處理完事件後,都要清空標誌位。
osal_set_event() OSAL.h中 該函數會直接調度一個事件
osal_start_timerEx() OSAL_Timers.h中 需要掩飾觸發的事件,調用這個函數
11.Heap Manager(堆棧管理),函數osal_mem_alloc,給函數分配需要的字節數,osal_mem_free()用來釋放內存。
二、OSAL( 操作系統抽象層 Operate System Abstraction Layer )
1.OSAL中的消息:
發送消息前,用osal_msg_allocate()函數分配內存空間,填充數據,調用osal_msg_send()將消息發送到指定的函數中去。然後置位該函數的SYS_EVENT_MSG,然後接收端使用osal_mem_receive()將消息接收過來,接收完成後,使用osal_mem_deallocate()函數來回收當前消息所占用的內存。OSAL推薦在任務中使用獨立的消息接收函數來處理消息,例如: simpleBLEPeripheral_ProcessOSALMsg()函數。
2.GAP (通用訪問配置文件層 Generic Access Profile )
連接過程:①設備發現 ②鏈路建立 ③鏈路終止 ④啟動安全功能 ⑤設備配置(主要是連接參數配置)
GAP層總是工作在以下角色中的1種:
Broadcaster 廣播員,表明我在,但是你們只能看到我,不可以連接我
Observer 觀察者,看看誰在,我只觀察,不連接
Peripheral 外設,我存在,設想連我,我就連誰
Centeral 中心,看看誰在,工作在單層或多層的連接
3.連接過程: Peripheral向外廣播->Centeral接收到向從機發送“Scan”命令->Peripheral以“ScanResp”命令回應->Centeral發送連接請求
4.Connect Interval 通信間隙 每個間隔1.25ms為基本單位,最小6單位7.5mS,最大3200單位4.0S。
5.Slave Latency 從機延時 表示Peripheral可以連續忽略的連接數,最大不能超過499個,最長不能超過32S。
6.Supervision Timeout 監管超時 2個成功連接事件之間的最大間隔。
7.Profile 一種規範 ; Service 一個服務 ; Characteristic 特征值 ; UUID 統一標識碼(Service,Characteristic都需要),Centeral與Peripheral間的通信,均通過Characteristic實現
8.發送數據
主->從 Client調用GATT_WriteCharValue()函數發送;
從->主 Service調用GATT_Notification()函數實現。
9.接收數據
從<-主 從機接收後,會產生1個GATT_Profile_Callback調用;
三、BLE
四、低功耗部分
1.如何總是在PM1
osal_pwrmgr_device( PWRMGR_ALWAYS_ON );
2.如何進入PM2
osal_pwrmgr_device( PWRMGR_BATTERY );在空閑的時候就會進入到PM2模式
3.如何進入PM3
存在連接就斷開連接,存在廣播就停掉廣播,並確認自己創建的所有定時任務都已關閉,則系統應該就會進入PM3模式,只能進行外部中斷喚醒
4.CC2540低功耗中引腳的設置問題
不用的引腳應該與外部不連接,並將引腳配置為通用上拉輸入狀態(除了P1.0,P1.1),並且這些腳不應該與VDD,GND直接相連。
*關於P1.0,P1.1,“User Guide”給出的解釋是"except P1.0 and P1.1, which do not have pullup/pulldown capability",字面意思是沒有上下拉能力,可是我沒理解,這個上下拉,是指什麽。。。
五、常用的命令,功能,以及實現方法
1.切換電源模式
osal_pwrmgr_device( PWRMGR_ALWAYS_ON );
osal_pwrmgr_device( PWRMGR_BATTERY );
2.Peripheral怎麽主動斷開與Centeral的連接
bStatus_t GAPRole_TerminateConnection(); 在文件peripheralBroadcaster.c文件中
3.怎麽設置Peripheral的廣播的超時時間
首先保證是限制類型的廣播 即DEVDISC_MODE_LIMIT(永久廣播是 DEVDISC_MODE_GENERAL ),在 simpleBLEPeripheral.c文件 static uint8 advertData[]數組中設置。
當模式處於Limit模式時,廣播超時的設置可通過設置宏 TGAP_LIM_ADV_TIME_OUT,不設置的話,默認超時時間是180S。
4.如何打開與關閉廣播
uint8 initial_advertising_enable = TRUE/FALSE TRUE:打開廣播 FALSE:關閉廣播
GAPRole_SetParameter( GAPROLE_ADVERT_ENABLED, sizeof(uint8), &initial_advertising_enable );
分類: 藍牙CC2540藍牙模塊學習(1)