建网站得钱吗/seo外链推广员
目录
概述
1 探究platform tree下的i2c
1.1 platform tree下的i2c驱动
1.2 查看i2c总线下的设备
1.3 使用命令读写设备寄存器
2 认识HS3003
2.1 HS3003特性
2.2 HS3003寄存器
2.2.1 温湿度数据寄存器
2.2.2 参数寄存器
2.2.3 一个参数配置Demo
2.3 温湿度值转换
2.4 HS3003应用电路
2.4.1 PIN引脚定义
2.4.2 sensor 应用电路
3 驱动程序实现
4 测试程序实现
5 编译和验证
6 波形分析
概述
本文主要介绍platform tree架构下i2c驱动的使用方法,并介绍如何使用i2c-tools来探测总线上的设备信息。然后详细介绍HS3003的芯片的使用方法,并使用i2c驱动接口,实现该芯片的驱动程序,然后再板卡上测试验证该程序,并通过逻辑分析仪查看这个读写过程的波形。
1 探究platform tree下的i2c
1.1 platform tree下的i2c驱动
启动板卡,查询/dev/下驱动情况 , 使用命令:
ls /dev/ -l
执行命名后,可列出该目录下所有的驱动信息,找出i2c驱动,如下:
由上图可得,板卡driver下,由两个i2c接口,分别为i2c-0和i2c-1
1.2 查看i2c总线下的设备
i2c总线上可以挂载多个device,其要求在同一条总线上,每个设备的地址必须唯一性。如果两个设备的地址一样,会出现时序混乱。
下面通过命令来探测一下i2c总线下的设备情况
1) 查看i2c-0下设备情况
使用命令
i2cdetect -a 0
执行该命令后,列出设备地址信息: 该总线下有两个设备,其地址分别为:0x1a和0x1e
2) 查看i2c-1下设备情况
使用命令
i2cdetect -a 1
执行该命令后,列出设备地址信息: 该总线下有三个设备,其地址分别为:0x40,0x44,和0x44
1.3 使用命令读写设备寄存器
使用 i2c-tools 工具包提供了一些非常方便的工具来对系统的 I2C 总线进行调试。下面以HS3003为例,使用i2c-tools工具来操作其内部的寄存器。
1)查看设备地址0x44下所有的寄存器信息
i2cdump -f -y 1 0x44
2) 读取寄存器的值
i2cget -f -y 1 0x44 0x06
3)写寄存器的值
i2cset -f -y 1 0x44 0xA0 0x10 0x40
2 认识HS3003
2.1 HS3003特性
HS3003是瑞萨公司出品的一款高精度温湿度传感器,下面看看其主要参数:
2.2 HS3003寄存器
HS3003采用标准的I2C通信方式,对其寄存器的操作必须遵循标准的I2C时序。现在分析如何操作其寄存器,读取数据。
2.2.1 温湿度数据寄存器
温湿度数据寄存器的数据位定义如下,其主要由四个字节组成一个32bit数据, bit-0 和 bit-1为Mask,其主要用来标记当前数据是否有效(mask =0 数据有效), 温度数据(低16 bit ): bit-2 ~ bit ~ 15
湿度数据( 高16 bit): bit-8 ~ bit 13
采样温湿度数据间隔时间根据配置的ADC精度来选取,精度要求越高,采样所需要的时间就越长。那么读取数据时,需要等待的时间就越长。
2.2.2 参数寄存器
精度参数如下:
参数寄存器列表
如何配置参数呢?芯片手册给了四个步骤
2.2.3 一个参数配置Demo
下面给一个各一个配置参数的范例,配置humidity 的采集精度为12bit, 那么参数设定如下:
bit-10: 0
bit-11: 1
typedef struct
{unsigned short res1 : 10;unsigned short tempdata : 2;unsigned short res2 : 4;
} stru_para_bit;typedef struct{union{unsigned short data;stru_para_bit para_bit;};
}stru_para;int hs300x_init(void)
{int ret;unsigned char buff[4];stru_para para;// step-1 write data from 0x06buff[0] = 0x06;buff[1] = 0;buff[2] = 0;ret = write(fd, buff, 3);if( ret < 0 ){printf("read temper cmd to hs3003 register failure.\n");return -1;}// step -2: read reg - 0x81buff[0] = 0x81;ret = write(fd, buff, 1);if( ret < 0 ){printf("read cmd to hs3003 register failure. \r\n");return -1;}ret = read(fd, buff, 2);if( ret < 0 ){printf("write cmd to hs3003 register failure.\n");return -1;}printf(" read reg: 0x81 - data0 = %02x data1 = %02x \r\n",buff[0],buff[1]);//step -3: write data from 0x46para.data = buff[0]<<8 | buff[1];para.para_bit.tempdata = 1; buff[0] = 0x46;buff[1] = (unsigned char)para.data;buff[2] = (unsigned char)(para.data>>8);ret = write(fd, buff, 3);if( ret < 0 ){printf("write cmd to hs3003 register failure. \r\n");return -1;}printf("write reg: 0x46 - data0 = %02x data1 = %02x \r\n",buff[0],buff[1]);return 0;
}
2.3 温湿度值转换
datasheet中给的转换公式如下:
下面看看在程序中如何实现温湿度值转换的
首先定义一个数据结构
typedef struct
{unsigned int mask : 2;unsigned int tempdata : 14;unsigned int humidydata : 14;unsigned int res : 2;
} Datafetch_bit;typedef struct{union{unsigned int data;Datafetch_bit fetch_bit;};float tempval;float humival;
}hs300x_data;
从温湿度的数据寄存器中读取出来有四个分别为8bit的数据, 将该数据拼成一个32bit的数据,在赋值给data, 上述数据结构会自动解析该数据。通过mask位判断数据是否有效。
phs300x_data->data = ((buff[0] << 24U) |(buff[1] << 16U) |(buff[2] << 8U)|(buff[3]));if( phs300x_data->fetch_bit.mask == HS300X_DATA_VALID){// get temperature value val = phs300x_data->fetch_bit.tempdata;phs300x_data->tempval = (double)val/(double)(HS300X_DATA_FACTOR) * 165.0 - 40;printf(" - TM(C): %.2f \r\n", phs300x_data->tempval);// get humidity value val = phs300x_data->fetch_bit.humidydata;phs300x_data->humival = (double)val/(double)(HS300X_DATA_FACTOR) * 100.0;printf(" - HM(\%): %.2f \r\n", phs300x_data->humival);}
2.4 HS3003应用电路
2.4.1 PIN引脚定义
传感器封装
pin引脚
2.4.2 sensor 应用电路
下面是传感器模块的实际应用电路:
3 驱动程序实现
编写驱动程序代码:
/***************************************************************
Copyright 2024-2029. All rights reserved.
文件名 : drv_hs3003.c
作者 : tangmingfei2013@126.com
版本 : V1.0
描述 : hs3003驱动程序
其他 : 无
日志 : 初版V1.0 2024/02/01***************************************************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/types.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <linux/fs.h>
#include <errno.h>
#include <assert.h>
#include <string.h>
#include <time.h>/* hs3003 i2c address */
#define HS300X_ADDR (0x44U)#define HS300X_DATA_VALID (0x00U)
#define HS300X_DATA_STALE (0x01U)
#define HS300X_STATUS_MASK (0xC0000000U)
#define HS300X_STATUS_POS (30U)#define HS300X_DATA_MASK (0x3FFFFFFCU)
#define HS300X_HUMI_DATA_MASK (0x3FFF0000U)
#define HS300X_HUMI_DATA_POS (16U)
#define HS300X_TEMP_DATA_MASK (0x0000FFFCU)
#define HS300X_TEMP_DATA_POS (2U)#define HS300X_REG_R_TRG 0X06
#define HS300X_REG_W_TRG 0X46/* calculation formula, 2^14 - 1 */
#define HS300X_DATA_FACTOR (16383U)#define DEV_FILE "/dev/i2c-1"typedef struct
{unsigned int mask : 2;unsigned int tempdata : 14;unsigned int humidydata : 14;unsigned int res : 2;
} Datafetch_bit;typedef struct{union{unsigned int data;Datafetch_bit fetch_bit;};float tempval;float humival;
}hs300x_data;typedef struct
{unsigned short res1 : 10;unsigned short tempdata : 2;unsigned short res2 : 4;
} stru_para_bit;typedef struct{union{unsigned short data;stru_para_bit para_bit;};
}stru_para;static int fd = -1;static int hs300x_drv_init(void)
{fd = open(DEV_FILE, O_RDWR);if( fd < 0 ){close( fd );printf("%s %s i2c device open failure: %s\n", __FILE__, __FUNCTION__, strerror(errno));return -1;}ioctl(fd, I2C_TENBIT, 0);ioctl(fd, I2C_SLAVE, HS300X_ADDR);printf("init hs3003!\r\n");return fd;
}int hs300x_init(void)
{int ret;unsigned char buff[4];stru_para para;hs300x_drv_init();// step-1 write data from 0x06buff[0] = 0x06;buff[1] = 0;buff[2] = 0;ret = write(fd, buff, 3);if( ret < 0 ){printf("read temper cmd to hs3003 register failure.\n");return -1;}// step -2: read reg - 0x81buff[0] = 0x81;ret = write(fd, buff, 1);if( ret < 0 ){printf("read cmd to hs3003 register failure. \r\n");return -1;}ret = read(fd, buff, 2);if( ret < 0 ){printf("write cmd to hs3003 register failure.\n");return -1;}printf(" read reg: 0x81 - data0 = %02x data1 = %02x \r\n",buff[0],buff[1]);//step -3: write data from 0x46para.data = buff[0]<<8 | buff[1];para.para_bit.tempdata = 1; buff[0] = 0x46;buff[1] = (unsigned char)para.data;buff[2] = (unsigned char)(para.data>>8);ret = write(fd, buff, 3);if( ret < 0 ){printf("write cmd to hs3003 register failure. \r\n");return -1;}printf("write reg: 0x46 - data0 = %02x data1 = %02x \r\n",buff[0],buff[1]);return 0;
}int hs300x_read_value(hs300x_data *phs300x_data)
{int ret;unsigned char buff[4];unsigned int val;stru_para para;// write data to 0xa0para.data = 0;buff[0] = 0xa0;buff[1] = (unsigned char)para.data;buff[2] = (unsigned char)(para.data>>8);ret = write(fd, buff, 3);if( ret < 0 ){printf("write cmd to hs3003 register failure.\n");return -1;}sleep(1);ret = read(fd, buff, 4);if( ret < 0 ){printf("get the hs3003 value failure.\n");return -1;}printf(" - data0 = %02x data1 = %02x data3 = %02x data4 = %02x \r\n",buff[0],buff[1],buff[2],buff[3]);phs300x_data->data = ((buff[0] << 24U) |(buff[1] << 16U) |(buff[2] << 8U)|(buff[3]));if( phs300x_data->fetch_bit.mask == HS300X_DATA_VALID){// get temperature value val = phs300x_data->fetch_bit.tempdata;phs300x_data->tempval = (double)val/(double)(HS300X_DATA_FACTOR) * 165.0 - 40;printf(" - TM(C): %.2f \r\n", phs300x_data->tempval);// get humidity value val = phs300x_data->fetch_bit.humidydata;phs300x_data->humival = (double)val/(double)(HS300X_DATA_FACTOR) * 100.0;printf(" - HM(\%): %.2f \r\n", phs300x_data->humival);}return 0;
}
4 测试程序实现
编写测试程序来验证该驱动程序
int main(void)
{hs300x_data stru_hs300x;int count_run = 10000;int set;set = hs300x_init();if( set < 0){printf("initial hs3003 failure.\r\n");return -1;}while( count_run > 0){set = hs300x_read_value( &stru_hs300x );if(set != -1){//printf( "\r\n lux: %d ", temper);}else{printf("read isl19035 failure. \r\n");}count_run--;sleep(1);}return 0;
}
5 编译和验证
编写Makefile ,编译测试代码,并将其copy到共享目录下,方便在板卡中运行该App
CFLAGS= -Wall -O2
CC=/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc
STRIP=/home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-stripdev_13_hs3003: dev_13_hs3003.o$(CC) $(CFLAGS) -o dev_13_hs3003 dev_13_hs3003.o$(STRIP) -s dev_13_hs3003clean:rm -f dev_13_hs3003 dev_13_hs3003.o
编译代码
运行App, 测试程序能正确地读取温度和湿度值。
6 波形分析
1)触发数据转换命令
2)读数据波形
3) 逻辑分析仪解析到的数据列表
相关文章:

platform tree架构下i2c应用实例(HS3003)
目录 概述 1 探究platform tree下的i2c 1.1 platform tree下的i2c驱动 1.2 查看i2c总线下的设备 1.3 使用命令读写设备寄存器 2 认识HS3003 2.1 HS3003特性 2.2 HS3003寄存器 2.2.1 温湿度数据寄存器 2.2.2 参数寄存器 2.2.3 一个参数配置Demo 2.3 温湿度值转换 2.…...

Mongodb聚合:$planCacheStats
执行查询时,MongoDB 查询规划器会根据可用索引选择并缓存效率最高的查询计划。$planCache可以返回所有集合的查询计划缓存信息。要使用$planCache,必须把$planCacheStats阶段放在管道最前面。 语法 { $planCacheStats: { } }使用 $planCacheStats必须…...

8个简约精美的WordPress外贸网站主题模板
Simplify WordPress外贸网站模板 Simplify WordPress外贸网站模板,简洁实用的外贸公司wordpress外贸建站模板。 查看演示 Invisible Trade WP外贸网站模板 WordPress Invisible Trade外贸网站模板,做进出口贸易公司官网的wordpress网站模板。 查看演…...

本地缓存Ehcache的应用实践 | 京东云技术团队
java本地缓存包含多个框架,其中常用的包括:Caffeine、Guava Cache和Ehcache, 其中Caffeine号称本地缓存之王,也是近年来被众多程序员推崇的缓存框架,同时也是SpringBoot内置的本地缓存实现。但是除了Caffeine之外&…...

linux一键换源
使用方法 - LinuxMirrors 使用方法 一键执行命令# 中国大陆(默认) 海外地区 bash <(curl -sSL https://linuxmirrors.cn/main.sh)-----------------------------------| ⡇ ⠄ ⣀⡀ ⡀⢀ ⡀⢀ ⡷⢾ ⠄ ⡀⣀ ⡀⣀ ⢀⡀ ⡀⣀ ⢀⣀ || ⠧⠤ ⠇ ⠇⠸ …...

Python Scapy库实现ARP扫描和ARP欺骗
ARP扫描:检测指定IP网段中哪些主机是在线的,并获取它们的MAC地址 from scapy.all import * import argparse import threading import time import logging # 解析CIDR格式的网段,并返回IP地址列表 # >接受一个CIDR格式的网段…...

Fink CDC数据同步(六)数据入湖Hudi
数据入湖Hudi Apache Hudi(简称:Hudi)使得您能在hadoop兼容的存储之上存储大量数据,同时它还提供两种原语,使得除了经典的批处理之外,还可以在数据湖上进行流处理。这两种原语分别是: Update/Delete记录:H…...

线程和进程的区别及基础线程创建
1 线程和进程的区别 资源分配和调度: 进程(火车)是操作系统进行资源分配和调度的最小单位。它有自己的独立资源空间,包括内存、文件句柄等。线程(车厢)是CPU调度的最小单位。一个进程可以包含多个线程&…...

如何使用postman进行接口调试
使用Postman进行接口调试 有些时候我们写代码的时候,会发现接口有报错,提示参数错误,我们为了更好的排查错误原因,可以在Postman上进行接口调试。将url,请求方式,参数,cookie都填写到Postman中…...

Leetcode 198 打家劫舍
题意理解: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代…...

相机图像质量研究(9)常见问题总结:光学结构对成像的影响--工厂镜头组装
系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...

Linux内核与驱动面试经典“小”问题集锦(5)
接前一篇文章:Linux内核与驱动面试经典“小”问题集锦(4) 问题6 问:mutex_lock和mutex_lock_interruptible的区别是什么? 备注:此问题也是笔者近期参加蔚来面试时遇到的一个问题。 答: 尽管…...

基于51 单片机的交通灯系统 源码+仿真+ppt
主要内容: 1)南北方向的绿灯、东西方向的红灯同时亮40秒。 2)南北方向的绿灯灭、黄灯亮5秒,同时东西方向的红灯继续亮。 3)南北方向的黄灯灭、左转绿灯亮,持续20秒,同时东西方向的红灯继续…...

【蓝桥杯冲冲冲】[NOIP2017 提高组] 宝藏
蓝桥杯备赛 | 洛谷做题打卡day29 文章目录 蓝桥杯备赛 | 洛谷做题打卡day29[NOIP2017 提高组] 宝藏题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2提示题解代码我的一些话[NOIP2017 提高组] 宝藏 题目背景 NOIP2017 D2T2 题目描…...

C#中实现串口通讯和网口通讯(使用SerialPort和Socket类)
仅作自己学习使用 1 准备部份 串口通讯需要两个调试软件commix和Virtual Serial Port Driver,分别用于监视串口和创造虚拟串口。网口通讯需要一个网口调试助手,网络上有很多资源,我在这里采用的是微软商店中的TCP/UDP网络调试助手࿰…...

LeetCode回溯算法的解题思路
回溯法概念 回溯法:一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化抛弃该解,即回溯并且再次尝试。 应用场景 回溯算…...

泰克示波器(TBS2000系列)数学运算功能使用
目录 1 数学运算菜单1.1 运算符选择1.2 信源选择1.3 数学运算结果 1 数学运算菜单 Math运算按钮,用于实现对两个通道的信号进行实时的“加、减、乘”运算,计算时信源1在前面,信源2在运算符的右边,设置时设置信源与运算符就行了。…...

数据结构与算法之美学习笔记:50 | 索引:如何在海量数据中快速查找某个数据?
目录 前言为什么需要索引?索引的需求定义构建索引常用的数据结构有哪些?总结引申 前言 本节课程思维导图: 在第 48 节中,我们讲了 MySQL 数据库索引的实现原理。MySQL 底层依赖的是 B 树这种数据结构。留言里有同学问我ÿ…...

Python(SQLite)executescript用法
SQLite 数据库模块的游标对象还包含了一个 executescript() 方法,这不是一个标准的 API 方法,这意味着在其他数据库 API 模块中可能没有这个方法。但是这个方法却很实用,它可以执行一段 SQL 脚本。 例如,如下程序使用 executescr…...

BUUCTF-Real-[ThinkPHP]IN SQL INJECTION
目录 漏洞描述 漏洞分析 漏洞复现 漏洞描述 漏洞发现时间: 2018-09-04 CVE 参考:CVE-2018-16385 最高严重级别:低风险 受影响的系统:ThinkPHP < 5.1.23 漏洞描述: ThinkPHP是一款快速、兼容、简单的轻量级国产P…...

python安装步骤
安装 Python 的步骤如下: 在 Python 官方网站(https://www.python.org)上下载 Python 安装程序。运行下载的安装程序。在安装程序中选择要安装的 Python 版本(通常选择最新版本),并选择安装目录。确保勾选…...

BlueLotus 下载安装使用
说明 蓝莲花平台BlueLotus,是清华大学曾经的蓝莲花战队搭建的平台,该平台用于接收xss返回数据。 正常执行反射型xss和存储型xss: 反射型在执行poc时,会直接在页面弹出执行注入的poc代码;存储型则是在将poc代码注入用…...

.[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
导言: 在当今数字化时代,勒索病毒已成为网络安全领域的一大威胁。其中一种新近出现的勒索病毒是由[hudsonLcock.li].mkp[hendersoncock.li].mkp[myersairmail.cc].mkp制作的,它以其高效的加密算法和勒索方式而备受关注。本文91数据恢复将介绍…...

基于SpringBoot和PostGIS的震中影响范围可视化实践
目录 前言 一、基础数据 1、地震基础信息 2、全国行政村 二、Java后台服务设计 1、实体类设计 2、Mapper类设计 3、控制器设计 三、前端展示 1、初始化图例 2、震中位置及影响范围标记 3、行政村点查询及标记 总结 前言 地震等自然灾害目前还是依然不能进行准确的预…...

JUnit实践教程——Java的单元测试框架
前言 大家好,我是chowley,最近在学单元测试框架——JUnit,写个博客记录一下! 在软件开发中,单元测试是确保代码质量和稳定性的重要手段之一。JUnit作为Java领域最流行的单元测试框架,为开发人员提供了简单…...

选择大语言模型:2024 年开源 LLM 入门指南
作者:来自 Elastic Aditya Tripathi 如果说人工智能在 2023 年起飞,这绝对是轻描淡写的说法。数千种新的人工智能工具被推出,人工智能功能被添加到现有的应用程序中,好莱坞因对这项技术的担忧而戛然而止。 甚至还有一个人工智能工…...

ElastAlert 错误日志告警
文章目录 前言一、ElastAlert 概览1.1 简介1.2 ElastAlert 特性 二、ElastAlert 下载部署2.1 安装 Python3 环境2.2 下载 ElastAlert2.3 部署 ElastAlert 三、接入平台3.1 对外接口层3.2 服务层 前言 ElastAlert 是 Yelp 公司基于 python 开发的 ELK 日志告警插件,…...
假设检验的过程
假设检验的核心思想是小概率事件在一次实验中不可能发生,假设检验就是利用小概率事件的发生进行反正。学习假设检验,有几个概念不能跳过,原假设、p值 1.原假设 假设检验的基本过程如下: 1)做出一个假设H0,…...

vue项目打包部署到flask等后端服务里面,实现前后端不分离部署,解决空白页面和刷新页面not fount问题
1. 编译模式一定要设置为esnext,否则会报错: Strict MIME type checking is enforced for module scripts per HTML spec.Expected a JavaScript module script but the server responded with a MIME type of "text/plain". 具体解释可以看vi…...

labelimg 在pycharm下载使用
labelimg 使用数据标注工具 labelimg 制作数据集 在pycharm中搜索labelimg 选择版本安装 labelimg install 使用数据标注工具制作数据集 启动 带参数启动 1、cmd cd到指定目录 2、带参数启动标注工具 左侧可以选择切换为需要的数据格式 一些快捷键 和自动保存,…...