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 内核里怎么传输数据
相关推荐
A小辣椒18 小时前
TShark:Wireshark CLI 功能A小辣椒1 天前
TShark:基础知识AlfredZhao1 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置大树883 天前
金刚石散热越强,管路越先见顶摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南bush43 天前
嵌入式linux学习记录十四、术语