# 应用示例 ## I2S IN(I2S RX)配置 ```c 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) ``` ## I2S OUT(I2S TX)配置 ```c 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申请中断的中断回调函数里进行 ```