前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux系统驱动之无需编写驱动直接访问设备_I2C-Tools介绍

Linux系统驱动之无需编写驱动直接访问设备_I2C-Tools介绍

作者头像
韦东山
发布于 2021-12-08 02:39:43
发布于 2021-12-08 02:39:43
1.7K00
代码可运行
举报
文章被收录于专栏:韦东山嵌入式韦东山嵌入式
运行总次数:0
代码可运行

资料下载

coding无法使用浏览器打开,必须用git工具下载:

代码语言:javascript
代码运行次数:0
运行
复制
git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git

视频观看

百问网驱动大全

无需编写驱动直接访问设备_I2C-Tools介绍

参考资料:

  • Linux驱动程序: drivers/i2c/i2c-dev.c
  • I2C-Tools-4.2: https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/
  • AP3216C:
    • git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git
    • 该GIT仓库中的文件《嵌入式Linux应用开发完全手册_韦东山全系列视频文档全集.pdf》
      • 第10.1篇,第十六章 I2C编程

1. I2C硬件连接

2. 无需编写驱动程序即可访问I2C设备

APP访问硬件肯定是需要驱动程序的, 对于I2C设备,内核提供了驱动程序drivers/i2c/i2c-dev.c,通过它可以直接使用下面的I2C控制器驱动程序来访问I2C设备。 框架如下:

i2c-tools是一套好用的工具,也是一套示例代码。

3. 体验I2C-Tools

使用一句话概括I2C传输:APP通过I2C Controller与I2C Device传输数据。 所以使用I2C-Tools时也需要指定:

  • 哪个I2C控制器(或称为I2C BUS、I2C Adapter)
  • 哪个I2C设备(设备地址)
  • 数据:读还是写、数据本身
3.1 交叉编译
3.2 用法
代码语言:javascript
代码运行次数:0
运行
复制
  // 写一个字节: I2CBUS为0、1、2等整数, 表示I2C Bus; CHIP-ADDRESS表示设备地址
  //           DATA-ADDRESS就是要写的数据
  i2cset -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS
  
  // 给address写1个字节(address, value):
  //           I2CBUS为0、1、2等整数, 表示I2C Bus; CHIP-ADDRESS表示设备地址
  //           DATA-ADDRESS: 8位芯片寄存器地址; 
  //           VALUE: 8位数值
  //           MODE: 可以省略,也可以写为b
  i2cset -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS VALUE [b]
  
  // 给address写2个字节(address, value):
  //           I2CBUS为0、1、2等整数, 表示I2C Bus; CHIP-ADDRESS表示设备地址
  //           DATA-ADDRESS: 8位芯片寄存器地址; 
  //           VALUE: 16位数值
  //           MODE: w
  i2cset -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS VALUE w
  
  // SMBus Block Write:给address写N个字节的数据
  //   发送的数据有:address, N, value1, value2, ..., valueN
  //   跟`I2C Block Write`相比, 需要发送长度N
  //           I2CBUS为0、1、2等整数, 表示I2C Bus; CHIP-ADDRESS表示设备地址
  //           DATA-ADDRESS: 8位芯片寄存器地址; 
  //           VALUE1~N: N个8位数值
  //           MODE: s
  i2cset -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS VALUE1 ... VALUEN s
  
  // I2C Block Write:给address写N个字节的数据
  //   发送的数据有:address, value1, value2, ..., valueN
  //   跟`SMBus Block Write`相比, 不需要发送长度N
  //           I2CBUS为0、1、2等整数, 表示I2C Bus; CHIP-ADDRESS表示设备地址
  //           DATA-ADDRESS: 8位芯片寄存器地址; 
  //           VALUE1~N: N个8位数值
  //           MODE: i
  i2cset -f -y I2CBUS CHIP-ADDRESS DATA-ADDRESS VALUE1 ... VALUEN i
3.3 使用I2C-Tools操作传感器AP3216C

百问网的开发板上有光感芯片AP3216C:

AP3216C是红外、光强、距离三合一的传感器,以读出光强、距离值为例,步骤如下:

  • 复位:往寄存器0写入0x4
  • 使能:往寄存器0写入0x3
  • 读光强:读寄存器0xC、0xD得到2字节的光强
  • 读距离:读寄存器0xE、0xF得到2字节的距离值

AP3216C的设备地址是0x1E,假设节在I2C BUS0上,操作命令如下:

  • 使用SMBus协议
代码语言:javascript
代码运行次数:0
运行
复制
i2cset -f -y 0 0x1e 0 0x4
i2cset -f -y 0 0x1e 0 0x3
i2cget -f -y 0 0x1e 0xc w
i2cget -f -y 0 0x1e 0xe w
  • 使用I2C协议
代码语言:javascript
代码运行次数:0
运行
复制
i2ctransfer -f -y 0 w2@0x1e 0 0x4
i2ctransfer -f -y 0 w2@0x1e 0 0x3
i2ctransfer -f -y 0 w1@0x1e 0xc r2
i2ctransfer -f -y 0 w1@0x1e 0xe r2

4. I2C-Tools的访问I2C设备的2种方式

I2C-Tools可以通过SMBus来访问I2C设备,也可以使用一般的I2C协议来访问I2C设备。 使用一句话概括I2C传输:APP通过I2C Controller与I2C Device传输数据。 在APP里,有这几个问题:

  • 怎么指定I2C控制器?
    • i2c-dev.c提供为每个I2C控制器(I2C Bus、I2C Adapter)都生成一个设备节点:/dev/i2c-0、/dev/i2c-1等待
    • open某个/dev/i2c-X节点,就是去访问该I2C控制器下的设备
  • 怎么指定I2C设备?
    • 通过ioctl指定I2C设备的地址
    • ioctl(file, I2C_SLAVE, address)
      • 如果该设备已经有了对应的设备驱动程序,则返回失败
    • ioctl(file, I2C_SLAVE_FORCE, address)
      • 如果该设备已经有了对应的设备驱动程序
      • 但是还是想通过i2c-dev驱动来访问它
      • 则使用这个ioctl来指定I2C设备地址
  • 怎么传输数据?
    • 两种方式
    • 一般的I2C方式:ioctl(file, I2C_RDWR, &rdwr)
    • SMBus方式:ioctl(file, I2C_SMBUS, &args)

5. 源码分析

5.1 使用I2C方式

示例代码:i2ctransfer.c

5.2 使用SMBus方式

示例代码:i2cget.c、i2cset.c

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
手把手教你使用 i2c-tools
在嵌入式开发中,有时候需要确认硬件是否正常连接,设备是否正常工作,设备的地址是多少等等,这里我们就需要使用一个用于测试 I2C 总线的工具:i2c-tools。
Jasonangel
2022/05/24
2.7K0
手把手教你使用 i2c-tools
Linux系统驱动之编写APP直接访问EEPROM
从原理图可知,A2A1A0都是0,所以AT24C02的设备地址是:0b1010000,即0x50。
韦东山
2021/12/08
1.4K0
Linux系统驱动之编写APP直接访问EEPROM
Linux系统驱动之编写设备驱动之i2c_driver
分配、设置、注册一个i2c_driver结构体,类似drivers/eeprom/at24.c:
韦东山
2021/12/08
8990
Linux系统驱动之编写设备驱动之i2c_driver
Linux应用开发【第十二章】I2C编程应用开发
​ I2C(Inter-Integrated Circuit BUS)是I2C BUS简称,中文为集成电路总线,是目前应用最广泛的总线之一。和IMX6ULL有些相关的是,刚好该总线是NXP前身的PHILIPS设计。
韦东山
2021/12/15
3.9K0
Linux应用开发【第十二章】I2C编程应用开发
全志平台Tina系统led控制芯片is31fl3236调试(以R18 linux4.4内核为例)
is31fl3236是一款很牛逼的led控制芯片,最多可以控制36通路的led灯,配合智能音箱的麦克风阵列使用,效果非常酷炫,目前市面上很多主流的智能音箱都有用它,比如:天猫精灵、腾讯听听等。
阿志小管家
2024/02/02
1550
Linux TWI开发指南
介绍 Sunxi 平台上 TWI 驱动接口与调试方法,为 TWI 模块开发提供参考。
韦东山
2023/02/25
2.6K0
Linux TWI开发指南
树莓派学习-I2c通信
由于之前参加了学校的飞兆杯的比赛,题目是循迹小车,由于缺乏对于ldc1314芯片使用知识以及个人的能力原因,项目并没有做出来,但是还是学习了很多东西的。
全栈程序员站长
2022/08/25
1.4K0
【玩转ESP32】5、i2c-tools访问i2c设备
这里连接0.96吋 oled,也是比较常用的一个i2c设备,连接在gpio21和gpio22上。
ManInRoad
2021/03/25
2.9K0
Linux系统驱动之SMBus协议
SMBus: System Management Bus,系统管理总线。 SMBus最初的目的是为智能电池、充电电池、其他微控制器之间的通信链路而定义的。 SMBus也被用来连接各种设备,包括电源相关设备,系统传感器,EEPROM通讯设备等等。 SMBus 为系统和电源管理这样的任务提供了一条控制总线,使用 SMBus 的系统,设备之间发送和接收消息都是通过 SMBus,而不是使用单独的控制线,这样可以节省设备的管脚数。 SMBus是基于I2C协议的,SMBus要求更严格,SMBus是I2C协议的子集。
韦东山
2021/12/08
2.5K0
Linux系统驱动之SMBus协议
Linux系统驱动之编写设备驱动之i2c_client
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git 视频观看 百问网驱动大全 编写设备驱动之i2c_client 参考资料: Linux内核文档: Documentation\i2c\instantiating-devices.rst Documentation\i2c\writing-clients.rst Linux内核驱
韦东山
2021/12/08
8940
Linux系统驱动之编写设备驱动之i2c_client
Linux系统驱动之I2C视频介绍
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git 视频观看 百问网驱动大全 I2C视频介绍 参考资料: I2CTools:https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/ 1. I2C硬件框架 在一个芯片(SoC)内部,有一个或多个I2C控制器 在一个I2
韦东山
2021/12/08
2.4K0
Linux系统驱动之I2C视频介绍
Linux系统驱动之通用驱动i2c-dev分析
要理解这些接口,记住一句话:APP通过I2C Controller与I2C Device传输数据。
韦东山
2021/12/08
2.1K0
Linux系统驱动之通用驱动i2c-dev分析
Linux系统驱动之完善虚拟的I2C_Adapter驱动并模拟EEPROM
在虚拟的I2C_Adapter驱动程序里,只要实现了其中的master_xfer函数,这个I2C Adapter就可以使用了。 在master_xfer函数里,我们模拟一个EEPROM,思路如下:
韦东山
2021/12/08
1.1K0
Linux系统驱动之完善虚拟的I2C_Adapter驱动并模拟EEPROM
I2C总线架构 之 设备驱动
I2C设备驱动是I2C框架中最接近应用层的,其上接应用层,下接I2C核心。也是驱动开发人员需要实现的代码,在此驱动中我们只需负责以下步骤(以ap3216c为例):
开源519
2020/08/17
2K0
Linux的I2C驱动框架分析
总线代表着同类设备需要共同遵守的工作时序,不同的总线对于物理电平的要求是不一样的,对于每个比特的电平维持宽度也是不一样,而总线上传递的命令也会有自己的格式约束。如I2C总线、USB总线、PCI总线等等。以I2C总线为例,在同一组I2C总线上连接着不同的I2C设备。
bigmagic
2020/03/17
5K0
Linux系统驱动之I2C_Adapter驱动框架讲解与编写
i2c_apdater核心是master_xfer函数,它的实现取决于硬件,大概代码如下:
韦东山
2021/12/08
1.8K0
Linux系统驱动之I2C_Adapter驱动框架讲解与编写
Linux I2C驱动入门,建议收藏!
I2C总线对应着/bus下的一条总线,这个i2c总线结构体管理着i2c设备与I2C驱动的匹配,删除等操作,I2C总线会调用i2c_device_match函数看I2C设备和I2C驱动是否匹配,如果匹配就调用i2c_device_probe函数,进而调用I2C驱动的probe函数。
混说Linux
2022/07/14
3.2K0
Linux I2C驱动入门,建议收藏!
[Linux驱动炼成记] 11-快速修改芯片驱动中寄存器的值
实际项目的调试中,往往需要快速修改驱动芯片(只针对IIC通讯)中对应寄存器的值,传统的方式一般是编译驱动 -> 烧录固件 -> 测试,而这样的方式往往很繁琐。这里介绍使用i2c-tools快速修改驱动芯片的寄存器方式1
程序手艺人
2019/02/20
1.7K0
Linux系统驱动之I2C系统的重要结构体
使用一句话概括I2C传输:APP通过I2C Controller与I2C Device传输数据。
韦东山
2021/12/08
2K0
Linux系统驱动之I2C系统的重要结构体
[Linux驱动炼成记] 01-用户空间操作IIC
调试IIC过程中,需要准备示波器或逻辑分析仪,需要通过示波器查看波形确定硬件连接是否正确,不然出现问题,软件再怎么调试,都是枉然.
程序手艺人
2019/02/21
2.1K0
相关推荐
手把手教你使用 i2c-tools
更多 >
目录
  • 资料下载
  • 视频观看
  • 无需编写驱动直接访问设备_I2C-Tools介绍
    • 1. I2C硬件连接
    • 2. 无需编写驱动程序即可访问I2C设备
    • 3. 体验I2C-Tools
      • 3.1 交叉编译
      • 3.2 用法
      • 3.3 使用I2C-Tools操作传感器AP3216C
    • 4. I2C-Tools的访问I2C设备的2种方式
    • 5. 源码分析
      • 5.1 使用I2C方式
      • 5.2 使用SMBus方式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档