单片机/MCU论坛
直播中

嵌入式小能手

1年用户 750经验值
擅长:嵌入式技术
私信 关注
[文章]

飞凌嵌入式ElfBoard EL 1板卡-i2c与从设备通讯编程示例之i2c-tools工具使用


介绍
i2c-tools是一个专门调试i2c接口的开源工具,可以获取挂载的设备及设备地址,具有在对应的设备上读取和设置寄存器值等功能。
在ELF 1的资料包当中,已经放置了下载好的源码,路径为:ELF 1开发板资料包�6-常用工具�6-5 测试工具 i2c-tools-4.3.tar.gz
源码下载
首先我们登陆网址:I2C Tools - Linux i2c Wiki (kernel.org)
根据提示我们在这里链接,进入i2c-tools源码仓库。
我们选择最新版i2c-tools-4.3.tar.gz,点击开始下载
交叉编译i2c-tools
(一)在虚拟机/home/elf/work下新建一个i2ctools文件夹:
(二)将i2c-tools-4.3.tar.gz拷贝到虚拟机当前目录,并解压:
(三)配置环境变量:
(四)查看环境变量是否设置成功:
(五)修改Makefile
查看CC、AR、STRIP三个变量
修改为如下形式:
(六)执行make开始编译
(七)编译完成后会在tools下生成可执行文件:
(八)将i2cdetect,i2cdump,i2cget,i2cset,i2ctransfer拷贝到开发板/usr/bin目录下
(九)将 lib下的库文件拷贝到开发板/usr/lib目录下
i2c-tools用法
(一)首先检测系统上有几组i2c总线:
可以看到,系统中存在两组i2c总线:i2c-0、i2c-1
(二)用i2cdectect检测挂载在i2c总线上的器件:
在i2c-1总线上挂载了三个设备,设备地址为0x1a、0x29、0x39。其中0x1a和0x29的位置为UU,表示既有设备也有驱动;0x39的位置只显示数字,表示检测到了设备但是没有对应驱动;
(三)用i2cdump查看器件所有寄存器的值:
注意:用i2cdump读设备下所有寄存器的值时,第一次读到0x81寄存器的值为0xdb,再次使用i2cdump读取,寄存器的值就变成了0xda,bh1726的手册当中有相关介绍,0xe4是一条特殊命令,写入0xe4后,bh1726会进行软复位,将所有寄存器值恢复到默认状态。使用i2c-tools工具读取寄存器值时,其实是先将寄存器地址写入到i2c设备,再发送读的信号。所以当读取0xe4这个地址时,会触发bh1726的软复位。
注意i2cdump是读取设备的所有寄存器,如何读单个寄存器的值呢,我们可以使用i2cget。但是如何确定要读的单个寄存器的地址呢?下面我们看一下芯片手册。
打开ELF 1开发板资料包�5-硬件资料�5-2 芯片数据手册bh1726nuc-e.pdf,选择Register MAP章节查看寄存器地址。
从上图可知,要读取寄存器,需要添加一个偏移地址:100_Register Address[4:0]
tiMING寄存器地址为0x01,那么就是100_00001,即0x81。
(四)i2cget读单个寄存器值:
在驱动中已经对寄存器进行了设置,所以在读取寄存器之前,先通过读取0xe4的方式,写入0xe4这一条特殊命令,给bh1726进行软复位,然后再进行寄存器的读取。
用i2cget读到i2c-1总线上0x29设备的0x81寄存器值为0xda。
(五)i2cset设置单个寄存器值:
用i2cset设置i2c-1上0x29设备的0x81寄存器值为0xff;
用i2cget读i2c-1上0x29设备的0x81寄存器值为0xff。
(六)用i2ctransfer写/读寄存器:
格式:
1:代表i2c总线号i2c-1;
w:代表写;
w2:代表写2Byte;
0x29:代表设备地址为0x29;
0x81:代表偏移0x81;
0xff:代表要写入的数据;
i2ctransfer是严格按照i2c协议读写时序操作的,我们想读取0x29的0x81的寄存器值,需要先把0x81发送给从设备,所以用到了w1写1个字节,之后才是r1读1字节数据。

更多回帖

发帖
×
20
完善资料,
赚取积分