11.3. 应用示例

11.3.1. I2S IN(I2S RX)配置

    gx_i2s_init();

    GX_I2S_RX_PARAM rx = {
        .frequence = 12288000,  //i2s mclk频率
        .clk_mode = GX_I2S_CLK_MODE_MASTER,  //时钟模式 master 模式
        .data_format = GX_I2S_DATA_FORMAT_I2S,  //数据格式标准 i2s
        .sample_rate = GX_I2S_SAMPLE_RATE_16KHZ,  //采样率 16k
        .pcm_length = GX_I2S_PCM_LENGTH_16BIT,  //传输位宽 16bit
        .bclk_sel = GX_I2S_BCLK_SEL_64FS,  //bclk 配置 64fs
        .fsync_mode = GX_I2S_FSYNC_MODE_LONG_FRAME, //同步帧格式长帧同步,该配置在 TDM 模式下才会生效
    };
    gx_i2s_rx_config(&rx);

    GX_I2S_RX_PCM pcm = {
        .bit_size = GX_I2S_BIT_SIZE_32BIT,  //存储位宽 32bit
        .buffer_size = 1024,  //数据存储 buffer 大小,实际使用按需配置
        .frame_samples = 128,  //一帧的样点数,实际使用按需配置
        //其他成员实际使用时按需配置
    };
    unsigned int buffer_num = 2;  //PCM buffer 数量,实际使用按需配置
    for (int i = 0; i < buffer_num; ++i) {
        pcm.channel[i].endian = GX_I2S_PCM_ENDIAN_LITTLE_16BIT;  //数据存储大小端配置 16bit 小端存储
        pcm.channel[i].channel_sel = i;  //数据来源声道选择,实际使用按需配置
        pcm.channel[i].buffer_saddr = 0x20000000;  //数据存储 buffer 起始地址,实际使用按需配置
        pcm.channel[i].work_enable = 1;
    }
    gx_i2s_rx_start(&pcm)

11.3.2. I2S OUT(I2S TX)配置

    gx_i2s_init();

    GX_I2S_TX_PARAM tx = {
        .frequence = 12288000,  //i2s mclk频率
        .clk_mode = GX_I2S_CLK_MODE_MASTER,  //时钟模式 master 模式
        .data_format = GX_I2S_DATA_FORMAT_I2S,  //数据格式标准 i2s
        .sample_rate = GX_I2S_SAMPLE_RATE_16KHZ,  //采样率 16k
        .pcm_length = GX_I2S_PCM_LENGTH_16BIT,  //传输位宽 16bit
        .bclk_sel = GX_I2S_BCLK_SEL_64FS,  //bclk 配置 64fs
        .fsync_mode = GX_I2S_FSYNC_MODE_SHORT_FRAME, //同步帧格式短帧同步,该配置在 TDM 模式下才会生效
        .ch_sel[0] = GX_I2S_TX_CH_SEL_I2S_TX_PCM_0,  //声道数据来源选择 I2S OUT PCM0
        .ch_sel[1] = GX_I2S_TX_CH_SEL_NULL,  //声道数据来源选择静音
        .ch_sel[2] = GX_I2S_TX_CH_SEL_NULL,
        .ch_sel[3] = GX_I2S_TX_CH_SEL_NULL,  //该芯片最大可用 4 个声道,其余声道配置无效,且若来源选择不是来自于 I2S PCM buffer 后续 PCM 相关配置可以不用配置
    };
    gx_i2s_tx_config(&tx);

    GX_I2S_TX_PCM pcm = {
        .bit_size = GX_I2S_BIT_SIZE_16BIT,  //存储位宽 16bit
        .interleave_en = 0,  //数据交织与非交织配置;配置 0 为非交织,1 为交织
        .endian = GX_I2S_PCM_ENDIAN_LITTLE_16BIT;  //数据存储大小端配置
        .channel_num = 2,   //最大 4
        .buffer_size = 1024,  //数据存储 buffer 大小,实际使用按需配置
        //其他成员按需配置
    };
    for (int i = 0; i < pcm.channel_num; ++i) {
        pcm.buffer_saddr[i] = 0x20000000;  //数据存储 buffer 起始地址,实际使用按需配置
    }
    gx_i2s_tx_start(&pcm);

    GX_I2S_TX_FRAME frame = {
        .frame_saddr = 0,  //新的一帧的起始地址(相对地址),实际使用时按需配置
        .frame_samples = 1024,  //新的一帧样点数,实际使用按需配置
    };
    gx_i2s_tx_push_frame(&frame);//配置新的一帧,这里只推了新的一帧,如果需要连续推帧,可在配置新的一帧pcm申请中断的中断回调函数里进行