10.4 I2C 系统的重要结构体 参考资料: ⚫ Linux 驱动程序:(某版本的 Linux,比如 Linux-4.9.88)/drivers/i2c ⚫ I2CTools: https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/ 284 / 577 10.4.1 重要结构体 使用一句话概括 I2C 传输:APP 通过 I2C Controller 与 I2C Device 传 输数据。 在 Linux 中要思索下面几个问题。 ⚫ 怎么表示 I2C Controller ⚫ 一个芯片里可能有多个 I2C Controller,比如第 0 个、第 1 个、...... ⚫ 对于使用者,只要确定是第几个 I2C Controller 即可 ⚫ 使用 i2c_adapter 表示一个 I2C BUS,或称为 I2C Controller,里面有 2 个重要的成员: a) nr:第几个 I2C BUS(I2C Controller) b) i2c_algorithm,里面有该 I2C BUS 的传输函数,用来收发 I2C 数据 i2c_adapter 原型: 图 10.27 i2c_adapter 原型 i2c_algorithm 原型: 图 10.28 i2c_algorithm 原型 285 / 577 怎么表示 I2C Device ⚫ 一个 I2C Device,一定有设备地址 ⚫ 它连接在哪个 I2C Controller 上,即对应的 i2c_adapter 是什么 使用 i2c_client 来表示一个 I2C Device 图 10.29 i2c_client 怎么表示要传输的数据 在上面的i2c_algorithm结构体中可以看到要传输的数据被称为:i2c_msg i2c_msg 原型: 图 10.30 i2c_msg ◼ i2c_msg 中的 flags 用来表示传输方向:bit 0 等于 I2C_M_RD 表示 读,bit 0 等于 0 表示写 ◼ 一个 i2c_msg 要么是读,要么是写 286 / 577 举例:设备地址为 0x50 的 EEPROM,要读取它里面存储地址为 0x10 的一个字节, 应该构造几个 i2c_msg?要构造 2 个 i2c_msg c) 第一个 i2c_msg 表示写操作,把要访问的存储地址 0x10 发给设备 d) 第二个 i2c_msg 表示读操作 代码如下 u8 data_addr = 0x10; i8 data; struct i2c_msg msgs2; msgs0.addr = 0x50; msgs0.flags = 0; msgs0.len = 1; msgs0.buf = &data_addr; msgs1.addr = 0x50; msgs1.flags = I2C_M_RD; msgs1.len = 1; msgs1.buf = &data; 10.4.2 内核里怎么传输数据
相关推荐
前端世界4 小时前
Linux服务器实战:日志越来越大怎么办?用Logrotate+DNS解决日志管理与内网访问问题风哥2号4 小时前
数据库教程FGMT18‑Oracle‑EMCC智能化集中运维管理系统小此方4 小时前
Linux网络(十):HTTP请求是如何被服务器解析的?从请求报文、路径处理到响应状态码与异常处理少司府4 小时前
Linux系统篇(一)指令篇·一:初识Linux及其基本指令天远API4 小时前
零信任架构实战:基于天远企业四要素验证构建自动化供应商准入网关Zixhy6 小时前
手撕Reactor模型实现同步高并发服务器及Muduo网络库深入解析迷途之人不知返6 小时前
【进程】-4-进程状态(2):Linux中的进程状态tedcloud12313 小时前
Wand-Enhancer 怎么搭建?开源 Wand 客户端增强与远程控制工具介绍Emily1568535987014 小时前
ABB CI867K01 3BSE043660R1考虑考虑14 小时前
docker compose环境变量替换