公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

嗨,你好,

我希望让 A2DP 接收器与我的 PSOC6 板 CY8C-06-4343W 一起工作,所以我完成了 A2DP 源示例以及一些较早的 btstack 和 Linux ,并且能够让 A2DP 接收器大部分工作。 我有通过 i2s 输出到 pmod i2s2 设备然后输出到扬声器。

从我可以的意义上说,一切都在起作用:

-通过蓝牙连接到水槽设备

-当我按下播放时听到音乐在播放

音乐失真得很厉害。 我对这里的 i2s 时钟配置还很陌生,但我一直在整理帮助文章,希望弄清楚可能是什么原因。 我已经设置了邪恶的配置使其连接频率超过 44.1khz 然后将 mclk 设置为 256 * 44100 以根据此处列出的 mclk 值获得 11289 600:https://digilent.com/reference/pmod/pmodi2s2/reference-manual— 我将设备当前设置为从属模式,我将音频时钟设置为 mclk 的 8 倍。

我确实能听见声音所以从某种意义上说,事情正在起作用,但它有很多静电。

有人知道这里可能是什么原因吗? 我本来希望把这个例子当作社区贡献来推广,因为我需要A2DP接收器功能来完成我正在开发的项目,但是现在有点麻烦,因为我根本无法弄清楚这个声音失真问题。 我已经把代码推到这里了(很抱歉搞得一团糟,在我担心自己之前还在努力让事情完全正常运行):https://github.com/Cosmic-Bee/PSoC6_Bluetooth_A2DP_Sink

我把我的音频编解码器功能设置为 44.1khz 来强制这样做。

 

 

 

wiced_bt_a2dp_codec_info_t bt_audio_codec_capabilities[] =
{
   {
       .codec_id = WICED_BT_A2DP_CODEC_SBC,
       .cie =
       {
           .sbc =
           {
               (A2D_SBC_IE_SAMP_FREQ_44),    /* samp_freq */
               (A2D_SBC_IE_CH_MD_MONO   | A2D_SBC_IE_CH_MD_STEREO |
                A2D_SBC_IE_CH_MD_JOINT  | A2D_SBC_IE_CH_MD_DUAL),      /* ch_mode */
               (A2D_SBC_IE_BLOCKS_16),        /* block_len */
               (A2D_SBC_IE_SUBBAND_4    | A2D_SBC_IE_SUBBAND_8),       /* num_subbands */
               (A2D_SBC_IE_ALLOC_MD_L   | A2D_SBC_IE_ALLOC_MD_S),      /* alloc_mthd */
               BT_AUDIO_A2DP_SBC_MAX_BITPOOL,                          /* max_bitpool for high quality audio */
               A2D_SBC_IE_MIN_BITPOOL                                  /* min_bitpool */
           }
       }
   }
};

 

 

 

 

我有我的时钟逻辑:

 

 

 

/* Master Clock (MCLK) Settings */
#define SAMPLE_RATE_HZ		44100u
#define MCLK_FREQ_HZ        (256u * SAMPLE_RATE_HZ)    /* in Hz (Ideally 4.096 MHz) */

#define MCLK_DUTY_CYCLE     50.0f       /* in %  */
/* Clock Settings */
#define AUDIO_SYS_CLOCK_HZ  (MCLK_FREQ_HZ * 8u)   /* in Hz (Ideally 98.304 MHz) */
/* PWM MCLK Pin */
#define MCLK_PIN            P5_0
/* Debounce delay for the button */
#define DEBOUNCE_DELAY_MS   10u         /* in ms */
/* HFCLK1 Clock Divider */
#define HFCLK1_CLK_DIVIDER  4u

 

 

 

我用这些方法初始化时钟:

 

 

 

static void clock_init(void)
{
    /* Initialize the PLL */
    cyhal_clock_reserve(&pll_clock, &CYHAL_CLOCK_PLL[0]);
    cyhal_clock_set_frequency(&pll_clock, AUDIO_SYS_CLOCK_HZ, NULL);
    cyhal_clock_set_enabled(&pll_clock, true, true);

    /* Initialize the audio subsystem clock (HFCLK1) */
    cyhal_clock_reserve(&audio_clock, &CYHAL_CLOCK_HF[1]);
    cyhal_clock_set_source(&audio_clock, &pll_clock);

    /* Drop HFCK1 frequency for power savings */
    cyhal_clock_set_divider(&audio_clock, HFCLK1_CLK_DIVIDER);
    cyhal_clock_set_enabled(&audio_clock, true, true);

    /* Initialize the system clock (HFCLK0) */
    cyhal_clock_reserve(&system_clock, &CYHAL_CLOCK_HF[0]);
    cyhal_clock_set_source(&system_clock, &pll_clock);

    /* Disable the FLL for power savings */
    cyhal_clock_reserve(&fll_clock, &CYHAL_CLOCK_FLL);
    cyhal_clock_set_enabled(&fll_clock, false, true);
}

 

 

 

还有我的主要方法:

 

 

 

int main(void)
{
    cy_rslt_t result;

    /* Initialize and Verify the BSP initialization */
    result = cybsp_init();
    CY_ASSERT(CY_RSLT_SUCCESS == result);

   // cy_retarget_io_init(CYBSP_DEBUG_UART_TX, CYBSP_DEBUG_UART_RX, CY_RETARGET_IO_BAUDRATE);

/* Enable global interrupts */
    __enable_irq();

    clock_init();

#ifdef PSOC6_43012_BOARD
    result = cy_rgb_led_init(CYBSP_LED_RGB_RED, CYBSP_LED_RGB_GREEN, CYBSP_LED_RGB_BLUE, CY_RGB_LED_ACTIVE_LOW);
#endif
#ifdef PSOC6_4343W_BOARD
    result = cyhal_gpio_init(CYBSP_USER_LED, CYHAL_GPIO_DIR_OUTPUT, CYHAL_GPIO_DRIVE_STRONG, CYBSP_LED_STATE_OFF);
#endif

    if (result != CY_RSLT_SUCCESS)
    {
       // printf("Error: Failed to initialize LED \r\n");
        CY_ASSERT(0);
    }

    /* Initialize the Master Clock with a PWM */
    cyhal_pwm_init(&mclk_pwm, (cyhal_gpio_t) MCLK_PIN, NULL);
    cyhal_pwm_set_duty_cycle(&mclk_pwm, MCLK_DUTY_CYCLE, MCLK_FREQ_HZ);
    cyhal_pwm_start(&mclk_pwm);

    /* Wait for the MCLK to clock the audio codec */
    cyhal_system_delay_ms(1);

    /* Initialize the I2S */
    cyhal_i2s_init(&i2s, &i2s_pins, NULL, &i2s_config, &audio_clock);

   /* Initialising the HCI UART for Host control */
    cybt_platform_config_init(&cybsp_bt_platform_cfg);

    /* Creating BT task */
    bt_task_create();

    /* Start the FreeRTOS scheduler */
    vTaskStartScheduler();

    /* Should never get here */
    CY_ASSERT(0);
}

 

 

 

 

感谢你的帮助,很抱歉我在这里的天真(我尝试调试了一段时间但我对这个领域还很陌生,所以感觉有点像在苦苦挣扎但徒劳无功),

蒂姆

 

0 点赞
1 解答
Translation_Bot
Community Manager
Community Manager
Community Manager

我向分支推送了一个新的提交。 使用 ECO-PLL [0]-> CLK_HF [1] 我还能从 > PLL [0] 中采购 CLK_HF [0] 来获得几乎没有噪音的声音。 我用 90.3168Mhz 作为 PLL 所以我没用 CLK_PERI 的分频器。

我还调整了逻辑以使用缓冲区。

我觉得现在听起来还不错,尽管我希望我能消除信号中的最后一点噪音。 但是目前它已经足够不错了,可以满足我的需求,因为我几乎听不见,而且我听说英飞凌将来会开发 PSOC6 A2DP 水槽示例,所以在那之前我对它的质量很满意。

谢谢你的协助。

出于好奇,有没有办法让设备配置器为我处理 pwm 的创建? 我最初尝试完全通过设备配置器设置我的 i2,使用 CLK_HF [1] source 选项来获取 P5_0 处的 i2s 时钟,希望它能与我的 PMOD i2s2 配合使用,但我没有从信号中听到任何声音,所以把它改成了在代码中进行 PWM(但也许我搞砸了)。 理想情况下,本来可以在那里处理所有这些问题,但不确定是否可能。

不管怎样谢谢你的帮助。

在原帖中查看解决方案

0 点赞
3 回复数
Translation_Bot
Community Manager
Community Manager
Community Manager

我们有一个类似的代码示例。 你可以把它当作参考:https://github.com/Infineon/mtb-example-btsdk-audio-a2dp-sink

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

我向分支推送了一个新的提交。 使用 ECO-PLL [0]-> CLK_HF [1] 我还能从 > PLL [0] 中采购 CLK_HF [0] 来获得几乎没有噪音的声音。 我用 90.3168Mhz 作为 PLL 所以我没用 CLK_PERI 的分频器。

我还调整了逻辑以使用缓冲区。

我觉得现在听起来还不错,尽管我希望我能消除信号中的最后一点噪音。 但是目前它已经足够不错了,可以满足我的需求,因为我几乎听不见,而且我听说英飞凌将来会开发 PSOC6 A2DP 水槽示例,所以在那之前我对它的质量很满意。

谢谢你的协助。

出于好奇,有没有办法让设备配置器为我处理 pwm 的创建? 我最初尝试完全通过设备配置器设置我的 i2,使用 CLK_HF [1] source 选项来获取 P5_0 处的 i2s 时钟,希望它能与我的 PMOD i2s2 配合使用,但我没有从信号中听到任何声音,所以把它改成了在代码中进行 PWM(但也许我搞砸了)。 理想情况下,本来可以在那里处理所有这些问题,但不确定是否可能。

不管怎样谢谢你的帮助。

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

你好,

是的,您可以使用设备配置器来处理 PWM。请注意,您可以在 Modus 工具箱中使用基于 HAL 或 PDL 的开发(使用设备配置器)。

请参阅以下代码示例,该示例使用设备配置器进行 PWM 配置。

链接:https://github.com/Infineon/mtb-example-smartio-ramping-led/blob/master/README.md

 

谢谢,

P Yugandhar。

0 点赞