我想使用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[i]);
}
PRINTF("\r\n");
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;
}
Amy Luo:
您好,
要等转换器转换完了,才能读到数据,在自动模式,在DAV pin有1us的低电平信号表示一轮转换完成。在数据手册33页Handshaking with the Host有说明。
user5884461:
回复 Amy Luo:
嗯,,我也确认过,用示波器看波形,发现一直是高电平,不会出现1us低电平,还有就是我读数据寄存器是在while死循环里面读的,发现一直打印输出的是0.。。而且我写配置寄存器0后,马上又去读取它,发现ICONV已经被cleared 0了,说明已经转换开始了,可是好像停不下来了。为什么??
user5884461:
回复 Amy Luo:
还有就是不需要配置阈值寄存器和报警寄存器吧。我就只要单纯的采集某点的电压而已。
Amy Luo:
回复 user5884461:
程序的工作时序有问题,需要先检查到DAV pin有1us的低电平信号或下降沿才能去读AD值。
user5884461:
回复 Amy Luo:
I2C时序吗?我都已经可以正常读写寄存器了,应该是没有问题。还是说配置各个寄存器之间有先后顺序和时间间隔的区别吗??你们有流程图可以提供吗?
user5884461:
回复 user5884461:
user5884461:
回复 user5884461:
这样的电路设计有问题吗?
user5884461:
回复 Amy Luo:
这样的电路设计有问题吗?
Amy Luo:
回复 user5884461:
那就用 direct mode,检测配置寄存器0里的DAVF bit是否为1,再去读取AD值。
user5884461:
回复 Amy Luo:
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, 0x0400);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, 0x1400);return status;
}
还是不行,,我没有暂时没有判断DAVF bit,而是直接while循环读取寄存器0,打印出来还是一直为0.