本帖最后由 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接口的初始化:
- static I2CSPM_Init_TypeDef i2c0_init = I2CSPM_INIT_SENSOR;
- I2CSPM_Init(&i2c0_init);
复制代码
定义初始化参数变量,并调用I2CSPM_Init函数完成I2C0的初始化工作。 检查I2C总线上是否存在SI7021传感器。通过Si7013_Detect可以检查是否有si7021传感器,如果deviceId中返回的数据为21,表示总线上有我们需要的si7021传感器。
- static uint8_t deviceId;
- Si7013_Detect(I2C0,SI7021_ADDR, &deviceId);
- if(deviceId== 0x15)
- sprintf(msg_ht_tm,"I2C_DEV:%s","si7021");
- else
- strcpy(msg_ht_tm,"I2C_DEV:");
- GLIB_drawString(&context, msg_ht_tm, strlen(msg_ht_tm), 10, 60, true);
- 读取温湿度数据和数据处理。
- static uint32_trhData;
- static int32_t tData;
- //读取si7021的温度和湿度
- if(Si7013_MeasureRHAndTemp(I2C0,SI7021_ADDR, &rhData,&tData) == 0)
- {
- sprintf(msg_ht_tm,"Temp:%03ld.%03ld",tData/1000,tData%1000);
- GLIB_drawString(&context,msg_ht_tm, strlen(msg_ht_tm), 10, 70, true);
- sprintf(msg_ht_tm,"Humi:%03ld.%03ld",rhData/1000,rhData%1000);
- GLIB_drawString(&context,msg_ht_tm, strlen(msg_ht_tm), 10, 80, true);
- }
复制代码
驱动程序中帮我们完成了AD数据采集到实际温湿度的转换,传递给我们的数据为一个32位的整数,其中包括3位小数,所以我们显示的时候特殊的处理一下,将整数和小数挑出来,转换位适合我们观察的形式。
4、效果展示 实际执行效果,我们检测到了传感器SI7021,并且获取了其中的温湿度数据,显示在LCD显示器上。
|