查看: 3602|回复: 1

[求助] Kinetis KL46Z通过I2S读取AIC3104的问题

[复制链接]
  • TA的每日心情
    奋斗
    2020-5-18 11:57
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    15

    帖子

    0

    注册会员

    Rank: 2

    积分
    152
    最后登录
    2020-10-20
    发表于 2020-5-23 13:19:44 | 显示全部楼层 |阅读模式
    最近在调KL46Z开发板,通过I2S(SAI)口读AIC3104的MIC数据。因为M0+系列MCU不能直接Fs=44.1KHz对应的MCLK和BCLK,所以让KL46Z输出24MHz给AIC3104,然后AIC3104产生对应的BCLK和WCLK,AIC3104工作在Master模式,KL46Z在Slave模式。
    I2C没有问题,可以写并读取寄存器值,但I2S一直读不到任何数据。手边暂时没有示波器,但是我把BCLK,WCLK和Data的数据线接到LED灯上都可以点亮,Data接LED后声音变化闪烁明显,说明AIC3104端工作应该是正常的。各位高手能帮忙分析下是什么原因么?

    I2S部分代码如下:

    const sai_config_t codec_config = {
      .protocol = kSAI_BusI2S,                       // Uses I2S format.
      .syncMode = kSAI_ModeAsync,               // Synchronous mode with receiver
      .mclkOutputEnable = true,                     // Master clock output divider enabled
      .mclkSource = kSAI_MclkSourceSysclk,    // Master clock from the system clock
      .bclkSource = kSAI_BclkSourceBusclk,     // Unused, BCLK pin is set to be external clock
      .masterSlave = kSAI_Slave                     // Slave mode
    };

    /* I2S0 Rx  transfer format */
    sai_transfer_format_t codec_Rx_format = {
      .sampleRate_Hz = CODEC_SAMPLERATE,      // Sample Rate 44.1KHz
      .bitWidth = kSAI_WordWidth16bits,              // Bit Width 16 bits
      .stereo = kSAI_MonoLeft,                            // Only left channel have sound.
      .masterClockHz = 24000000UL,                    // 24 MHz
      .channel = 0U,                                            // Single channel
      .protocol = kSAI_BusI2S,                              // I2S Mode
      .isFrameSyncCompact = true
    };

        SAI_RxInit(I2S0, &codec_config);

        /* Create the SAI Rx transfer handle */
        SAI_TransferRxCreateHandle(I2S0, &codec_Rx_handle, NULL, NULL);
        /* Initialize SAI Rx transfer format */
        SAI_TransferRxSetFormat(I2S0, &codec_Rx_handle, &codec_Rx_format, 24000000UL, 705600UL);

        SAI_RxSetDataOrder(I2S0, kSAI_DataMSB);             // MSB bit transferred first

        SAI_RxSetBitClockPolarity(I2S0, kSAI_PolarityActiveHigh);   // Clock active high

        SAI_RxEnable(I2S0, true);

        SAI_RxSoftwareReset(I2S0, kSAI_ResetAll);

        SAI_ReadBlocking(I2S0, codec_channel, codec_bitwidth, buffer, 1024);


    执行后一直停在 SAI_ReadBlocking函数的如下位置
        /* Wait until data is received */
        while (!(base->RCSR & I2S_RCSR_FWF_MASK))
        {
        }

    我知道答案 目前已有1人回答
    头大~
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-5-18 11:57
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]初来乍到

    4

    主题

    15

    帖子

    0

    注册会员

    Rank: 2

    积分
    152
    最后登录
    2020-10-20
     楼主| 发表于 2020-5-24 10:16:40 | 显示全部楼层
    看了某帖子版主的建议,调试通信协议不要用debug模式,不用单步执行,而是直接执行函数,已正常运行,能收到变化的数据。继续下一步工作了。
    头大~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-10 02:05 , Processed in 0.087932 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表