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

Part Number: TLV320ADC3140

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

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

STM32H7的I2S配置代码如下:
Fullscreen
1
2
3
4
5
6
7
8
9
10
11
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;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

我调用STM32官方的HAL库函数
Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
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
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

HAL_I2S_Receive这个函数我测试过了,是可以接收完整的32位数据,只是传参的时候要强转为16位格式。
在我处理接收数据时,想要获取到通道一和通道二的数据时,必须要强转为16位数据才是我想要的数据,但是我在ADC中设置的是32位。我不使用强转16位数据时,得到的只有通道一和通道三的数据,通道二和通道四的数据都是0。
下面的数据处理代码就没有通道二和通道四的值
Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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]));
}
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

x 出现错误。请重试或与管理员联系。