|
我在测试OM6621P的I2S从机接收,手册里写着支持32位接收但是实际上没有成功,有人有成功过吗? 问题1:为何无法配置成32bit数据,寄存器无法写入 我把寄存器打印出来看,发现这个寄存器:HS_I2S_RX->CHN_R0.RCR 只能设置到4(使用sdk库配置和直接对寄存器赋值都试过了),对应24bit,我写5(按手册描述对应32bit)读回来还是4,但是小于4的值写入是正常的。而且CCR寄存器的值永远是0,按理来说配置24位的话bit[4:3]得是1 看到手册里有这样的话,说最大的位宽取决于I2S_RX_WORDSIZE_x ,查hs2261p.h阅头文件这个值是3,改成4也不行。 问题2:I2S到底有几通道 手册里说有4通道,通过代理商问原厂也说有,但是没有例程。光看手册和sdk代码,没有除了第一路以外相应的IO_MUX枚举值,i2s相关的库函数也只写了CHN_R0的,但是头文件里却有从CHN_R0到CHN_R3。 附I2S相关代码逻辑: /// i2s buffer #define I2S_BLOCK_SIZE 256 #define I2S_DMA_BUFFER_SIZE 1024 #define I2S_BLOCK_NUM (I2S_DMA_BUFFER_SIZE/I2S_BLOCK_SIZE) static uint32_t i2s_dma_buffer[I2S_DMA_BUFFER_SIZE/4]; static HS_DMA_CH_Type *i2s_dma_rx = NULL; DMA_DECLARE_LLIP(i2s_dma_block_llip_rx, I2S_BLOCK_NUM); /// i2s pin setting (as slave with audio) pinmux_config(AUDIO_PIN_I2S_RX_DAT, PINMUX_I2S_SDI_CFG); pinmux_config(AUDIO_PIN_I2S_RX_WS, PINMUX_I2S_RX_WS_CFG); pinmux_config(AUDIO_PIN_I2S_RX_CLK, PINMUX_I2S_RX_SCLK_CFG); i2s_config_t i2s_cfg = { .sample_rate = I2S_SAMPLE_48K, .sample_width = I2S_BITWIDTH_32BIT, .ws_width = I2S_BITWIDTH_32BIT, .workmode = I2S_WORKMODE_SLAVE, .pcmmode = I2S_PCMMODE_STEREO, }; i2s_rx_config(&i2s_cfg); static i2s_dma_config_t i2s_dma_rx_cfg = { .use_fifo = true, .buffer = i2s_dma_buffer, .buffer_len = sizeof(i2s_dma_buffer), .block_llip = i2s_dma_block_llip_rx, .block_num = I2S_BLOCK_NUM, .callback = NULL, }; i2s_dma_rx = i2s_rx_dma_config(NULL, &i2s_dma_rx_cfg); dma_start_with_lli(i2s_dma_rx); i2s_rx_start(&i2s_cfg); ps: 发现i2s配置寄存器是有写保护锁的,i2s启动了那些寄存器就写不了,关闭的时候可以写 |
