This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC2564:SCO over HCI:如何使用 CC2564流式传输音频

Guru**** 2587345 points
Other Parts Discussed in Thread: CC2564

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/717720/cc2564-sco-over-hci-how-to-stream-audio-with-cc2564

主题中讨论的其他器件:CC2564

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