• Linux驱动开发 --- IIC总线


    (A) IIC总线 协议层面以及寄存器

    两线式串行总线(SCL|SDA)。IIC设备通过这两条总线连接到处理器的IIC总线控制器上。

    A.1 信号类型

    开始信号:SCL高电平时SDA由高电平向低电平跳变
    结束信号:SCL高电平时SDA由低电平向高电平跳变
    响应信号:从机主接收到到 8 位数据后,在第 9 个时钟周期,拉低 SDA电平,表示已经收到数据。这个信号称为应答信号。

    A.2 主机与从机

    发送命令的设备为主机,一般是IIC控制器。
    接收命令并响应的设备是从机

    A.3 数据传输流程

    主机通过数据线 SDA 向从机发送数据。当总线空闲时,SDA 和 SCL 信号都处于高电
    平。主机向从机发送数据的过程如下。
    (1)当主机检测到总线空闲时,主机发出开始信号 S。
    (2)主机发出 8 位数据。这 8 位数据的前 7 位表示从机地址,第 8 位表示数据的传输方向。这时,第 8 位为 0,表示向从机发送数据。
    (3)被选中的从机发出响应信号 ACK。
    (4)从机传输一系列的字节和响应位。
    (5)主机接受这些数据,并发出结束信号 P,完成本次数据传输

    A.4 IIC设备的硬件原理

    IICCON 寄存器用于控制是否发出 ACK 信号、是否开启 IIC 中断等
    IICSTAT 寄存器 包括了对工作模式的控制,忙状态位/S信号和P信号,读取总裁状态,禁止/使能发送和接收功能等。
    IICADD 寄存器用来表示挂接到总线上的从机地址,该寄存器用到位[7:1]表示从机地
    址。IICADD 寄存器在串行输出使能位 IICSTAT[4]为 0 时,才可以写入;在任何时间都可
    以读出。
    IICDS 寄存器 IIC 控制器将要发送或者接收到的数据保存在 IICDS 寄存器的位[7:0]中。IICDS 寄存
    器在串行输出使能位 IICSTAT[4]为 1 时,才可以写入;在任何时间都可以读出。

    (B) IIC总线 设备驱动程序的结构以及编程方法

    IIC设备驱动可以分为总线层设备层
    总线层:i2c_algorithm 和 i2c_adapter,包括对CPU中的IIC总线控制器和控制总线通信的方法
    设备层:i2c_driver 和 2c_client ,关系到实际的IIC设备

    B.1 IIC设备(i2c_client)

    IIC设备就是挂载在由SCL和SDA组成的总线上的所有设备。程序中由一个i2c_client结构体来描述:
    在这里插入图片描述

    B.1.1 设备地址概念

    i2c_client中有个addr成员,用它来表示IIC设备的地址,他是个unsigned short类型的变量,只用到了8位
    其实际组成为:
    在这里插入图片描述
    R/W:=0写入,=1读取
    器件类型由半导体公司生产时固化
    自定义地址:这是由用户自己设置的,通常的作法如 EEPROM 这些器件是由外部 I 芯片的 3 个引脚所组合电平决定的。自定义的地址码只能表示8个地址,所以同一IIC总线上同一型号的芯片最多只能挂载8个。
    AT24C08 的自定义地址码如图所示,A0、A1 和 A2接低电平,所以自定义地址码为 0。
    在这里插入图片描述

    B.2 IIC驱动 i2c_driver

    每一个IIC设备都应该对应一个驱动
    在这里插入图片描述

    B.3 IIC设备和IIC驱动的关系

    IIC Client结构体由list成员链接起来,链在同一个链表上,表示挂接到同一条总线上的所有IIC设备,最后统一链接到Drvier 结构体上的clients成员上,该成员也是list_head类型。(绿色线条部分)
    IIC Client结构体使用driver成员指向对应的IIC Driver上,图中Client A和B指向Driver A,表示这俩设备可以使用驱动A,Client C指向了Driver B。(红色线条部分)
    IIC设备和驱动的关系图

    B.4 IIC 总线适配器(i2c_adapter)

    总线适配器其实也就是总线的控制器,实际的总线上连接了若干个IIC设备。
    IIC总线适配器本质上是一个物理设备,主要就是控制IIC总线控制器的数据通信。
    在这里插入图片描述
    i2c_algorithme类型的algo下面即将介绍

    B.5 IIC 总线驱动程序(i2c_algorithm)

    每一个适配器对应一个驱动程序,i2c_algorithm algo* 是总线访问算法,i2c_adapter结构体内部有一个,会指向一个访问算法结构体。对于一个 I2C 适配器,肯定要对外提供读写 API 函数,设备驱动程序可以使用这些 API 函数来完成读写操作。 i2c_algorithm 就是 I2C 适配器与 IIC 设备进行通信的方法。
    在这里插入图片描述
    master_xfer 就是 I2C 适配器的传输函数,可以通过此函数来完成与 IIC 设备之间的通信。
    smbus_xfer 就是 SMBUS 总线的传输函数。I2C 总线驱动,或者说 I2C 适配器驱动的主要工作就是初始化 i2c_adapter 结构
    体变量,然后设置 i2c_algorithm 中的 master_xfer 函数。完成以后通过 i2c_add_numbered_adapter或 i2c_add_adapter 这两个函数向系统注册设置好的 i2c_adapter,这两个函数的原型如下
    functionality () 函数,主要用来确定适配器支持哪些传输类型

    (AB) 总线层和设备层的关系

    在这里插入图片描述

    整个架构:

    在这里插入图片描述

  • 相关阅读:
    MySQL库的库操作指南
    视频增强和修复工具 Topaz Video AI mac中文版功能
    Nvidia GPU 入门教程之 09 如何使用 Kaggle API 搜索和下载数据?
    mysql
    读《mysql是怎样运行的》有感
    NAT地址转换,路由器作为出口设备,实现负载分担
    是谁的请求导致我的系统一直抛异常?
    OpenSSL在i.MX8MP开发板上的应用
    UE4创建一个左右摇摆的“喷泉”
    宝塔上创建站点
  • 原文地址:https://blog.csdn.net/weixin_43604927/article/details/126616777