电路设计论坛
直播中

硬件工程师1

11年用户 1664经验值
擅长:可编程逻辑
私信 关注
[问答]

求助,关于MAX11125ATI+T是集成电路(IC) 模数转换器(ADC)数据读取问题求解

MAX11125Ati+T是集成电路(IC) 模数转换器(ADC)配置成使用外部参考电压REFSEL=1,使用内部时钟SCAN[3:0]=0011,通道模拟输入采用SingleEnded模式,SPI通讯数据写入和读取是一致的,但是使用示波器采集EOC没有转化完成电平变化。如何读取FIFO的数据
                                                                            //MAX11125寄存器控制地址
#define CONFIG_SETUP ((0&0xF)<<11)
#define UNI_SETUP ((1&0xF)<<11)
#define BIP_SETUP ((2&0xF)<<11)
#define RANGE_SETUP ((3&0xF)<<11)
#define CUST_SCAN0 ((4&0xF)<<11)
#define CUST_SCAN1 ((5&0xF)<<11)
#define SMPL_SET ((6&0xF)<<11)
//MAX11125寄存器. ADC Mode Control Register
#define SCAN_MODE(x) (((x) &0xF)<<11)
#define CHSEL(x) (((x) &0xF)<<7)
#define RESET(x) (((x) &0x3)<<5)
#define PM_MODE(x) (((x) &0x3)<<3)
#define CHAN_ID(x) (((x) &0x1)<<2)
#define SWCNV(x) (((x) &0x1)<<1)
//MAX11125寄存器CONFIG_SETUPRegister Function
#define REFSEL_UNEN (0<<10)
#define REFSEL_EN (1<<10)
#define AVGON_EN (1<<9)
#define NAVG(x) (((x) &0x3)<<7)
#define NSCAN(x) (((x) &0x3)<<5)
#define SPM(x) (((x) &0x3)<<3)
#define ECHO_EN (1<<2)
//MAX11125寄存器Unipolar_SETUP Register Function
#define UCH0_1(x) ((x&0x1)<<10)
#define UCH2_3(x) ((x&0x1)<<9)
#define UCH4_5(x) ((x&0x1)<<8)
#define UCH6_7(x) ((x&0x1)<<7)
#define UCH8_9(x) ((x&0x1)<<6)
#define UCH10_11(x) ((x&0x1)<<5)
#define UCH12_13(x) ((x&0x1)<<4)
#define UCH14_15(x) ((x&0x1)<<3)
#define PDIFF_COM(x) ((x&0x1)<<2)
//MAX11125寄存器Bipolar_SETUP Register Function
#define BCH0_1(x) ((x&0x1)<<10)
#define BCH2_3(x) ((x&0x1)<<9)
#define BCH4_5(x) ((x&0x1)<<8)
#define BCH6_7(x) ((x&0x1)<<7)
#define BCH8_9(x) ((x&0x1)<<6)
#define BCH10_11(x) ((x&0x1)<<5)
#define BCH12_13(x) ((x&0x1)<<4)
#define BCH14_15(x) ((x&0x1)<<3)
//MAX11125寄存器RANGE_SETUP Register Function
#define RANGE0_1 (1<<10)
#define RANGE2_3 (1<<9)
#define RANGE4_5 (1<<8)
#define RANGE6_7 (1<<7)
#define RANGE8_9 (1<<6)
#define RANGE10_11 (1<<5)
#define RANGE12_13 (1<<4)
#define RANGE14_15 (1<<3)
#define RANGE0_15 (0xFF<<3)
//MAX11125寄存器Custom Scan0 Register Function
#define CHSCAN15 (1<<10)
#define CHSCAN14 (1<<9)
#define CHSCAN13 (1<<8)
#define CHSCAN12 (1<<7)
#define CHSCAN11 (1<<6)
#define CHSCAN10 (1<<5)
#define CHSCAN9 (1<<4)
#define CHSCAN8 (1<<3)
#define CHSACN8_15ALL (0xFF<<3)
//MAX11125寄存器Custom Scan1 Register Function
#define CHSCAN7 (1<<10)
#define CHSCAN6 (1<<9)
#define CHSCAN5 (1<<8)
#define CHSCAN4 (1<<7)
#define CHSCAN3 (1<<6)
#define CHSCAN2 (1<<5)
#define CHSCAN1 (1<<4)
#define CHSCAN0 (1<<3)
#define CHSACN0_7ALL (0xFF<<3)
//MAX11125寄存器SampleSet Register Function
#define SEQ_LENGTH(x) (((x) &0xFF)<<2)
void MAX11125_ConfigInit()
{
uint8_t data[2],recive[2];
uint16_t cmd;

//MSB寄存器控制+寄存器地址+(参考电源外部REF+/REF-差分|开启平均值输出|平均值转换次数8|扫描通道8个)
cmd=0x8000|CONFIG_SETUP|REFSEL_EN|AVGON_EN|NAVG(1)|NSCAN(1)|ECHO_EN;
data[0]=cmd>>8;
data[1]=cmd&0xFF;
MAX11125_CS_L;
HAL_SPI_Transmit(&hspi5, data, 2, 100);
MAX11125_CS_H;

cmd=0x8000|UNI_SETUP|UCH0_1(0)|UCH2_3(0)|UCH4_5(0)|UCH6_7(0)|UCH8_9(0)|UCH10_11(0)|UCH12_13(0)|UCH14_15(0);
data[0]=cmd>>8;
data[1]=cmd&0xFF;
MAX11125_CS_L;
HAL_SPI_TransmitReceive(&hspi5, data,recive, 2, 100);
MAX11125_CS_H;

cmd=0x8000|BIP_SETUP|BCH0_1(0)|BCH2_3(0)|BCH4_5(0)|BCH6_7(0)|BCH8_9(0)|BCH10_11(0)|BCH12_13(0)|BCH14_15(0);
data[0]=cmd>>8;
data[1]=cmd&0xFF;
MAX11125_CS_L;
HAL_SPI_TransmitReceive(&hspi5, data,recive, 2, 100);
MAX11125_CS_H;

cmd=0x0000|SCAN_MODE(3)|CHSEL(7)|SWCNV(1);
data[0]=cmd>>8;
data[1]=cmd&0xFF;
MAX11125_CS_L;
HAL_SPI_TransmitReceive(&hspi5, data,recive, 2, 100);
MAX11125_CS_H;

HAL_GPIO_WritePin(Fluid_CNVST_GPIO_Port, Fluid_CNVST_Pin, GPIO_PIN_SET);
HAL_Delay(5);
HAL_GPIO_WritePin(Fluid_CNVST_GPIO_Port, Fluid_CNVST_Pin, GPIO_PIN_RESET);
}

回帖(1)

663593

2025-4-23 17:07:46

针对MAX11125ATI+T ADC无法读取FIFO数据且EOC无变化的问题,以下是逐步排查与解决方案:




1. 确认硬件连接与电源



  • 电源与参考电压:确保VDD在2.7V至3.6V范围内,外部参考电压(如2.5V或4.096V)已正确连接且稳定。

  • EOC引脚连接:检查EOC是否通过上拉电阻连接到VDD,示波器探头接触良好,并设置触发模式为边沿触发。




2. 验证SPI配置



  • SPI模式:MAX11125要求SPI模式0(CPOL=0,CPHA=0)或模式3(CPOL=1,CPHA=1)。检查主控制器(MCU)的SPI配置是否匹配。

  • 时钟频率:确保SPI时钟 ≤ 4MHz(最大值),过高的频率可能导致通信失败。

  • 片选信号(CS):确认CS在传输期间保持低电平,传输完成后拉高,避免信号干扰。




3. 检查控制寄存器配置



  • 寄存器地址与数据

    • 控制寄存器地址为0x02,写入16位数据,格式为:

      REFSEL=1(外部参考),SCAN[3:0]=0011(连续扫描AIN0-AIN3),OPMODE=0(正常模式)。

    • 示例写入值:0x0C63(二进制0000 1100 0110 0011,具体根据位字段调整)。


  • 验证写入值:读取控制寄存器(发送0x82后读取2字节),确认返回数据与写入值一致。




4. 监控转换启动与EOC信号



  • 连续扫描模式:配置正确时,ADC应自动开始转换,无需额外触发。

  • EOC行为:转换开始时EOC拉低,转换完成(约1.1μs)后拉高。若EOC始终为高,可能未启动转换;若保持低,可能处于连续转换中。




5. 读取状态与数据寄存器



  • 状态寄存器(0x01):发送0x81读取状态,检查DATA_RDY位(第15位)。若为1,表示FIFO中有数据。

  • 数据寄存器(0x00):发送0x80后读取2字节(16位数据),每次读取后FIFO指针自动递增。重复读取直到DATA_RDY=0




6. 关键代码流程示例


// 写入控制寄存器:连续扫描AIN0-AIN3,外部参考电压
uint8_t tx_buf[3] = {0x02, 0x0C, 0x63}; // 寄存器地址 + 配置值
spi_transfer(tx_buf, 3);

// 读取状态寄存器
uint8_t rx_buf[2];
spi_send(0x81); // 读状态寄存器命令
spi_receive(rx_buf, 2);
uint16_t status = (rx_buf[0] << 8) | rx_buf[1];

if (status & 0x8000) { // 检查DATA_RDY位
    // 读取FIFO数据
    spi_send(0x80); // 读数据寄存器命令
    spi_receive(rx_buf, 2);
    uint16_t adc_value = (rx_buf[0] << 8) | rx_buf[1];
}



7. 常见问题与解决



  • EOC无变化

    • 检查电源/参考电压是否在范围内。

    • 确认控制寄存器中OPMODE未设置为待机模式。

    • 尝试手动触发单次转换(如设置SCAN=0000后重新配置为连续模式)。


  • FIFO无数据

    • 确保SPI时钟极性/相位正确。

    • 检查是否在读取数据前等待足够时间(转换时间 + FIFO更新延迟)。





8. 参考时序图



  • SPI写入时序:CS拉低 → 发送命令字节(写)→ 发送配置数据 → CS拉高。

  • SPI读取时序:CS拉低 → 发送命令字节(读)→ 接收数据 → CS拉高。




通过上述步骤,应能定位问题根源并正确读取FIFO数据。如仍无法解决,建议使用逻辑分析仪捕获SPI通信全过程,对照数据手册时序进行验证。

举报

更多回帖

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