1条回答 默认 最新
关注
不知道你这个问题是否已经解决, 如果还没有解决的话:- 这篇文章:rk356x编译时报错解决方法 也许能够解决你的问题,你可以看下
- 除此之外, 这篇博客: HDC1080介绍与使用中的 六、源码 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
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
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决 无用评论 打赏 举报
悬赏问题
- ¥15 centos7.9升级python3.0的问题
- ¥15 如何解决调试dev-出++5.11不成功问题
- ¥15 安装CentOS6时卡住
- ¥20 关于#监控系统#的问题,如何解决?(相关搜索:系统软件)
- ¥20 c语言写的8051单片机存储器mt29的模块程序
- ¥60 求直线方程 使平面上n个点在直线同侧并且距离总和最小
- ¥50 java算法,给定试题的难度数量(简单,普通,困难),和试题类型数量(单选,多选,判断),以及题库中各种类型的题有多少道,求能否随机抽题。
- ¥50 rk3588板端推理
- ¥250 opencv怎么去掉 数字0中间的斜杠。
- ¥15 这种情况的伯德图和奈奎斯特曲线怎么分析?