1.前言

【linux内核说明】

通常情况下,I2C设备由内核驱动控制,但是某些情况下I2C设备也可由用户空间控制。如果在用户空间控制I2C设备,需要访问/dev目录中所提供的接口,在使用I2C设备之前必须要载入i2c-dev设备。

每一个已经注册的IC设备都有一个编号,该编号从0开始计算。可以查看/sys/class/i2c-dev目录以获得I2C适配器的信息,或者使用i2cdetect工具查看I2C适配器。i2cdetect是一个简单易用的I2C工具包。
【树莓派学习笔记——I2C Tools 学习笔记】

2.C语言的例子

让我们从一个简单的C语言的例子开始Linux I2C设备的使用。在开始之前需要包括 linux/i2c-dev.h。然后需要决定访问的I2C适配器,可以查看/sys/class/i2c-dev,或者使用i2cdetect - l命令。
接着便可打开文件,请看示例代码
  int file;int adapter_nr = 1; /* I2C适配器编号 */char filename[20];snprintf(filename, 19, "/dev/i2c-%d", adapter_nr);file = open(filename, O_RDWR);if (file < 0) {/* 打开失败 */exit(1);}
打开设备时,必须确定I2C从机地址。
  int addr = 0x40; /* I2C 从机地址 */if (ioctl(file, I2C_SLAVE, addr) < 0) {/* 打开失败 */exit(1);}
完成了基本设置,下面便可以使用SMBUS指令或纯I2C函数与芯片通信。SMBUS函数形式是一个很不错的选择。
 __u8 register = 0x10; /* I2C从机 寄存器地址 */__s32 res;char buf[10];/* 使用SMBus函数 */res = i2c_smbus_read_word_data(file, register);if (res < 0) {/* 错误 */} else {/* 成功读取到一个字 */}/* 使用I2C Write, 等价于i2c_smbus_write_word_data(file, register, 0x6543) */buf[0] = register;buf[1] = 0x43;buf[2] = 0x65;if (write(file, buf, 3) ! =3) {/* 错误*/}/* 使用I2C Read, 等价于 i2c_smbus_read_byte(file) */if (read(file, buf, 1) != 1) {/* 错误 */} else {/* buf[0]为读取到的字节 */}

3.SMBUS详细说明

【内核说明】
标记符
长度
说明
S
1 bit
I2C启动
P
1 bit
I2C停止
Rd/Wr
1 bit
控制字中的读写标志位,读操作为1,写操作为0
A, NA
1 bit
应答标志
Addr
7 bits
7位I2C地址
Data
8 bit
字节数据
Comm
8 bits
命令字节,可理解为I2C设备寄存器地址
[..]
N char
 I2C设备返回的数据
【1】__s32 i2c_smbus_write_quick(int file, __u8 value);
发送一个写控制字,可用于测试I2C设备是否存在。
S Addr Rd [A] [Data] NA P
【2】__s32 i2c_smbus_read_byte(int file);
发送一个读控制字,并从I2C设备中读取一个字节。
S Addr Rd [A] [Data] NA P
【3】__s32 i2c_smbus_write_byte(int file, __u8 value);
发送一个写控制字,并向I2C设备中写入一个字节。
S Addr Wr [A] Data [A] P
【4】__s32 i2c_smbus_read_byte_data(int file, __u8 command);
向I2C设备发送一个写控制字+控制指令(寄存器地址),再发送一个读控制字,此时I2C从设备内部的读写指针转移到指定的位置,并返回一个字节,最后返回一个无应答NA。
S Addr Wr [A] Comm [A] S Addr Rd [A] [Data] NA P
【5】__s32 i2c_smbus_write_byte_data(int file, __u8 command, __u8 value);
向I2C设备发送一个写控制字+控制指令(寄存器地址),紧接着发送指令内容(寄存器内容,单字节)。
S Addr Wr [A] Comm [A] Data [A] P
【6】__s32 i2c_smbus_read_i2c_block_data(int file, __u8 command, __u8 *values);
向I2C设备发送一个写控制字+控制指令(寄存器地址),再发送一个读控制字,此时I2C从设备内部的读写指针转移到指定的位置,并连续返回多个字节,I2C主机读取到一定数量字节内容之后发送无应答NA。
S Addr Wr [A] Comm [A] S Addr Rd [A] [Data] A [Data] A ... A [Data] NA P
【7】__s32 i2c_smbus_write_i2c_block_data(int file, __u8 command, __u8 length, __u8 *values);
向I2C设备发送一个写控制字+控制指令(寄存器地址),接着发送发送指令内容(寄存器内容,多字节)
S Addr Wr [A] Comm [A] Data [A] Data [A] ... [A] Data [A] P
【注意点1】
这些函数如果返回-1代表操作失败。在一些具有写功能的函数中,返回0代表操作成功,在具有读功能的函数中,返回读取的字节数(除i2c_smbus_read_block_data)。读块(block)操作时不应超过32个字节。
【注意点2】
树莓派不支持以下函数。
__s32 i2c_smbus_read_block_data(int file, __u8 command, __u8 *values);
__s32 i2c_smbus_write_block_data(int file, __u8 command, __u8 length, __u8 *values);

4.参考资料

【i2c_smbus_write_block_data 和 i2c_smbus_write_i2c_block_data区别】
【I2C操作笔记——以 AT24C04为例】

树莓派学习笔记——Linux I2C驱动说明相关推荐

  1. 树莓派学习笔记——wiringPi I2C设备使用详解

    1.前言 最近认真学习了树莓派,从浅到深认真分析了wiringPi实现代码,借助树莓派学习linux收获颇丰.深入学习linux一段时间后发现它非常有魅力,一个简单的IO口输出操作尽有那么多的&quo ...

  2. 树莓派学习笔记——I2C设备载入和速率设置

    1.载入设备 方法1--临时载入设备 sudo modprobe -r i2c_bcm2708 #卸载设备 -r代表removesudo modprobe i2c_bcm2708 #重新载入设备 方法 ...

  3. linux I2C 驱动

    原文地址: http://hello2mao.github.io/2015/12/02/Linux_I2C_driver.html 目录 一.LinuxI2C驱动--概述 1.1 写在前面 1.2 I ...

  4. 树莓派学习笔记 ——I2C PCF8574 SysFs方式

    1.前言 树莓派的GPIO端口数量有限,可通过IO扩展芯片增加GPIO的数量,使得树莓派可以适应更多的应用.PCF8574为一款通过I2C总线扩展IO的芯片,单个PCF8574可扩展8个IO,一个I2 ...

  5. 【树莓派学习笔记】树莓派4B上运行uboot并从网络启动linux内核(上)

    [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 文章目录 [树莓派学习笔记]树莓派4B上运行uboot并从网络启动linux内核(上) 前言 1. 硬件需求与软件版本汇总 ...

  6. 《linux设备驱动开发详解》笔记——15 linux i2c驱动

    <linux设备驱动开发详解>笔记--15 linux i2c驱动 15.1 总体结构 如下图,i2c驱动分为如下几个重要模块 核心层core,完成i2c总线.设备.驱动模型,对用户提供s ...

  7. 树莓派可以移动linux,树莓派学习笔记 篇三:树莓派4B 与移动存储设备的那些事儿...

    树莓派学习笔记 篇三:树莓派4B 与移动存储设备的那些事儿 2019-11-24 23:03:55 39点赞 286收藏 14评论 本文是「树莓派学习笔记」系列的第三篇,将学习下 Linux 系统分区 ...

  8. 树莓派学习笔记——GPIO功能学习

    0.前言 树莓派现在越来越火,网上树莓派的资料也越来越多.树莓派源自英国,国外嵌入式开源领域具有良好的分享精神,树莓派各种集成库也层出不穷,下面推荐几个. [ python GPIO ] [开发语言] ...

  9. 树莓派学习笔记——Wifi AP热点模式 使用RT5370

    0.前言 本文详细说明为树莓派增加Wifi AP热点功能的具体步骤.配置完成之后,树莓派将增加一个Wifi热点功能,使用笔记本或手机便可连接树莓派,树莓派具有了AP热点功能,可更一步扩展树莓派相关的W ...

最新文章

  1. Jeff Doyle
  2. java keytool生成证书_使用JDK自带的工具keytool生成证书
  3. linux oracle手动启动两个实例
  4. cocos编译java时改变使用的javac的版本
  5. 验证手机号码归属地_excel函数爬取网页手机号码归属地,1.1%的人还不会!
  6. Auto CAD 2020 2019 2018 2017 2016 2015 2014 2013 2012 2011 2010 全版本 附带安装教程+入门到精通视频教程
  7. java获取文本文件的编码格式
  8. 数学建模之传染病SIR模型(新冠真实数据)
  9. 对多频外差的改进-校正伽马误差
  10. 类型多样的终结者游戏成套模型素材,速来收藏
  11. Threejs围墙动画
  12. Unity3D灯光详解
  13. STM32L051 低功耗模式和踩坑随笔(自用)
  14. Matlab实现二维Goldstein分支切割相位展开算法
  15. 平均数,中位数,众数这三个概念的区别和联系分别是什么?
  16. 通过图新地球将GPS信息写入照片
  17. Qt开源版 vs 商业版
  18. TI CC1101学习笔记:工作原理简单入门
  19. 盗号者:我就想欺负你们这些不懂盗号原理的小白
  20. html5七夕情人节送花动画告白特效

热门文章

  1. apm32f103c8t6 通过定时器1的PWM功能输出频率3mhz占空比50%的方波
  2. 《C和指针》笔记(十四)-- 经典抽象数据类型
  3. 车联网算法之概述(一)
  4. spark 官网首页
  5. (思科模拟器)单臂路由配置以及带你去了解它
  6. 根据图片url下载图片
  7. Python学习之批量word文档转pdf并统计其页码
  8. jQuery事件机制
  9. python笑脸识别_OpenCV检测篇(二)——笑脸检测
  10. 判断点在线的左边、右边