首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
  // 写一个字节: 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
运行
AI代码解释
复制
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
运行
AI代码解释
复制
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.8K0
手把手教你使用 i2c-tools
Linux应用开发【第十二章】I2C编程应用开发
​ I2C(Inter-Integrated Circuit BUS)是I2C BUS简称,中文为集成电路总线,是目前应用最广泛的总线之一。和IMX6ULL有些相关的是,刚好该总线是NXP前身的PHILIPS设计。
韦东山
2021/12/15
4K0
Linux应用开发【第十二章】I2C编程应用开发
Linux系统驱动之编写设备驱动之i2c_driver
分配、设置、注册一个i2c_driver结构体,类似drivers/eeprom/at24.c:
韦东山
2021/12/08
9250
Linux系统驱动之编写设备驱动之i2c_driver
树莓派I2C通过Shell操作FDC2214[通俗易懂]
陈拓 chentuo@ms.xab.ac.cn 2020/07/21-2020/07/29
全栈程序员站长
2022/09/01
7300
[Linux驱动炼成记] 11-快速修改芯片驱动中寄存器的值
实际项目的调试中,往往需要快速修改驱动芯片(只针对IIC通讯)中对应寄存器的值,传统的方式一般是编译驱动 -> 烧录固件 -> 测试,而这样的方式往往很繁琐。这里介绍使用i2c-tools快速修改驱动芯片的寄存器方式1
程序手艺人
2019/02/20
1.8K0
Linux系统驱动之编写APP直接访问EEPROM
从原理图可知,A2A1A0都是0,所以AT24C02的设备地址是:0b1010000,即0x50。
韦东山
2021/12/08
1.4K0
Linux系统驱动之编写APP直接访问EEPROM
【玩转ESP32】5、i2c-tools访问i2c设备
这里连接0.96吋 oled,也是比较常用的一个i2c设备,连接在gpio21和gpio22上。
ManInRoad
2021/03/25
3.1K0
Linux TWI开发指南
介绍 Sunxi 平台上 TWI 驱动接口与调试方法,为 TWI 模块开发提供参考。
韦东山
2023/02/25
2.7K0
Linux TWI开发指南
Linux系统驱动之通用驱动i2c-dev分析
要理解这些接口,记住一句话:APP通过I2C Controller与I2C Device传输数据。
韦东山
2021/12/08
2.2K0
Linux系统驱动之通用驱动i2c-dev分析
Linux系统驱动之SMBus协议
SMBus: System Management Bus,系统管理总线。 SMBus最初的目的是为智能电池、充电电池、其他微控制器之间的通信链路而定义的。 SMBus也被用来连接各种设备,包括电源相关设备,系统传感器,EEPROM通讯设备等等。 SMBus 为系统和电源管理这样的任务提供了一条控制总线,使用 SMBus 的系统,设备之间发送和接收消息都是通过 SMBus,而不是使用单独的控制线,这样可以节省设备的管脚数。 SMBus是基于I2C协议的,SMBus要求更严格,SMBus是I2C协议的子集。
韦东山
2021/12/08
2.5K0
Linux系统驱动之SMBus协议
树莓派学习-I2c通信
由于之前参加了学校的飞兆杯的比赛,题目是循迹小车,由于缺乏对于ldc1314芯片使用知识以及个人的能力原因,项目并没有做出来,但是还是学习了很多东西的。
全栈程序员站长
2022/08/25
1.4K0
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
9300
Linux系统驱动之编写设备驱动之i2c_client
Linux的I2C驱动框架分析
总线代表着同类设备需要共同遵守的工作时序,不同的总线对于物理电平的要求是不一样的,对于每个比特的电平维持宽度也是不一样,而总线上传递的命令也会有自己的格式约束。如I2C总线、USB总线、PCI总线等等。以I2C总线为例,在同一组I2C总线上连接着不同的I2C设备。
bigmagic
2020/03/17
5.3K0
树莓派I2C接口技术及Python SMBus串行I2C EEPROM应用编程
文章目录 一、I2C接口技术 1.I2C总线系统组成 2.I2C总线的状态及信号 3.I2C总线基本操作 4.启动和停止条件 5.I2C总线数据传输格式 二、I2C总线上拉电阻的估算与选取 三、树莓派与AT24C02接口实验电路及Python SMBus串行I2C EEPROM应用编程 1.启动RPi串行I2C接口及安装Python SMBus库 2. 树莓派与AT24C02 EEPROM接口实验电路 3. Python SMBus库函数介绍 4. 使用I2C Tools及Python SMBus读写AT24C02 EEPROM 一、I2C接口技术 I2C接口是嵌入式系统中常用的网络接口之一,它采用串行通信方式将MCU/传感器连接到系统总线,通过主机/从机的方式协调工作。 I2C/IIC(Inter-Integrated Circuit)总线是由PHILIPS公司于1982年针对MCU/传感器等应用需求而研制的一种两线式串行总线,用于连接MCU及传感器等设备。 I2C总线的主要特点如下: (1)I2C总线最主要的优点是其简单性和有效性。 (2)由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。 (3)I2C总线的长度可高达25英尺(约7.6m),并且能够以标准模式100Kbps的传输速率支持40个组件。新一代I2C总线还支持高速模式400Kbps传输。 (4)I2C总线的另一个优点是支持多主控(multi-mastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号传输和时钟频率。当然,在任何时间点上只能有一个主控。 1. I2C总线系统组成 I2C总线协议包含两层协议:物理层和数据链路层。 在物理层,I2C总线仅使用了两条信号线:一个是串行数据线SDA (Serial DAta line),它用于数据的发送和接收;另一个是串行时钟线SCL (Serial Clock Line)构成的串行总线,它用于指示何时数据线上是有效数据,即数据同步。MCU与被控IC之间、IC与IC之间进行双向传送,I2C标准模式最大传送速率为100kbps,I2C快速模式最大传输速率为400kbps。 在数据链路层,每个连接到I2C总线上的设备都有唯一的地址,设备的地址由系统设计者决定。在信息的传输过程中,I2C总线上并接的每一设备既是主设备(或从设备)又是发送器(或接收器),这取决于它所要完成的功能。 由I2C总线所构成的系统可以有多个I2C节点设备,并且可以是多主系统,任何一个设备都可以为主I2C;但是任一时刻只能有一个主I2C设备,I2C具有总线仲裁功能,以保证系统正确运行。主I2C设备发出时钟信号、地址信号和控制信号,选择通信的从I2C设备并控制收发。I2C总线要求:(1)各个节点设备必须具有I2C接口功能;(2)各个节点设备必须共地;(3)两根信号线必须接上拉电阻Rp。如图1所示。  图1 多I2C设备接口示意图 2. I2C总线的状态及信号 (1)空闲状态 SCL和SDA均处于高电平状态,即为总线空闲状态(空闲状态为何是高电平的道理很简单,因为它们都接上拉电阻)。 (2)占有总线和释放总线 若想让器件使用总线应当先占有它,占有总线的主控器向SCL线发出时钟信号。数据传送完成后应当及时释放总线,即解除对总线的控制(或占有),使其恢复成空闲状态。 (3)启动信号[S] 启动信号由主控器产生。在SCL信号为高时,SDA产生一个由高变低的电平变化,产生启动信号。 (4)结束/停止信号[P] 当SCL线高电平时,主控器在SDA线上产生一个由低电平向高电平跳变,产生停止信号。启动信号和停止信号的产生见图2所示。  图2 启动信号和停止信号的产生 (5)应答/响应信号[A/NA] 应答信号是对字节数据传输的确认。应答信号占1位,数据接收者接收1字节数据后,应向数据发出者发送一个应答信号。对应于SCL第9个应答时钟脉冲,若SDA线仍保持高电平,则为非应答信号(NA/ACK)。低电平为应答,继续发送;高电平为非应答,结束发送。 (6)控制位信号[R/nW] 控制位信号占1位,IIC主机发出的读写控制信号,高为读、低为写(对IIC主机而言)。控制位(或方向位)在寻址字节中给出。 (7)地址信号 地址信号为从机地址,占7位,称之为“寻址字节”(见表1)。 表1 寻址字节  下面对表1中的各字段进行说明。 器件地址(DA3-DA0):DA3-DA0是I2C总线接口器件固有的地址编码,由器件生产厂家给定,如AT24C××I2C总线EEPROM器件的地址为1010等。 引脚地址(A2、A1、A0):引脚地址由I2C总线接口器件的地址引脚A2、A1、A0的高低来确定,接高电平者为1,接地者为0。 读写控制位/方向位(R/n W):R/nW为1表示主机读,R/nW为0表示主机
用户7886150
2020/12/30
1.3K0
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.6K0
Linux系统驱动之I2C视频介绍
Linux系统驱动之I2C_Adapter驱动框架讲解与编写
i2c_apdater核心是master_xfer函数,它的实现取决于硬件,大概代码如下:
韦东山
2021/12/08
1.9K0
Linux系统驱动之I2C_Adapter驱动框架讲解与编写
全志平台Tina系统led控制芯片is31fl3236调试(以R18 linux4.4内核为例)
is31fl3236是一款很牛逼的led控制芯片,最多可以控制36通路的led灯,配合智能音箱的麦克风阵列使用,效果非常酷炫,目前市面上很多主流的智能音箱都有用它,比如:天猫精灵、腾讯听听等。
阿志小管家
2024/02/02
1970
[Linux驱动炼成记] 01-用户空间操作IIC
调试IIC过程中,需要准备示波器或逻辑分析仪,需要通过示波器查看波形确定硬件连接是否正确,不然出现问题,软件再怎么调试,都是枉然.
程序手艺人
2019/02/21
2.1K0
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
2.1K0
相关推荐
手把手教你使用 i2c-tools
更多 >
LV.1
深圳百问网科技有限公司技术总监
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验