This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AMC7834_ADC相关的问题.

同样的驱动代码, 有的板子ADC正常, 有的不正常.主要表现为配置ADC无法进行自动转换.

ADC相关的初始化流程为:

1. 配置芯片为活跃模式.(0x02寄存器)

2. 配置ADC模式为自动转换.(0x10寄存器)

3. 打开全部ADC通道.(0x12寄存器)

4. 循环读取综合状态寄存器, 等待ADC_READY等于1,再继续往下运行.(0x1F寄存器)

5. 开启ADC自动转换.(0x1C寄存器)

运行以上步骤后, 复读0x10, ADC转换模式配置正常, 循环读取综合寄存器, ADC_READY一直为1, 所有DAV一直为0.

请问可能是硬件或软件哪方面未达到驱动要求而导致的此问题?

  • 这种情况, 通常硬件的可能性比较大

    比如电压值,复位电压,通讯信号电平,还有 通讯时序时间等接近或落在临界范围内。

    容易出现这样的问题

  • 您好,
    芯片管脚1脚:DAV/ADC_RDY外部电路是怎么接的,另外这几个寄存器配置的是什么值呢
  • DAV/ADC_RDY引脚为悬空, 未使用. 判断ADC_RDY是通过综合状态寄存器(0x1F)的bit14进行判断的.

    各寄存器具体值的话, 是用位域结构体抽象而来的, 如下

      {
        AMC7834_SoftResetRegTypeDef SoftResetRegStruct = { 0 };
        SoftResetRegStruct.SoftReset = AMC7834_SOFT_RESET_REG_SOFT_RESET_ENABLE;
        DAC_WriteRegister(DAC_REG_SOFTWARE_RST, DAC_REG_DATA_TO_U16(SoftResetRegStruct));/* 软件复位(只写寄存器) */
      }
      SYS_Delayms(1);
      {
        AMC7834_AmcCfgReg0TypeDef AmcCfgReg0Struct = { 0 };
        AmcCfgReg0Struct.Loop_EN   = AMC7834_DISABLE; /* 闭环模式 */
        AmcCfgReg0Struct.RT_Set    = AMC7834_AMC_CFG_REG0_RT_SET_16MS;
        AmcCfgReg0Struct.CS_Filter = AMC7834_AMC_CFG_REG0_CS_FILTER_0MS_2;
        AmcCfgReg0Struct.CMode     = AMC7834_AMC_CFG_REG0_CMODE_AUTO_MODE;  /* ADC 自动转换模式 */
        if (DAC_WriteAndRereadRegister(DAC_REG_AMC_CFG_0, DAC_REG_DATA_TO_U16(AmcCfgReg0Struct))
         != DAC_OK)/* 初始化模拟监控配置寄存器0 */
        {
          return DAC_INIT_FAULT;
        }
      }
      {
        AMC7834_PowerModeRegTypeDef PowerModeRegStruct = { 0 };
        PowerModeRegStruct.PowerMode = AMC7834_POWER_MODE_REG_POWER_MODE_ACTIVE;/* 活跃模式 */
        if (DAC_WriteAndRereadRegister(DAC_REG_POWER_MODE, DAC_REG_DATA_TO_U16(PowerModeRegStruct))
         != DAC_OK)/* 初始化电源模式寄存器 */
        {
          return DAC_INIT_FAULT;
        }
      }
      {
        uint32_t StartTime = SYS_GetTickCount32ms();
        for (;;)
        {
          DAC_ReadGeneralStatus();/* 读综合状态 */
          if (DAC_GeneralStatusBuffer.ADC_Ready == AMC7834_ENABLE)/* ADC已准备完毕 */
          {
            break;
          }
          if (SYS_GetTickCount32Dms(StartTime, SYS_GetTickCount32ms())
           >= DAC_INIT_TIMEOUT_MS)/* 初始化超时 */
          {
            return DAC_INIT_FAULT;
          }
        }
      }
      {
        AMC7834_DacAdcTriggerRegTypeDef DacAdcTriggerRegStruct = { 0 };
        DacAdcTriggerRegStruct.ADC_Trig = AMC7834_ENABLE;/* 开启ADC自动转换 */
        DacAdcTriggerRegStruct.DAC_Trig = AMC7834_DISABLE;
        DAC_WriteRegister(DAC_REG_DAC_ADC_TRIGGER, DAC_REG_DATA_TO_U16(DacAdcTriggerRegStruct));/* 初始化DAC_ADC触发寄存器(只写寄存器) */
      }



    现在通过使用下列方法解决了问题:

    1. 见1楼的初始化操作.

    2. 由于初始化操作后综合状态寄存器(0x1F)中的bit14, ADC_Ready 还是等于1, 所以我就只要bit还等于1我就不断

    给DAC和ADC触发寄存器(0x1C), 写0x0001, 触发ADC自动转换.

    3. 有问题的片子, 有的初始化之后再触发1次就可以自动采集了, 有的片子要再触发2次. 触发完毕后如果 ADC_Ready 为0,

    就不再需要触发.

    新增代码

      *(uint16_t *)&DAC_GeneralStatusBuffer = DAC_ReadRegister(DAC_REG_GENERAL_STATUS);
      /* 由于AMC7834触发ADC转换时, 有个未知问题, 有的芯片能够初始化正常,
         有的不正常, 所以这里检测ADC_Ready依然为使能时, 重新再触发一次ADC转换 */
      if (DAC_GeneralStatusBuffer.ADC_Ready == AMC7834_ENABLE)
      {
        AMC7834_DacAdcTriggerRegTypeDef DacAdcTriggerRegStruct = { 0 };
        DacAdcTriggerRegStruct.ADC_Trig = AMC7834_ENABLE;/* 开启ADC自动转换 */
        DacAdcTriggerRegStruct.DAC_Trig = AMC7834_DISABLE;
        DAC_WriteRegister(DAC_REG_DAC_ADC_TRIGGER, DAC_REG_DATA_TO_U16(DacAdcTriggerRegStruct));/* 初始化DAC_ADC触发寄存器(只写寄存器) */
      }

  • 所有的配置寄存器擦破做(除了只写寄存器), 都进行了回读匹配确认, 均未发现过匹配异常的情况, 这个情况基本上不可能. 除非通讯错误一直出现在操作只写寄存器的时候.