蓝牙技术
直播中

刘丹

8年用户 1563经验值
私信 关注
[问答]

CYW20721如何在A2DP接收器中更改I2S时钟设置?

CYW20721 DS 提到的主模式下的 I2S 时钟可以是:

  • 44.1 kHz x 每帧 32 位 = 1411.2 千赫
  • 48 kHz x 每帧 32 位 = 1536 kHz
我能知道如何为这 2 个设置设置 I2S 时钟吗?

回帖(1)

陈静

2025-7-10 18:10:31

在 CYW20721 上配置 A2DP 接收器端的 I2S 时钟(特别是设置为主模式下的 1411.2 kHz 或 1536 kHz),主要通过 Wiced HCI 音频控制命令 hci_control_audio 来实现。你需要关注该命令中 Configuration Settings (Config Settings) 参数的特定位(Bit)。


以下是具体的配置步骤和示例代码:


? 关键配置位 (Config Settings Bits)



  1. I2S Master Clock Select (Bit 2-1 of Config Settings, I2S_MCLK_SEL):  

    • 00 (0x00 << 1) = 1536 kHz Master Clock (适用于 48kHz 采样率)

    • 01 (0x01 << 1) = 1411.2 kHz Master Clock (适用于 44.1kHz 采样率)



? 配置命令 hci_control_audio


使用 hci_control_audio命令设置 A2DP Sink 的音频参数。结构体定义通常包含采样率(sampleRate)和配置设置(configSettings)。


wiced_result_t hci_control_audio(
    uint16_t connectionHandle,    // 连接句柄
    uint8_t audioHandle,          // 音频句柄 (通常为 0x01)
    AUDIO_SOURCE_T audioSource,   // 音频源 (A2DP_SINK_AUDIO)
    uint8_t sampleRate,           // 采样率 (可设为0或对应值,时钟主要由下面配置)
    uint8_t configSettings        // 配置设置位 (关键)
);

⚙️ 配置示例




  1. 设置 I2S MCLK = 1536 kHz (48kHz 场景):  


    configSettings = 0; // 默认值通常为0
    // 确保 MCLK_SEL 位[2:1] 设置为 00 (1536kHz)
    configSettings &= ~(0x03 << 1); // 清除位 [2:1]
    // configSettings |= (0x00 << 1); // 0x00 即是默认值, 这行可省略

    result = hci_control_audio(
       a2dp_connection_handle,
       0x01, // 音频句柄
       A2DP_SINK_AUDIO,
       0, // sampleRate 参数对 I2S MCLK 无直接影响
       configSettings
    );



  2. 设置 I2S MCLK = 1411.2 kHz (44.1kHz 场景):  


    configSettings = 0; // 默认值通常为0
    // 设置 MCLK_SEL 位[2:1] 为 01 (1411.2kHz)
    configSettings &= ~(0x03 << 1); // 清除位 [2:1]
    configSettings |= (0x01 << 1);  // 设置位[2:1] 为 0b01

    result = hci_control_audio(
       a2dp_connection_handle,
       0x01, // 音频句柄
       A2DP_SINK_AUDIO,
       0, // sampleRate 参数对 I2S MCLK 无直接影响
       configSettings
    );



? 重要说明



  • 连接建立后调用: 此命令应在 A2DP 连接建立并配置为 Sink 后调用,但在音频流开始传输之前。

  • 采样率 (sampleRate): 对于 I2S 主时钟设置,sampleRate 参数并非直接决定 MCLK。它用于内部同步逻辑,但实际时钟频率由 configSettings 控制。设为 0 或正确的 AUDIO_SAMPLE_RATE_48K / AUDIO_SAMPLE_RATE_44_1K 均可(建议设为对应的值)。

  • BCLK (位时钟):  

    • 48kHz 32bit/帧: 1536 kHz (MCLK) / (64 LRCK cycles) = 48kHz * 2 (stereo) * 32 (bits) = 3.072 MHz

    • 44.1kHz 32bit/帧: 1411.2 kHz (MCLK) / (64 LRCK cycles) = 44.1kHz * 2 (stereo) * 32 (bits) = 2.8224 MHz

    • BCLK 由 CYW20721 在 I2S 主模式下自动产生,开发者无需直接设置。


  • 芯片限制: 确认 CYW20721 硬件支持所选时钟频率。

  • I2S 接口配置: 除了时钟频率,还需正确配置 I2S 的:

    • 模式 (I2S, Left-Justified 等)

    • 数据长度 (32位)

    • 声道模式 (Stereo)

    • BCLK / LRCK 极性



? 调试建议



  1. SDK 参考: 检查 hci_control_audio.hconfigSettings 位的定义(如 AUDIO_CONFIG_I2S_CLK_SEL_*)。

  2. AIROC 工具: 使用 Infineon 的 AIROC™ Bluetooth® LE Protocol Viewer 监控 HCI 命令,观察实际发送的 configSettings 值。

  3. 信号测量: 用示波器测量 CYW20721 的 I2S_MCLK 引脚,验证是否为预期的 1411.2 kHz 或 1536 kHz。

  4. 编译选项: 确保工程预编译选项中启用了音频支持(如 ENABLE_AUDIO, ENABLE_A2DP)。


? 总结


设置核心就是通过 hci_control_audio 命令的 configSettings 参数,精确控制其第 2 位和第 1 位 (即 I2S_MCLK_SEL[1:0]):



  • 00 ➡️ 1536 kHz (48 kHz)

  • 01 ➡️ 1411.2 kHz (44.1 kHz)


将此命令在适当时机(连接建立后,音频开始前)发送给 CYW20721 固件即可生效。在实际操作中,建议结合 SDK 中的音频示例代码(如 a2dp_sink)进行修改验证,同时做好信号验证工作。??️

举报

更多回帖

发帖
×
20
完善资料,
赚取积分