This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TLV320ADC3140: STM32H7使用I2S如何采样TLV320ADC3140的32位数据

Part Number: TLV320ADC3140

我现在遇到了个问题,我TLV320ADC3140设置的4通道,I2S-32bit数据传输格式,我STM32H7单片机这边也是设置的32位采样,但是我这边采样到的数据一个32位数据里面却是通道一和通道二的数据且两个通道的数据都是16位的。下面我展示一下我的配置。
TLV320ADC3140:配置如下:

tlv320adc3140_write(ADC3140_ADDRESS, PAGE_CFG_ADDRESS, PAGE_CFG_PAGE_0);

    tlv320adc3140_write(ADC3140_ADDRESS, SLEEP_CFG, 0x81);

    tlv320adc3140_write(ADC3140_ADDRESS, IN_CH_EN, 0xF0);
    tlv320adc3140_write(ADC3140_ADDRESS, ASI_OUT_CH_EN, 0xF0);
    tlv320adc3140_write(ADC3140_ADDRESS, PWR_CFG, 0xF4);
    tlv320adc3140_write(ADC3140_ADDRESS, ASI_CFG0, 0x40);

    tlv320adc3140_write(ADC3140_ADDRESS, CH1_CFG0, 0x90);
    tlv320adc3140_write(ADC3140_ADDRESS, CH1_CFG1, 0x00);
    tlv320adc3140_write(ADC3140_ADDRESS, CH2_CFG0, 0x90);
    tlv320adc3140_write(ADC3140_ADDRESS, CH2_CFG1, 0x00);
    tlv320adc3140_write(ADC3140_ADDRESS, CH3_CFG0, 0x90);
    tlv320adc3140_write(ADC3140_ADDRESS, CH3_CFG1, 0x00);
    tlv320adc3140_write(ADC3140_ADDRESS, CH4_CFG0, 0x90);
    tlv320adc3140_write(ADC3140_ADDRESS, CH4_CFG1, 0x00);

    tlv320adc3140_write(ADC3140_ADDRESS, ASI_CH1, 0x00);
    tlv320adc3140_write(ADC3140_ADDRESS, ASI_CH2, 0x01);
    tlv320adc3140_write(ADC3140_ADDRESS, ASI_CH3, 0x20);
    tlv320adc3140_write(ADC3140_ADDRESS, ASI_CH4, 0x21);

STM32H7的I2S配置代码如下:
hi2s2.Instance = SPI2;
    hi2s2.Init.Mode = I2S_MODE_MASTER_RX;
    hi2s2.Init.Standard = I2S_STANDARD_PHILIPS;
    hi2s2.Init.DataFormat = I2S_DATAFORMAT_32B;
    hi2s2.Init.MCLKOutput = I2S_MCLKOUTPUT_DISABLE;
    hi2s2.Init.AudioFreq = I2S_AUDIOFREQ_32K;
    hi2s2.Init.CPOL = I2S_CPOL_LOW;
    hi2s2.Init.FirstBit = I2S_FIRSTBIT_MSB;
    hi2s2.Init.WSInversion = I2S_WS_INVERSION_DISABLE;
    hi2s2.Init.Data24BitAlignment = I2S_DATA_24BIT_ALIGNMENT_RIGHT;
    hi2s2.Init.MasterKeepIOState = I2S_MASTER_KEEP_IO_STATE_ENABLE;

我调用STM32官方的HAL库函数
if (HAL_I2S_Receive(&hi2s2, (uint16_t *)i2s2_receive_data, BUFFER_SIZE, 1000) == HAL_OK)
    {
        for (i = 0; i < BUFFER_SIZE; i++)
        {
            if ((i + 0) % 2 == 0)                                        // 通道1/2
                // printf("%d\r\n", (int16_t)(i2s2_receive_data[i] >> 16)); // 通道1
                printf("%d\r\n",(int16_t)(i2s2_receive_data[i]));//通道2

            // if((i+1)%2==0)//通道3/4
                // printf("%d\r\n",(int16_t)(i2s2_receive_data[i]>>16));//通道3
                // printf("%d\r\n",(int16_t)(i2s2_receive_data[i]));//通道4
        }
    }

HAL_I2S_Receive这个函数我测试过了,是可以接收完整的32位数据,只是传参的时候要强转为16位格式。
在我处理接收数据时,想要获取到通道一和通道二的数据时,必须要强转为16位数据才是我想要的数据,但是我在ADC中设置的是32位。我不使用强转16位数据时,得到的只有通道一和通道三的数据,通道二和通道四的数据都是0。
下面的数据处理代码就没有通道二和通道四的值
if (HAL_I2S_Receive(&hi2s2, (uint16_t*)i2s2_receive_data, BUFFER_SIZE, 1000) == HAL_OK)
    {
        for (i = 0; i < BUFFER_SIZE; i++)
        {
            if ((i+4) % 4 == 0) // 通道1
				printf("%d\r\n",(i2s2_receive_data[i]));
            // if ((i + 3) % 4 == 0) // 通道2
            //     printf("%d\r\n", (i2s2_receive_data[i]));
            // if ((i + 2) % 4 == 0) // 通道3
            //     printf("%d\r\n", (int32_t)(i2s2_receive_data[i]));
            // if ((i + 1) % 4 == 0) // 通道4
            //     printf("%d\r\n", (int32_t)(i2s2_receive_data[i]));
        }
    }

****按配置来讲,通道一到通道四的数据都应该是32位按顺序依次存放在数组中,但是我按照上面这种处理方式只有一三通道有值,二四通道没值。

我想要的是我能获取到每个通道都是32位的数据,我在ADC配置中通道一和通道二分别是左槽的0和1.通道三和通道四分别是右槽的0和1,,可不可以帮我看一下是我哪里的配置有问题吗,怎么解决上述问题