加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 介绍
    • 源码下载
    • 交叉编译i2c-tools
    • i2c-tools用法
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

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

10/29 09:41
654
阅读需 6 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

注意:学习资料可在ElfBoard官方网站“资料”专区获取。

介绍

在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字节数据。

相关推荐

电子产业图谱