我现在遇到了个问题,我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);
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;
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 } }
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])); } }
您好,
已经收到了您的案例,调查需要些时间,感谢您的耐心等待。
您好,
您能否在范围内确认SDOUT线路上可以看到来自所有4个ADC通道的数据?
您好,我没听明白你是什么意思。不过针对于下面这种数据处理格式
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 } }
Lakshmi的含义是使用示波器测量ADC的所有4个通道是否都处于活动状态。 这可避免任何软件错误,并验证ADC是否正确输出。 您可以通过测量BCLK,FSYNC和DOUT线路并计数所有4*32=128位都在切换来进行测量。