ART 编号:CC2564
又名:HFP over HCI
您好,
想与您分享我在 CC2564x 和 Bluetopia Stack 的体验。
目标 正在回传免提音频集的音频。
CC2564x 支持辅助音频、其中控制器通过其 I2S/PCM 接口自动管理进出外部编解码器的音频帧。
辅助音频功能非常强大,它将 MCU 卸载以管理音频。 MCU 就像 MSP430一样简单,可以管理高频甚至 A2DP 质量的音频。
典型的用例是连接到 CC2564x 以使用免提系统的 GSM 调制解调器。
有时,您需要“播放”一些音频消息,例如警报。 "电池电量不足"
我们的目标是让控制器( CC2564x )将音频帧“传递”到主机 MCU,让 MCU 管理音频、混合音频、播放录制的样本或即时合成音频。
基本前提是您的环境支持 HCI 上的 SCO 音频帧。
要验证您的环境是否正常,请在 BSC_Initialize(…)之后立即发布以下 API;
RET_val = SCO_SET_physical 传输(BluetoothStackID、sptHCI);
显示(("SCO_SET_physical_Transport ret_val=%d \r\n"、ret_val);
if (ret_val == BTPS_ERROR_FEATE_NOT_Available)/*(-103)*/
{
显示("SCO over HCI 在您的平台上不受支持\r\n);
while (1){}
}
中提供了 SCO_SET_physical 传输 API 的说明
documentation\API Documentation\BluetopiaCoreAPI.pdf 以及以下报告的内容
RET_val = SCO_SET_physical 传输(BluetoothStackID、sptHCI);
将控制器设置为通过 HCI 流式传输 SCO ( HFP ),而不是使用其 PCM/I2C 接口。
如果你有103,你就不能参加比赛了!
下一步(可选)是设置控制器以启用错误数据报告
//HCI_Write_Default_Erroneus_Data_Reporting 0x0c5b、0x01;
HCI_Write_Default_Errent_Data_Reporting (BluetoothStackID、HCI_Rault_data_reporting_enabled、&StatusResult);
显示(("HCI_Write_Default_Erronical_Data_Reporting=%d \r\n",StatusResult);
现在是设置 SCO 配置的时候了:
(参考: http://processors.wiki.ti.com/index.php/CC256x_VS_HCI_Commands )
//HCI_VS_Write_SCO_Configuration 0xFE10、1、120、720、1
params.connection_type = 1; // 0=codec,1=主机
params.TX_buffer_size = 120; // TX 缓冲区大小= 120字节;
params.TX_buffer_latency = 720;//延迟(以字节为单位)
params.accept_packet_with _Bad_crc = 1;//接受带有坏 CRC 的数据包
RET_val = VS_Write_SCO_Configuration (BluetoothStackID、&Params);
显示(("VS_Write_SCO_Configuration ret_val=%d \r\n"、ret_val);
实验: 回传来自免提系统麦克风的音频帧
一旦启用了 SCO over HCI,并且连接了 SCO 后,您将收到 etHFRE_Audio_Data_Indication 事件以及 HF 发送的音频数据。
要将它们回传至源极(在高频扬声器上收听它们),您只需将它们重新注入 SCO 即可。
这要归功于 Bluetopia 的 API HFRE_Send_Audio_Data();
中提供了 HFRE_Send_Audio_Data API 的说明
documentation\API Documentation\HandsFreeProfileAPI.pdf 以及以下报告的内容
静态空 BTPSAPI HFRE_Event_Callback (unsigned int BluetoothStackID、HFRE_Event_Data_t * HFREEventData、unsigned long CallbackParameter)
{
BoardStr_t BoardStr;
INT 结果;
byte_t testa;
HFRE_Audio_Data_Inding_Data_t* Pippo;
/*首先,检查所需参数是否显示为 */
/*半有效。 *
if (HFREEventData!=空)
{
/*参数看起来是半有效的,现在检查*/
/*键入传入事件。 *
switch (HFREEventData->Event_Data_Type)
{
案例 etHFRE_Audio_transmit 缓冲区 empty_indication:
显示(("\r\nnetHFRE_Audio_transmit Buffer_empty_inding\r\n");
中断;
案例 etHFRE_Audio_Data_indication:
HFRE_Send_Audio_Data (BluetoothStackID、HFREventData->Event_Data.HFRE_Open_Port_Inding_Data->HFRPortID、
(HFREEventData->Event_Data.HFRE_Audio_Data_Inding_Data->AudioDataLength)、
(HFREEventData->Event_Data.HFRE_Audio_Data_Inding_Data->AudioData );
中断;
……μ A
如何设置:
1- 选择 HFPDemo_AG 项目
2- 设置 SCO over HCI:
/*初始化应用程序。 *
if ((结果= InitializeApplication (&HCI_DriverInformation、&BTPS_Initialization))> 0)
{
/*保存蓝牙堆栈 ID。 *
BluetoothStackID =(无符号 int)结果;
结果= SCO_SET_physical 传输(BluetoothStackID、sptHCI);
显示(("SCO_SET_physical_Transport ret_val=%d \r\n",结果);
if (结果=BTPS_ERROR_FEATE_NOT_Available)/*(-103)*/
{
显示("SCO over HCI 在您的平台上不受支持\r\n);
while (1){};
}
3- 在 HFPDemo_AG.c 中添加以下内容:
静态 int SetupAudio( ParameterList_t *TempParam )
{
int ret_val;
byte_t StatusResult;
VS_Write_SCO_Configuration_Params_t 参数;
AudioDataCount=0;
/*首先检查是否存在有效的蓝牙堆栈 ID。 *
if (蓝牙 StackID)
{
//HCI_Write_Default_Erroneus_Data_Reporting 0x0c5b、0x01;
HCI_Write_Default_Errent_Data_Reporting (BluetoothStackID、HCI_Rault_data_reporting_enabled、&StatusResult);
显示(("HCI_Write_Default_Erronical_Data_Reporting=%d \r\n",StatusResult);
//HCI_VS_Write_SCO_Configuration 0xFE10、1、120、720、1
params.connection_type = 1;//主机
params.TX_buffer_size = 120;// TX 缓冲区大小= 120字节;
params.TX_buffer_latency = 720;//延迟(以字节为单位)
params.accept_packet_with _BAD_CRC = 1;//Accepet
RET_val = VS_Write_SCO_Configuration (BluetoothStackID、&Params);
显示(("VS_Write_SCO_Configuration ret_val=%d \r\n"、ret_val);
}
返回 RET_val;
}
并从 HFRESetupAudioConnection 调用它:
静态 int HFRESetupAudioConnection (空)
{
INT 结果;
int ret_val;
/*首先,检查是否存在有效的蓝牙堆栈 ID。 *
if (蓝牙 StackID)
{
/*现在检查以确保端口 ID 显示为 */
/*半有效。 *
if (CurrentClientPortID)
{
/*端口 ID 显示为半有效值。 现在提交 */
/*命令。 *
结果= HFRE_Setup_Audio_Connection (BluetoothStackID、CurrentClientPortID);
/*将此函数的返回值设置为等于*/的结果
/*函数调用。 *
RET_val =结果;
/*现在检查命令是否已成功提交。 *
if (!result)
{
/*此功能已成功提交。 *
显示("HFRE_Setup_Audio_Connection:功能成功。\r\n);
SetupAudio (空);
}
其他
{
/*提交功能时出错。 *
显示(("HFRE_SETUP_Audio_Connection()失败:%d.\r\n"、结果));
}
4- 重建并加载项目
如何测试:
1- 打开 HF 系统
2- 运行“查询”以检测您的 HF 集。 在 发现的 MAC 列表中记下位置 X (ID)。
3- 问题“ServiceDiscovery X 12”,其中 X 是 HF 系统列表上的 ID,12是 HFP 服务器。 获取端口号时需要执行此操作
4- 找到 Attribute ID 0x0004、UUID_16=0x0003 -> Unaligned int =0x0Y 、其中 Y 是端口号
5- “OpenClientServer X Y”,其中 X 是 HF 系统列表上的 ID,Y 是端口号
6- 发出“managaudio 1”连接音频。
在此步骤中、由高频麦克风捕获的音频数据将发送回其扬声器。
希望您能喜欢这个快速又脏的教程。
Paolo
