andy_2023 2023-03-21 15:37 采纳率: 28.6%
浏览 6

RK3568是否可以用你附件这个驱动HDC2010?

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-03-27 19:29
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 这篇文章: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
      


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 3月21日

悬赏问题

  • ¥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 这种情况的伯德图和奈奎斯特曲线怎么分析?