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)); // 通道1printf("%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,,可不可以帮我看一下是我哪里的配置有问题吗,怎么解决上述问题
TRANSLATE with x
English
| Arabic | Hebrew | Polish |
| Bulgarian | Hindi | Portuguese |
| Catalan | Hmong Daw | Romanian |
| Chinese Simplified | Hungarian | Russian |
| Chinese Traditional | Indonesian | Slovak |
| Czech | Italian | Slovenian |
| Danish | Japanese | Spanish |
| Dutch | Klingon | Swedish |
| English | Korean | Thai |
| Estonian | Latvian | Turkish |
| Finnish | Lithuanian | Ukrainian |
| French | Malay | Urdu |
| German | Maltese | Vietnamese |
| Greek | Norwegian | Welsh |
| Haitian Creole | Persian |
TRANSLATE with
TI中文支持网

