请问HDC2010驱动是否在RK3568上做了验证?
不知道你这个问题是否已经解决, 如果还没有解决的话:hdc1080.c
void HDC1080_Driver_Init(void)
{
uint8_t menufacture_buf[2] = {0}, device_buf[2] = {0};
uint16_t menufacture_id = 0, device_id = 0;
IIC_GPIO_Init();
HDC1080_Read_Register(HDC1080_MENUFACTURE_ID, menufacture_buf, 2);
menufacture_id = (uint16_t)(menufacture_buf[0]<<8);
menufacture_id |= menufacture_buf[1];
HDC1080_Read_Register(HDC1080_DEVICE_ID, device_buf, 2);
device_id = (uint16_t)(device_buf[0]<<8);
device_id |= device_buf[1];
if(menufacture_id==HDC1080_MENUFACTURE_ID_VALUE&&device_id==HDC1080_DEVICE_ID_VALUE)
{
DEBUG("<-----HDC1080 连接成功!----->\r\n");
}
else
DEBUG("<-----HDC1080 连接失败!----->\r\n");
//设置同时采集温度和湿度 14位分辨率 只要发送一个触发命令温湿度就会连续准换
HDC1080_Write_Register(HDC1080_CONFIG_ID, HDC1080_CONFIG_VALUE);
}
void HDC1080_Write_Register(unsigned char WriteAddr, unsigned int data)
{
uint8_t buf[2] = {0};
buf[0] = (uint8_t)(data>>8);
buf[1] = (uint8_t)(data&0x00ff);
IIC_Start(); //起始信号
IIC_SendoneByte(HDC1080_WRITE_ADDR); //HDC1080设备地址(7位设备地址+W/R)
IIC_Wait_ACK(); //产生应答
IIC_SendoneByte(WriteAddr); //寄存器地址
IIC_Wait_ACK(); //产生应答
IIC_SendoneByte(buf[0]); //写高位数据
IIC_Wait_ACK(); //产生应答
IIC_SendoneByte(buf[1]); //写低位数据
IIC_Stop(); //停止信号
}
//读生产商ID 设备ID
unsigned char HDC1080_Read_Register(unsigned char ReadAddr, \
unsigned char *buf, \
unsigned int length)
{
uint8_t i = 0;
IIC_Start(); //起始信号
IIC_SendoneByte(HDC1080_WRITE_ADDR); //HDC1080设备地址(7位设备地址+W/R)
IIC_Wait_ACK(); //产生应答
IIC_SendoneByte(ReadAddr); //寄存器地址
IIC_Wait_ACK(); //产生应答
IIC_Start(); //起始信号
IIC_SendoneByte(HDC1080_READ_ADDR); //HDC1080设备地址(7位设备地址+W/R) 读
IIC_Wait_ACK(); //产生应答
for(i = 0; i < length-1; i++)
{
buf[i] = IIC_ReadoneByte(); //读数据
IIC_Ack(); //主机产生应答
}
buf[i] = IIC_ReadoneByte(); //读数据
IIC_NAck(); //发送nACK
IIC_Stop(); //停止信号
return 0;
}
void Read_TH_Register(unsigned char *pbuff)
{
uint8_t length = 4, i = 0; //转换数据字节数
IIC_Start(); //起始信号
IIC_SendoneByte(HDC1080_WRITE_ADDR); //HDC1080设备地址(7位设备地址+W/R)
IIC_Wait_ACK(); //产生应答
IIC_SendoneByte(HDC1080_TEMPERATURE_ID); //触发事件地址
IIC_Wait_ACK(); //产生应答
delay_ms(10); //等待转化
IIC_Start(); //起始信号
IIC_SendoneByte(HDC1080_READ_ADDR); //HDC1080设备地址(7位设备地址+W/R) 读
IIC_Wait_ACK(); //产生应答
for(i = 0; i < length-1; i++)
{
pbuff[i] = IIC_ReadoneByte(); //读数据
IIC_Ack(); //主机产生应答
}
pbuff[i] = IIC_ReadoneByte();
IIC_NAck(); //发送nACK
IIC_Stop(); //停止信号
}
void Get_HDC1080_THValue(float *temp, float *humid)
{
uint8_t buf[4] = {0};
//读温湿度寄存器值保存在数组中
Read_TH_Register(buf);
//温度转换
*temp = (float)(buf[0]<<8|buf[1]);
*temp = (*temp/pow(2,16))*165-40;
//湿度转换
*humid = (float)(buf[2]<<8|buf[3]);
*humid = (*humid/pow(2, 16))*100;
}
hdc1080.h
#ifndef _HDC1080_DRIVE_H
#define _HDC1080_DRIVE_H
//寄存器地址
typedef enum{
HDC1080_WRITE_ADDR = 0x80,
HDC1080_READ_ADDR = 0x81,
HDC1080_MENUFACTURE_ID = 0xfe,
HDC1080_DEVICE_ID = 0xff,
HDC1080_CONFIG_ID = 0x02,
HDC1080_TEMPERATURE_ID = 0x00,
HDC1080_HUMIDITY_ID = 0x01,
}REGISTER_ADDR;
//寄存器值
typedef enum{
HDC1080_MENUFACTURE_ID_VALUE = 0x5449,
HDC1080_DEVICE_ID_VALUE = 0x1050,
HDC1080_CONFIG_VALUE = 0x1000, //温度 湿度同时转换 14位分辨率
}REGISTER_VALUE;
void HDC1080_Driver_Init(void);
void HDC1080_Write_Register(unsigned char WriteAddr, unsigned int data);
unsigned char HDC1080_Read_Register(unsigned char ReadAddr, unsigned char *buf, unsigned int length);
void Read_TH_Register(unsigned char *pbuff);
void Get_HDC1080_THValue(float *temp, float *humid);
#endif