概述:本文是以实际访问i2c设备为例,简单介绍i2c-tools常用命令的用法。其中,使用的i2c设备硬件为DS1307 RTC时钟芯片(芯片手册可在博主资源中获取),设备地址为0x68。事实上,日常调试中只需记住常用的几个i2c-tools命令即可,能达到同样目的使用工具越少越好(太多反而记不住)。Linux知识犹如浩瀚大海,要学会做减法,择其有用者而从之,其无用者而弃之。
应用层访问硬件肯定是需要驱动程序的。对于I2C设备,Linux内核已经提供驱动程序drivers/i2c/i2c-dev.c
,通过它可以直接使用下面的I2C控制器驱动程序来访问I2C设备,而i2c-tools正是基于该驱动开发的一套示例代码,也是一套好用的调试工具。框架如下:
实际工作中,我们通常在文件系统用i2c-tools调试I2C设备,而不是频繁的修改以及编译设备树和内核,这样大大提高了调试效率。
首先我们要知道有i2c-tools这个东西,并且还知道有常用的几个命令:i2cdetect(检测I2C器件工具) 、i2cdump(查看寄存器值工具) 、i2cget(读取寄存器值工具)、 i2cset(设置寄存器值工具)。
现在重新回想一下本文要实现什么?本文要实现使用i2ctools直接访问i2c设备(RTC时钟芯片)。那么我们要首先搞清楚系统有几条i2c总线(即I2C控制器),待测试的i2c设备挂载哪个总线上,然后要对总线上哪个i2c设备进行读写。所以使用I2C-Tools时需要指定:
这些操作使用前面介绍的几个命令足矣。知道有这几个命令,但不知道它们的具体用法。不用担心,写得好的程序在你输入命令格式不正确都会提示你怎么使用的。在可以在系统执行前面的任意指令,比如i2cdetect。你看,直接输出这个命令的用法,其他命令也一样。如果根据提示用法还是不太清楚怎么使用,可以再网上搜下资料,但希望你可以看懂它。
参数解析:
?## i2cdetect -l ?//列出系统中存在的 I2C 总线列表,只有一条I2C0
##? i2cdetect -y 0 ? ?// 对I2C0 总线探测总线上的i2c设备?
返回参数说明:
‘--’:表示该地址被检测,但没有芯片应答;
‘UU’:表示该地址当前由内核驱动程序使用;
‘**’:**表示以十六进制表示的设备地址编号。
?## i2cdump -f -y 0 0x68 //读取 I2C 总线 0 上地址为 0x68 的设备寄存器内容
阅读DS1307 RTC芯片手册(如下),往对应地址中写时间值,即可修改RTC时钟数据。年月日时分秒...分别对应地址参考手册。根据手册可知,寄存器地址0x06存放的是Year数据,往该地址写值即可修改年份,演示效果如下图。
##? i2cset -f -y 0 0x68 0x06 0x18 ?//设置为18年
##? i2cset -f -y 0 0x68 0x06 0x24 ?//设置为24年
##? i2cget -f -y 0 0x68 0x06 ? ? ? //读地址0x06的寄存器值