TI论坛
直播中

刘军

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

使用amc7812b的16个通道进行ADC转换,给通道0一个1.8v的电压去读取数据寄存器为什么都是0没有转换,为什么?


  • 我想使用amc7812b的16个通道进行ADC转换,如下是我对amc7812b芯片寄存器的一些配置,已经确认过读写寄存器没有问题,按照手册的说明应该是一直转换的,可是我给通道0一个1.8v的电压,然后去读取数据寄存器,发现里面的数据都是0,没有转换。为什么??寄存器的配置不对吗?
    status_t AMC7812b_RT_Init(amc7812b_rt_handle_t *handle, LPI2C_Type *base)
    {
        status_t status;
    assert(base);
        if (!base)
        {
            return kStatus_InvalidArgument;
        }
        handle->base = base;
    status = AMC7812b_RT_Write(handle, AMC7812B_CONFIG_REGISTER0, 0x2400);
    status = AMC7812b_RT_Write(handle, AMC7812B_Temperature_CONFIG_REGISTER, 0x00ff);
    status = AMC7812b_RT_Write(handle, AMC7812B_CHANNEL0_REGISTER, 0x6dff);
    status = AMC7812b_RT_Write(handle, AMC7812B_CHANNEL1_REGISTER, 0x7000);
    status = AMC7812b_RT_Write(handle, AMC7812B_CONFIG_REGISTER1, 0x0070);
    status = AMC7812b_RT_Write(handle, AMC7812B_CONFIG_REGISTER0, 0x3400);
        return status;
    }
    //调用函数读取数据寄存器0
    AMC7812b_RT_Read(&amc7812b_Handle, AMC7812B_DATA0_REGISTER);
    for(int i=0; i<2; i++)
    {
      PRINTF("%2x", amc7812b_Handle.data_buf);
    }
    PRINTF("rn");
    status_t AMC7812b_RT_Write(amc7812b_rt_handle_t *handle, uint32_t register_address, uint16_t data)
    {
    uint8_t mode[2];
    lpi2c_master_transfer_t *xfer = &(handle->xfer);
        status_t status;
        assert(handle);
        if (!handle)
        {
            return kStatus_InvalidArgument;
        }
        /* clear transfer structure and buffer */
        memset(xfer, 0, sizeof(*xfer));
        memset(handle->data_buf, 0, AMC7812b_RT_DATA_LEN);
    mode[0] = 0xff & (data>>8);
    mode[1] = 0xff & (data>>0);
    handle->xfer.slaveAddress = AMC7812B_RT_I2C_ADDRESS;
    handle->xfer.direction = kLPI2C_Write;
    handle->xfer.subaddress = register_address;
    handle->xfer.subaddressSize = 1;
    handle->xfer.data = mode;
    handle->xfer.dataSize = 2;
        handle->xfer.flags = kLPI2C_TransferDefaultFlag;
        status = LPI2C_MasterTransferBlocking(handle->base, &handle->xfer);
    return status;
    }
    status_t AMC7812b_RT_Read(amc7812b_rt_handle_t *handle, uint32_t register_address)
    {
    status_t status;
        assert(handle);
        if (!handle)
        {
            return kStatus_InvalidArgument;
        }
    memset(handle->data_buf, 0, AMC7812b_RT_DATA_LEN);
    handle->xfer.slaveAddress = AMC7812B_RT_I2C_ADDRESS;
    handle->xfer.direction = kLPI2C_Read;
    handle->xfer.subaddress = register_address;
    handle->xfer.subaddressSize = 1;
    handle->xfer.data = handle->data_buf;
    handle->xfer.dataSize = 2;
        handle->xfer.flags = kLPI2C_TransferDefaultFlag;
        status = LPI2C_MasterTransferBlocking(handle->base, &handle->xfer);
    return status;
    }

                                                                   
                                                                   

回帖(4)

潘小旋

2024-12-12 14:02:12
要等转换器转换完了,才能读到数据,在自动模式,在DAV pin有1us的低电平信号表示一轮转换完成。在数据手册33页Handshaking with the Host有说明。
举报

肖东菁

2024-12-12 14:02:24
程序的工作时序有问题,需要先检查到DAV pin有1us的低电平信号或下降沿才能去读AD值。
举报

陈娟

2024-12-12 14:02:38
    那就用 direct mode,检测配置寄存器0里的DAVF bit是否为1,再去读取AD值。
举报

陈勇

2024-12-12 17:11:58
根据您的描述,您在使用AMC7812B进行ADC转换时遇到了问题。以下是一些可能的原因和解决方案:

1. 检查电源和参考电压:
确保AMC7812B的电源和参考电压已经正确配置。AMC7812B需要一个稳定的电源和参考电压才能正常工作。请检查您的电源和参考电压是否符合AMC7812B的数据手册要求。

2. 检查通道配置:
确保您已经正确配置了通道0。您需要设置通道0的输入模式,以便它可以接收外部电压信号。请参考AMC7812B的数据手册,了解如何配置通道输入模式。

3. 检查采样率和转换模式:
AMC7812B支持不同的采样率和转换模式。请确保您已经根据您的需求正确配置了采样率和转换模式。如果采样率设置得太低,可能会导致ADC转换结果不准确。

4. 检查数据寄存器读取:
确保您在读取数据寄存器时使用了正确的寄存器地址。AMC7812B的数据手册中提供了详细的寄存器地址和配置信息。请确保您已经正确配置了数据寄存器的读取。

5. 检查硬件连接:
检查您的硬件连接是否正确。确保AMC7812B的通道0已经正确连接到1.8V的电压源,并且没有短路或断路的问题。

6. 检查代码逻辑:
仔细检查您的代码逻辑,确保您已经正确初始化了AMC7812B,并正确配置了寄存器。如果可能,请参考AMC7812B的官方示例代码,以确保您的代码逻辑正确。

综上所述,您需要检查电源、通道配置、采样率、数据寄存器读取、硬件连接和代码逻辑等多个方面,以找出问题所在。希望这些建议能帮助您解决问题。
举报

更多回帖

×
20
完善资料,
赚取积分