CSR8670项目实战:BluePager蓝牙寻呼机
生活随笔
收集整理的這篇文章主要介紹了
CSR8670项目实战:BluePager蓝牙寻呼机
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
為了讓CSR867x的開發更容易,現與思度科技聯合推出CSR867x學習板【淘寶鏈接:思度科技CSR開發板】。
技術交流QQ群號:743434463
開發板會員QQ群號:725398389(憑訂單號入群,贈PPT、項目源碼、視頻教程)
——————————正文分割線———————————–
1. 引言
BluePager藍牙尋呼機是一款功能強大的藍牙source設備,可以作為無線對講機的藍牙功能擴充模塊,將無線對講機與藍牙耳機無縫對接。
2. 主要功能
系統框圖如下:
主要功能有:
| 1 | A2DP播放音樂 | 支持source->sink音樂通過I2S輸入,支持SBC, APTX, APTX-LL | 48K,立體聲,16bit,8670做I2S slave |
| 2 | AVRCP控制 | 支持sink端的播放、暫停、音量、上下曲、快進快退等按鍵動作 | – |
| 3 | HFP語音通話 | 支持source->sink語音通過模擬輸入,sink->source語音通過模擬輸出 | 8K,單聲道,16bit |
| 4 | 支持末碼重播 | sink設備按下末碼重播鍵,source進入HFP語音通話狀態 | – |
| 5 | 支持撥號語音提示 | source設備發送撥號->sink設備,sink設備播放撥號提示音 | – |
| 6 | 支持RSSI配對 | source設備只會同RSSI值大于門限值的sink設備配對 | – |
| 7 | 串口通信 | 支持MCU通過串口控制 | 38400bps,8bit,1停止位,0校驗位,無流控 |
串口命令交互表
| 1 | 讀取sink設備信息 | MCU->CSR8670 | AT#state | 名稱、地址、信號強度、協議、電量、當前解碼格式 |
| 2 | sink設備末碼重播通知 | CSR8670->MCU | NTF#lastnum | sink設備按下末碼重播鍵,進入aghfp通話模式 |
| 3 | sink設備avrcp操作通知 | CSR8670->MCU | NTF#avrcp | sink設備avrcp命令(透傳avrcp鍵值,參考avc_operation_id定義) |
| 4 | sink設備連接完成通知 | CSR8670->MCU | NTF#connected | sink設備連接完成 |
| 5 | source設備發起免提通話 | MCU->CSR8670 | AT#callsco | source設備已啟動免提通話,無需sink按下接聽鍵 |
| 6 | source設備撥號呼叫sink設備 | MCU->CSR8670 | AT#outcall | source設備進入撥號狀態,sink設備可聽到0-1-2-3-4-5-6-7-8-9數字 |
| 7 | source設備撥號呼叫本地接聽 | MCU->CSR8670 | AT#OUTCALL | source設備本地接聽撥號呼叫,進入免提通話,無需sink按下接聽鍵 |
| 8 | source設備RSSI連接A2DP | MCU->CSR8670 | AT#A2DP RSSI50 | source設備開始搜索RSSI為-50dBm以下的信號最強的設備,連接A2DP source設備已搜索到目標設備,開始配對 |
| 9 | source設備RSSI連接A2DP+HFP | MCU->CSR8670 | AT#A2DP+HFP RSSI90 | source設備開始搜索RSSI為-90dBm以下的信號最強的設備,連接A2DP+HFP source設備已搜索到目標設備,開始配對 |
| 10 | source主動斷開連接 | MCU->CSR8670 | AT#disconnect | source設備主動斷開連接,進入idle狀態 |
| 11 | sink斷開連接 | CSR8670->MCU | NTF#disconnect | sink設備主動斷開連接,source進入idle狀態 |
| 12 | source設備paging連接A2DP | MCU->CSR8670 | AT#A2DP PAGE1c521600045ac7 | source設備直接page目標藍牙地址的設備,連接A2DP |
| 13 | source設備paging連接A2DP+HFP | MCU->CSR8670 | AT#A2DP+HFP PAGE1c521600045ac7 | source設備直接page目標藍牙地址的設備,連接A2DP+HFP |
3. 項目難點
此項目的需求的定制化程度很高,在ADK4.1的基礎上做了很多修改。
3.1. 獲取sink電池電量
ADK4.1默認是不能解析電池電量的HFP AT command消息的,需修改source_aghfp_msg_handler.c的代碼,方法如下:
/* indication of unrecognised AT command */ case AGHFP_UNRECOGNISED_AT_CMD_IND: {AGHFP_MSG_DEBUG(("AGHFP_UNRECOGNISED_AT_CMD_IND:\n")); len = ((AGHFP_UNRECOGNISED_AT_CMD_IND_T *)message)->size_data;c = ((AGHFP_UNRECOGNISED_AT_CMD_IND_T *)message)->data; #if 0 AGHFP_MSG_DEBUG(("unrecognised at cmd size %d:\n", len)); for (i = 0; i < len; i++){putchar(*(c+i)); }printf("\n"); #endif/* AT+IPHONEACCEV=2,1,8,2,0\r */if (len == 25){if ((c[0] == 'A') && (c[1] == 'T') && (c[2] == '+') && (c[3] == 'I')&& (c[4] == 'P') && (c[5] == 'H') && (c[6] == 'O') && (c[7] == 'N')&& (c[8] == 'E') && (c[9] == 'A') && (c[10] == 'C') && (c[11] == 'C')&& (c[12] == 'E') && (c[13] == 'V') && (c[14] == '=')){bluetest_update_device_bat((c[19]-'0'));AghfpSendOk(((AGHFP_RESPONSE_HOLD_STATUS_REQUEST_IND_T *)message)->aghfp);}else{AghfpSendError(((AGHFP_UNRECOGNISED_AT_CMD_IND_T *)message)->aghfp); }}else{AghfpSendError(((AGHFP_UNRECOGNISED_AT_CMD_IND_T *)message)->aghfp); } } return;3.2. AGHFP模式使能AUX in/out
參考CSR8670項目實戰:BlueCar藍牙音頻網關。
3.3. 獲取sink設備的RSSI值和名稱
ADK4.1的source工程在默認狀態下沒有使能inquiry_eir_mode,不能在搜索狀態下獲取sink設備的RSSI值和名稱。
獲取RSSI值的代碼修改方式如下:
/* connection_msg_handler in source_connection_msg_handler.c */if (((CL_INIT_CFM_T *)message)->version == bluetooth2_1) {/* EIR inquiry mode */ConnectionWriteInquiryMode(&theSource->connectionTask, inquiry_mode_eir); } else {/* EIR inquiry mode */ConnectionWriteInquiryMode(&theSource->connectionTask, inquiry_mode_eir); }獲取設備名稱的代碼修改方式:
/* inquiry_parse_eir_data in source_inquiry.c */else if ((*(p+1) == EIR_TYPE_REMOTE_NAME_SHORTENED) || (*(p+1) == EIR_TYPE_REMOTE_NAME_COMPLETE)) {result.device_name_size = *p;INQUIRY_DEBUG(("device_name_size: %d\n", result.device_name_size));if (result.device_name_size > (REMOTE_DEVICE_NAME_MAX_SIZE-1)){result.device_name_size = REMOTE_DEVICE_NAME_MAX_SIZE-1;}memcpy(result.device_name_buf, (const uint8 *)(p+2), result.device_name_size);result.device_name_buf[result.device_name_size] = '\0';bluetest_update_device_name(result.device_name_buf, (result.device_name_size+1));INQUIRY_DEBUG(("device_name: %s\n", result.device_name_buf)); }4. 總結
通過此項目對source模式的深度定制開發,發現CSR的ADK有很強的可塑性和靈活性,并且隱藏著驚人的潛能。
在BluePager的基礎上,可以進一步拓展功能。如支持更多輸入源(USB, SPDIF等)、一拖二尋呼等。
總結
以上是生活随笔為你收集整理的CSR8670项目实战:BluePager蓝牙寻呼机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cdo(Climate Data Ope
- 下一篇: Openacc多卡优化Floyd算法