4回答

0收藏

[评测分享] 【Silicon Labs EFR32xG22】I2C接口读取温湿度传感器

#板卡评测 #板卡评测 6624 人阅读 | 4 人回复 | 2020-07-21

本帖最后由 story_xjj 于 2020-7-21 08:48 编辑

I2C接口读取温湿度传感器
    主板集成有一个I2C接口的温湿度传感器SI7021,BRD4182A模块可以通过I2C接口读取SI7021的温湿度传感器数据。
    再前一个LCD演示实例的基础上,增加I2C接口读取SI7021的功能,并将读取的结果展示再LCD上。
1、硬件接口说明
EFR32MG22集成了I2C接口,通过主板连接器和主板连接,并且和主板共享SI7021。
根据手册的描述,模块的I2C0可以完成操作功能,其SCL通过PB02,SDA通过PB03和主板的传感器连接;传感器使能引脚PC07用来完成连接功能切换,高电平使能数据获取,低电平禁止数据获取。

2、硬件配置
  打开硬件配置器Configurator,在Defaultmode Peripherals页面选择“I2C Sensor”,如下图所示,并配置“Sensor enable pin”为PC07,“I2C peripheral”为 I2C0 。
系统自动为我们添加了I2C0的选择,我们同样需要配置I2C0,如下图所示。
选择mode为Master,Enable I2C after init 为 True,I2C SCL为PB02,I2C SDA为PB03 。
这样我们的硬件接口配置就算完成了。保存配置生成硬件接口配置文件。
3、软件说明
如前面所述,我们通过属性配置projectmodules,选择I2C SENSOR和I2CSPM两个模块,点击“OK”按钮保存选择。
这时候工程中自动为我们总结了I2CSPM的相关驱动,似乎没有SI7021的相关驱动软件出来。没办法我们手动添加。
在SDK目录\hardware\kit\common\drivers这个地方我们可以发现si7013的相关驱动,打开看到,这个驱动时支持SI7021的相关操作的,于是把驱动的c和h文件复制到工程目录下,并创建一个si7021的目录。
    I2C接口的初始化:

  1. static I2CSPM_Init_TypeDef i2c0_init = I2CSPM_INIT_SENSOR;
  2.              I2CSPM_Init(&i2c0_init);
复制代码

定义初始化参数变量,并调用I2CSPM_Init函数完成I2C0的初始化工作。
检查I2C总线上是否存在SI7021传感器。通过Si7013_Detect可以检查是否有si7021传感器,如果deviceId中返回的数据为21,表示总线上有我们需要的si7021传感器。

  1. static uint8_t deviceId;
  2.      Si7013_Detect(I2C0,SI7021_ADDR, &deviceId);
  3.      if(deviceId== 0x15)
  4.         sprintf(msg_ht_tm,"I2C_DEV:%s","si7021");
  5.     else
  6.         strcpy(msg_ht_tm,"I2C_DEV:");
  7.     GLIB_drawString(&context, msg_ht_tm, strlen(msg_ht_tm), 10, 60, true);
  8.     读取温湿度数据和数据处理。
  9.     static uint32_trhData;
  10.     static int32_t tData;
  11.     //读取si7021的温度和湿度
  12.       if(Si7013_MeasureRHAndTemp(I2C0,SI7021_ADDR, &rhData,&tData) == 0)
  13.       {
  14.          sprintf(msg_ht_tm,"Temp:%03ld.%03ld",tData/1000,tData%1000);
  15.          GLIB_drawString(&context,msg_ht_tm, strlen(msg_ht_tm), 10, 70, true);
  16.          sprintf(msg_ht_tm,"Humi:%03ld.%03ld",rhData/1000,rhData%1000);
  17.          GLIB_drawString(&context,msg_ht_tm, strlen(msg_ht_tm), 10, 80, true);
  18.                  }
复制代码

    驱动程序中帮我们完成了AD数据采集到实际温湿度的转换,传递给我们的数据为一个32位的整数,其中包括3位小数,所以我们显示的时候特殊的处理一下,将整数和小数挑出来,转换位适合我们观察的形式。

4、效果展示
实际执行效果,我们检测到了传感器SI7021,并且获取了其中的温湿度数据,显示在LCD显示器上。

分享到:
回复

使用道具 举报

回答|共 4 个

倒序浏览

沙发

yanyan0620

发表于 2020-8-5 09:02:26 | 只看该作者

代码部分直接放在si7031.c文件下吗,用iar编译是否也可以呢,这边一直报错
回复 支持 反对

使用道具 举报

板凳

story_xjj

发表于 2020-8-6 08:49:05 | 只看该作者

yanyan0620 发表于 2020-8-5 09:02
代码部分直接放在si7031.c文件下吗,用iar编译是否也可以呢,这边一直报错

没有测试过iar编译器,我用的官方的
回复 支持 反对

使用道具 举报

地板

yanyan0620

发表于 2020-8-6 11:06:29 | 只看该作者

story_xjj 发表于 2020-8-6 08:49
没有测试过iar编译器,我用的官方的

感谢回复,我使用GNU重新尝试了一下,但是还是没成功
回复 支持 反对

使用道具 举报

5#

story_xjj

发表于 2020-8-7 08:55:40 | 只看该作者

yanyan0620 发表于 2020-8-6 11:06
感谢回复,我使用GNU重新尝试了一下,但是还是没成功

是不是你的文件里面有中文字符啊,那种隐藏式的,你清理一下试试
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条