使用I2C-Tools直接访问I2C设备(i2cdetect、i2cdump、i2cget、i2cset)[精简版]

概述:本文是以实际访问i2c设备为例,简单介绍i2c-tools常用命令的用法。其中,使用的i2c设备硬件为DS1307 RTC时钟芯片(芯片手册可在博主资源中获取),设备地址为0x68。事实上,日常调试中只需记住常用的几个i2c-tools命令即可,能达到同样目的使用工具越少越好(太多反而记不住)。Linux知识犹如浩瀚大海,要学会做减法,择其有用者而从之,其无用者而弃之。


  • 什么是i2c-tools?

应用层访问硬件肯定是需要驱动程序的。对于I2C设备,Linux内核已经提供驱动程序drivers/i2c/i2c-dev.c,通过它可以直接使用下面的I2C控制器驱动程序来访问I2C设备,而i2c-tools正是基于该驱动开发的一套示例代码,也是一套好用的调试工具。框架如下:

使用I2C-Tools直接访问I2C设备(i2cdetect、i2cdump、i2cget、i2cset)[精简版]_第1张图片

  • 为什么要用i2c-tools?

实际工作中,我们通常在文件系统用i2c-tools调试I2C设备,而不是频繁的修改以及编译设备树和内核,这样大大提高了调试效率。

  • 怎么用i2c-tools?

首先我们要知道有i2c-tools这个东西,并且还知道有常用的几个命令:i2cdetect(检测I2C器件工具) 、i2cdump(查看寄存器值工具) 、i2cget(读取寄存器值工具)、 i2cset(设置寄存器值工具)。

现在重新回想一下本文要实现什么?本文要实现使用i2ctools直接访问i2c设备(RTC时钟芯片)。那么我们要首先搞清楚系统有几条i2c总线(即I2C控制器),待测试的i2c设备挂载哪个总线上,然后要对总线上哪个i2c设备进行读写。所以使用I2C-Tools时需要指定:

  • 哪个I2C控制器(或称为I2C BUS、I2C Adapter);
  • 哪个I2C设备(设备地址);
  • 数据:读还是写、数据本身。

这些操作使用前面介绍的几个命令足矣。知道有这几个命令,但不知道它们的具体用法。不用担心,写得好的程序在你输入命令格式不正确都会提示你怎么使用的。在可以在系统执行前面的任意指令,比如i2cdetect。你看,直接输出这个命令的用法,其他命令也一样。如果根据提示用法还是不太清楚怎么使用,可以再网上搜下资料,但希望你可以看懂它。

使用I2C-Tools直接访问I2C设备(i2cdetect、i2cdump、i2cget、i2cset)[精简版]_第2张图片

参数解析:

  • i2cdetect [-y] [-a] [-q|-r] I2CBUS [FIRST LAST]:对指定的 I2C 总线进行探测。参数y, a, q, r,自行可以尝试下区别。
  • i2cdetect -F I2CBUS:显示关于指定 I2C 总线的功能和特性。
  • i2cdetect -l:列出系统中存在的 I2C 总线列表。

 ## i2cdetect -l  //列出系统中存在的 I2C 总线列表,只有一条I2C0

##  i2cdetect -y 0    // 对I2C0 总线探测总线上的i2c设备 

使用I2C-Tools直接访问I2C设备(i2cdetect、i2cdump、i2cget、i2cset)[精简版]_第3张图片

返回参数说明:

‘--’:表示该地址被检测,但没有芯片应答;

UU’:表示该地址当前由内核驱动程序使用;

‘**’:**表示以十六进制表示的设备地址编号。

 ## i2cdump -f -y 0 0x68 //读取 I2C 总线 0 上地址为 0x68 的设备寄存器内容

使用I2C-Tools直接访问I2C设备(i2cdetect、i2cdump、i2cget、i2cset)[精简版]_第4张图片

阅读DS1307 RTC芯片手册(如下),往对应地址中写时间值,即可修改RTC时钟数据。年月日时分秒...分别对应地址参考手册。根据手册可知,寄存器地址0x06存放的是Year数据,往该地址写值即可修改年份,演示效果如下图。

使用I2C-Tools直接访问I2C设备(i2cdetect、i2cdump、i2cget、i2cset)[精简版]_第5张图片

##  i2cset -f -y 0 0x68 0x06 0x18  //设置为18年
##  i2cset -f -y 0 0x68 0x06 0x24  //设置为24年

使用I2C-Tools直接访问I2C设备(i2cdetect、i2cdump、i2cget、i2cset)[精简版]_第6张图片

##  i2cget -f -y 0 0x68 0x06       //读地址0x06的寄存器值

你可能感兴趣的:(linux)