6621P的I2S 32位接收问题

Sumn · 4次点击 · 14小时前

我在测试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启动了那些寄存器就写不了,关闭的时候可以写

被收藏 0  ∙  0 赞  
加入收藏
点赞
0 回复  
善言善语 (您需要 登录 后才能回复 没有账号 ?)

请先登录网站