2020|3

250

帖子

5

TA的资源

纯净的硅(初级)

楼主
 

【先楫HPM6750测评】+硬件IIC读取温湿度传感器数值 [复制链接]

 

在我们昨天尝试了下软件IIC读取之后,我稍微看了下先辑给的库,在硬件IIC上面也是非常简单的,基本就一个读取一个发送,这样我们可以尝试下硬件IIC读取我们的温湿度传感器,主要后面我们需要通过硬件IIC来进行触摸屏的移植工作。

  • #include <stdio.h>
  • #include "board.h"
  • #include "hpm_debug_console.h"
  • #define LED_FLASH_PERIOD_IN_MS 300
  • #include "sht20.h"
  • #include "i2c.h"
  • #include "hpm_i2c_drv.h"
  • float t = 12.67;
  • #define SHT20_WriteAddr 0x40
  • #define SHT20_ReadAddr  0x40
  • #define SHT20_I2C                BOARD_APP_I2C_BASE
  • #define SHT20_I2C_CLOCK_NAME     BOARD_APP_I2C_CLK_NAME
  • float TemValue,RhValue;
  • void SHT20_ReadValues(void)
  • {
  •   uint8_t tem[3],rh[3];
  •   uint16_t Tdata=0,RHdata=0;
  •   uint8_t cmd=SHT20_Measurement_T_HM;
  •   if (status_success != i2c_master_write(SHT20_I2C, SHT20_WriteAddr, &cmd, sizeof(cmd))) {
  •   printf("Master write failed");
  •   while (1) {
  •   }
  •   }
  •   if (status_success != i2c_master_read(SHT20_I2C, SHT20_ReadAddr,tem,sizeof(tem))) {
  •   printf("Master read failed\n");
  •   while (1) {
  •   }
  •   }
  •   delay_ms(100);
  •   cmd=SHT20_Measurement_RH_HM;
  •   if (status_success != i2c_master_write(SHT20_I2C, SHT20_WriteAddr, &cmd, sizeof(cmd))) {
  •   printf("Master write failed");
  •   while (1) {
  •   }
  •   }
  •   if (status_success != i2c_master_read(SHT20_I2C, SHT20_ReadAddr,rh,sizeof(rh))) {
  •   printf("Master read failed\n");
  •   while (1) {
  •   }
  •   }
  •   delay_ms(100);
  •   Tdata = tem[0];
  •   Tdata <<= 8;
  •   Tdata += tem[1] & 0xfe;
  •   RHdata = rh[0];
  •   RHdata <<= 8;
  •   RHdata += rh[1] & 0xfe;
  •   TemValue = Tdata * 175.72f / 65536 - 46.85f;
  •   RhValue = RHdata * 125.0f / 65536 - 6.0f;
  • }
  • void SHT20_SoftReset(void)
  • {
  •   uint8_t cmd=0xfe;
  •   if (status_success != i2c_master_write(SHT20_I2C, SHT20_WriteAddr, &cmd, sizeof(cmd))) {
  •     printf("Master write failed");
  •     while (1) {
  •     }
  •   }
  •     delay_ms(100);
  • }
  • int main(void)
  • {
  •     
  •     int u;
  •     hpm_stat_t stat;
  •     uint32_t freq;
  •     i2c_config_t config;
  •     board_init();
  •     board_init_led_pins();
  •     init_i2c_pins(SHT20_I2C);
  •     config.i2c_mode = i2c_mode_normal;
  •     config.is_10bit_addressing = false;
  •     freq = clock_get_frequency(SHT20_I2C_CLOCK_NAME);
  •     stat = i2c_init_master(SHT20_I2C, freq, &config);
  •     if (stat != status_success) {
  •         return stat;
  •     }
  •     board_timer_create(LED_FLASH_PERIOD_IN_MS, board_led_toggle);
  •     IIC_Init();
  •     printf("hello world\n");
  •     while(1)
  •     {
  •         //SHT20_GetValue();
  •         SHT20_SoftReset();
  •         SHT20_ReadValues();
  •         //u = getchar();
  •         //if (u == '\r') {
  •         //    u = '\n';
  •         //}
  •         //printf("%c", u);
  •         //printf("TEMP:%f\r\n",sht20Info.tempreture);
  •         //printf("HUMI:%f\r\n",sht20Info.humidity);
  •         
  •         printf("TEMP:%f\r\n",TemValue);
  •         printf("HUMI:%f\r\n",RhValue);
  •         printf("ceshi:%f\r\n",t);
  •         delay_ms(1000);
  •     }
  •     return 0;
  • }

看下上面的代码,我们对IIC的读取和写入就只需要一个函数就能搞定了。

 

需要注意下我们的地址,读写其实都是一个,看下里面读取是自己会加1,还有我们的地址其实是7位的。他会自己进行移位操作。

 

 

之后我们的确定下我们使用的端口,看代码是我们的I2C0,所以在P1上找到端口接上即可。

 

然后我们看下我们的SHT20的一个读写时序,可以看到其在发送完读取寄存器后,会有个转换时间的等待,所以这里我们需要修改下先辑提供的库了,不然永远返回的都是读取错误。

 

 

 

我们看下里面的源码,其是有一个判断超时的,是一个宏定义,所以我们需要修改下这个宏定义。

 

我在最开头的地方给其增大了很多,因为其CPU主频太高,速度快,所以增大了很多,这个值可以自己尝试修改,大概到不报读取错误即可。

 

之后打印,基本上和之前都是一样的操作,不同的是这次使用了硬件IIC。

最新回复

教程挺详细的,不过代码感觉每行中间都空了一行。   详情 回复 发表于 2022-8-22 16:22
点赞 关注
 
 

回复
举报

7201

帖子

11

TA的资源

版主

沙发
 

版主大佬,帖子真心写得好,学习了,感谢分享!

 
 
 

回复

7494

帖子

2

TA的资源

版主

板凳
 

教程挺详细的,不过代码感觉每行中间都空了一行。

点评

没有修改了,就直接贴的 搜索 复制  详情 回复 发表于 2022-8-22 20:00
 
 
 

回复

250

帖子

5

TA的资源

纯净的硅(初级)

4
 
wangerxian 发表于 2022-8-22 16:22 教程挺详细的,不过代码感觉每行中间都空了一行。

没有修改了,就直接贴的

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
报名最后一周!2025 英飞凌消费、计算与通讯创新大会-北京站
会议时间:3月18日(周二)09:30签到
参会奖励:电动螺丝刀套装、户外登山包、京东卡

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表