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申请中断的中断回调函数里进行