本帖最后由 林堪堪 于 2021-12-31 09:20 编辑
AT32F435/437/425不同的I2S全双工使用方式
AT32F435/F437/F425等型号支持I2S全双工,AT32F403A/F407/F413/F415/F421等型号不支持I2S全双工,具体请参考对应型号RM文档。不同型号MCU的I2S全双工实现方式也有所区别,下面分别介绍AT32F435/F437和AT32F425的I2S全双工功能。
1、AT32F435/F437的I2S全双工
AT32F435/F437为了支持I2S全双工模式,额外例化了两个I2S模块(I2S2EXT,I2S3EXT)。I2S2可与I2S2EXT组合在一起支持全双工模式,I2S3可与I2S3EXT组合在一起支持全双工模式。代码可参考“案例3—AT32F435/F437 I2S全双工DMA方式通信”。在I2Sx可与I2SxEXT组成全双工模块时,I2Sx只能配置为主模式,I2SxEXT只能配置为从模式。CK和WS均由I2Sx提供,对应的有以下两种配置方式:
① I2Sx主发(OPERSEL=0b10);I2SxEXT从收(OPERSEL=0b01);
② I2Sx主收(OPERSEL=0b11);I2SxEXT从发(OPERSEL=0b00)。
注:I2S2EXT 和I2S3EXT 只用于I2S全双工模式,而不能单独使用。
435/437配置I2S的关键代码如下:
static void i2s_config(void) { i2s_init_type i2s_init_struct; crm_periph_clock_enable(CRM_SPI2_PERIPH_CLOCK, TRUE);/*使能SPI2时钟(也就是使能I2S2时钟)*/
i2s_default_para_init(&i2s_init_struct);/*给I2S初始化变量赋默认值*/ i2s_init_struct.audio_protocol = I2S_AUDIO_PROTOCOL_PHILLIPS;/*设置I2S为飞利浦标准*/ i2s_init_struct.data_channel_format = I2S_DATA_16BIT_CHANNEL_32BIT;/*设置I2S帧格式为:数据位数为16bit,声道位数为32bit*/ i2s_init_struct.mclk_output_enable = TRUE;/*使能MCLK时钟输出*/ i2s_init_struct.audio_sampling_freq = I2S_AUDIO_FREQUENCY_48K;/*配置I2S采样率为48K*/ i2s_init_struct.clock_polarity = I2S_CLOCK_POLARITY_LOW;/*设置时钟空闲电平为低电平*/ i2s_init_struct.operation_mode =I2S_MODE_MASTER_TX;/*设置I2S为主机发送模式*/ i2s_init(SPI2, &i2s_init_struct);/*将SPI2(也就是I2S2)设置为以上配置*/
i2s_init_struct.operation_mode =I2S_MODE_SLAVE_RX; /*设置I2SEXT为从机接收模式*/ i2s_init(I2S2EXT, &i2s_init_struct);
dma_channel_enable(DMA1_CHANNEL1, TRUE);/*使能DMA1 channel1*/ dma_channel_enable(DMA1_CHANNEL2, TRUE);/*使能DMA1 channel2*/
spi_i2s_dma_transmitter_enable(SPI2, TRUE); /*使能SPI2(即I2S2)DMA发送使能*/ spi_i2s_dma_receiver_enable(I2S2EXT, TRUE); /*使能I2S2EXT DMA接收使能*/ }
2、AT32F425的I2S全双工 AT32F425的I2S全双工实现方式和AT32F435/F437不同。AT32F425可以通过设置SCFG_CFG2寄存器中的I2S_FD将两个SPI组合在一起实现I2S全双工。CK和WS由I2S主导方提供,附属方的CK和WS对应引脚可以释放给其他功能使用。根据I2S_FD配置,有以下几种组合方式:
① I2S_FD=0b00:I2S1~3各自独立半双工工作;
② I2S_FD=0b01:I2S1和I2S3组成全双工模式,其中I2S1为主导方,I2S3为附属方。
③ I2S_FD=0b10:I2S2和I2S3组成全双工模式,其中I2S2为主导方,I2S3为附属方。
④ I2S_FD=0b11:I2S1和I2S2组成全双工模式,其中I2S1为主导方,I2S2为附属方。
425配置I2S全双工的关键代码如下:static void i2s_config(void) { i2s_init_type i2s_init_struct; crm_periph_clock_enable(CRM_SPI3_PERIPH_CLOCK, TRUE);/*使能SPI3时钟(也就是使能I2S3时钟)*/ crm_periph_clock_enable(CRM_SPI2_PERIPH_CLOCK, TRUE);/*使能SPI2时钟(也就是使能I2S2时钟)*/ crm_periph_clock_enable(CRM_SCFG_PERIPH_CLOCK, TRUE);/*使能系统配置时钟,用于后续配置I2S全双工组合选择*/
scfg_i2s_full_duplex_config(SCFG_FULL_DUPLEX_I2S1_I2S2);/*配置I2S1和I2S2组成全双工I2S。其中I2S1作为主导方,提供WS、CK、MCK和SD;I2S2作为附属方,仅提供SD_EXT*/ i2s_default_para_init(&i2s_init_struct);/*给I2S初始化变量赋默认值*/
i2s_init_struct.audio_protocol = I2S_AUDIO_PROTOCOL_PHILLIPS;/*设置I2S为飞利浦标准*/ i2s_init_struct.data_channel_format = I2S_DATA_16BIT_CHANNEL_32BIT;/*设置I2S帧格式为:数据位数为16bit,声道位数为32bit*/ i2s_init_struct.mclk_output_enable = TRUE;/*使能MCLK时钟输出*/ i2s_init_struct.audio_sampling_freq = I2S_AUDIO_FREQUENCY_48K;/*配置I2S采样率为48K*/ i2s_init_struct.clock_polarity = I2S_CLOCK_POLARITY_LOW;/*设置时钟空闲电平为低电平*/ i2s_init_struct.operation_mode =I2S_MODE_MASTER_TX;/*设置I2S为主机发送模式*/ i2s_init(SPI1, &i2s_init_struct);/*将SPI1(也就是I2S1)设置为以上配置*/
i2s_init_struct.operation_mode = I2S_MODE_SLAVE_RX;/*设置I2S为从机接收模式*/ i2s_init(SPI2, &i2s_init_struct);/*将SPI2(也就是I2S2)设置为以上配置*/
dma_channel_enable(DMA1_CHANNEL2, TRUE);/*使能DMA1 channel2*/ dma_channel_enable(DMA1_CHANNEL3, TRUE);/*使能DMA1 channel3*/ spi_i2s_dma_transmitter_enable(SPI1, TRUE); /*使能SPI1(即I2S1)DMA发送使能*/ spi_i2s_dma_receiver_enable(SPI2, TRUE); /*使能SPI2(即I2S2)DMA接收使能*/ }
|