Linux系统驱动之无需编写驱动直接访问设备_I2C-Tools介绍
2023-04-18 14:41:48 时间
资料下载
coding无法使用浏览器打开,必须用git工具下载:
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 用法
// 写一个字节: 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协议
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协议
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
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击