sht30是盛世瑞恩出产的一款温湿度传感器,去年小米发布的一款温湿度测量笔用的也是这款传感器。关于这款传感器的介绍在这里就不再赘述,主要聊一聊在rk3128上的调试过程。 sht30是基于i2c传输协议的,rk3128的板子上有三组i2c接口可供使用。打开kernel/arch/arm64/boot/dts/rockchip/rk3128-xcy.dtsi该设备树文件,可以看到已经注册了一组i2c1设备,因此我们可以直接调用。 &i2c1 { clock-frequency = <400000>; status = "okay"; #sound-dai-cells = <0>; compatible = "ti,tas5731"; reg = <0x1a>; clocks = <&cru SCLK_I2S1_8CH_TX_OUT>; clock-names = "mclk"; pinctrl-names = "default"; pinctrl-0 = <&i2s_8ch_1_m0_mclk>; pdn-gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>; reset-gpios = <&gpio1 RK_PA1 GPIO_ACTIVE_LOW>; }; 复制代码 调试过程发现,他的输出结果并不是标准的温度湿度数据,阅读datasheet后发现,需要通过数学公式转化,下面是代码实现过程: ST = buf[0]; ST <<= 8; ST |= buf[1]; SRH = buf[3]; SRH <<= 8; SRH |= buf[4]; tempC = -45.0 + (175.0 * ((float) ST /(float) 0xFFFF)); //摄氏度数据 tempF = tempC * 9 / 5 + 32; //华氏度数据 hum = 100.0 * ((float) SRH / (float)0xFFFF); //湿度数据 复制代码 sht30使用crc校验,关于这种校验码可以上网查找,这里讲代码实现过程 uint8_t crc8(const uint8_t *data, int len) { const uint8_t POLYNOMIAL = 0x31; uint8_t crc = 0xFF; int j; int i; for(j = len; j; --j ) { crc ^= *data++; for ( i = 8; i; --i ) { crc = ( crc & 0x80 )? (crc << 1) ^ POLYNOMIAL: (crc <<1); } } return crc; } //数据校验判断步骤 if ( buf[2] != crc8(buf, 2) || buf[5] != crc8(buf+3, 2)) return SHT30_CRC_CHECK_FAILED; 复制代码 笔者做了一份demo,编译后直接将可执行文件烧进板子,然后执行便可以得到当前环境的温湿度数据: # ./main p Temperature 27.65c - 81.76f Humidity 73.54% #
|