TI论坛
直播中

王玲

8年用户 1508经验值
私信 关注
[问答]

ADC124S051的4个通道数据错位怎么解决?


  • 型号:ADC124S051;
    STM32F103RCT6,HAL库编写。SPI时钟频率是4.5Mbps。
    应用方式:当ADC的CS拉低时,连续读取4个通道数据,读完后CS拉高。
    问题描述:当依此读取4个通道时,数据不能跟通道一一对应。具体表现是:IN1的数据对应的是IN4,IN4的数据是IN3的,IN3的数据是IN2的,IN2的数据是IN1的。读的是相邻的那个通道的数据。如下图箭头指示的那样。

    如果是连续读3个通道的话,就是IN1—>IN4—>IN3—>IN1,就是这样读他相邻的通道。
    下面是我代码:
             //-------------------------------------------------
    uint16_t channel1[1] = {0x0000 };  //这是通道的寄存器值
    uint16_t channel2[1] = {0x0800 };
    uint16_t channel3[1] = {0x1000};
    uint16_t channel4[1] = {0x1800};
    //-------------------------------------------------
    reg_CS1 = 0;
    HAL_SPI_TransmitReceive(&hspi2, (uint8_t*)&channel3, (uint8_t*)x_index, 1, 0xff);     //index,这个adc在连续读多通道时会出现通道错位现象,诡异。
    HAL_SPI_TransmitReceive(&hspi2, (uint8_t*)&channel4, (uint8_t*)x_cos, 1   , 0xff);     //cos
    HAL_SPI_TransmitReceive(&hspi2, (uint8_t*)&channel1, (uint8_t*)x_sin, 1    , 0xff);     //sin
    reg_CS1 = 1;
    //-------------------------------------------------
    我想要的帮助是:
    1、写入通道寄存器的值是不是有错误;
    2、通道数据错开的情况怎么解决,我实在想不通对这款ADC哪个地方操作不当,我一直都觉得操作没毛病。请帮我分析。

回帖(2)

李纪生

2024-11-30 10:44:24
建议按照datasheet Figure 1. ADC124S051 Operational Timing Diagram的时序,用示波器测量下CS,DIN, SCLK,DOUT的时序?
举报

张伟

2024-11-30 16:21:23
根据您的描述,ADC124S051的4个通道数据错位问题可能是由于SPI通信时序或代码逻辑错误导致的。以下是一些建议和解决方案:

1. 检查SPI时序和配置:
确保您的SPI配置正确,包括时钟频率、CPOL、CPHA等参数。根据您的描述,SPI时钟频率是4.5Mbps,这是一个相对较低的频率,但仍然需要确保时序正确。您可以查阅ADC124S051的数据手册,了解其SPI时序要求,并与您的代码进行对比。

2. 检查CS引脚控制:
确保您的代码在读取每个通道数据时正确地控制CS引脚。在读取每个通道之前,CS应该被拉低,读取完成后,CS应该被拉高。请检查您的代码中是否正确地控制了CS引脚。

3. 检查通道选择逻辑:
在读取每个通道的数据时,您需要确保正确地选择了通道。ADC124S051支持4个通道,您需要在发送读取命令时指定要读取的通道。请检查您的代码中是否正确地选择了通道。

4. 检查数据读取逻辑:
在读取数据时,您需要确保正确地读取了每个通道的数据。请检查您的代码中是否正确地读取了数据,并将其存储在正确的变量中。

以下是一段示例代码,供您参考:

```c
// 初始化SPI
MX_SPI1_Init();

// 定义通道选择命令
uint8_t channel_commands[4] = {0x01, 0x02, 0x03, 0x04};

// 定义存储数据的数组
uint16_t channel_data[4] = {0};

// 读取4个通道的数据
for (int i = 0; i < 4; i++) {
  // 拉低CS
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);

  // 发送通道选择命令
  HAL_SPI_Transmit(&hspi1, &channel_commands[i], 1, HAL_MAX_DELAY);

  // 读取数据
  HAL_SPI_Receive(&hspi1, (uint8_t *)&channel_data[i], 2, HAL_MAX_DELAY);

  // 拉高CS
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_SET);
}
```

请根据您的实际情况调整代码。希望这些建议能帮助您解决问题。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分