i2c子系统

一、I2C系统硬件框架1. 基本硬件电路2. I2C传输协议写操作读操作I2C协议中数据传输的单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。传输时,先传输最高位(MSB)。 开始信号(S):SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。 结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。 响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA
摘要由CSDN通过智能技术生成

目录

一、I2C系统硬件框架

1. 基本硬件电路

2. I2C传输协议

二、Linux下的软件框架与重要数据结构

1. Linux软件框架

2. 重要结构体

2.1 怎么表示I2C Controller呢?

2.2 怎么表示I2C Device

2.3 怎么表示要传输的数据

3. Linux I2C源码分析

3.1 I2C Device Driver层分析

3.2 I2C Controller Driver层分析

3.2.1 设备中有i2c控制器

3.2.2 设备中没有i2c控制器


一、I2C系统硬件框架

1. 基本硬件电路

2. I2C传输协议

  • 写操作

  • 读操作

I2C协议中数据传输的单位是字节,也就是8位。但是要用到9个时钟:前面8个时钟用来传输8数据,第9个时钟用来传输回应信号。传输时,先传输最高位(MSB)。

  • 开始信号(S)SCL为高电平时,SDA山高电平向低电平跳变,开始传送数据。

  • 结束信号(P)SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

  • 响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA

  • SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化

I2C协议信号如下:

 注:注意到,传输信号时,时钟线SCL是随时间周期变化的,因此,无论表示开始信号、结束信号、响应信号还是数据,都是观察数据线SDA的电平的变化。所以记忆时,记准数据线SDA怎么变化的。

二、Linux下的软件框架与重要数据结构

1. Linux软件框架

注:一定要牢牢的记住这张图各个程序所在的层次,自己觉得Linux I2C的东西比较凌乱,会涉及到很多的层次,但是如果抓住了每一个所层的位置,以及要完成的事情,一切就会比较清晰了。

  • APP通过I2C Controller与I2C Device传输数据
  • APP通过I2C Driver(client)与I2C Adapter(controller)传输i2c_msg

2. 重要结构体

2.1 怎么表示I2C Controller呢?

I2C Controller是属于上面图的第四层I2C Controller Driver。 

  • 一个芯片里可能有多个I2C Controller,比如第0个、第1个、……

  • 对于使用者,只要确定是第几个I2C Controller即可

  • 使用i2c_adapter表示一个I2C BUS,或称为I2C Controller

  • 里面有2个重要的成员:

    • nr:第几个I2C BUS(I2C Controller)

    • i2c_algorithm,里面有该I2C BUS的传输函数,用来收发I2C数据

i2c_adapter:

i2c_algorithm:

 

2.2 怎么表示I2C Device

I2C Device是属于上面图的第二层I2C Device Driver。

  • 一个I2C Device,一定有设备地址

  • 它连接在哪个I2C Controller上,即对应的i2c_adapter是什么

  • 使用i2c_client来表示一个I2C Device

2.3 怎么表示要传输的数据

在上面的i2c_algorithm结构体中可以看到要传输的数据被称为:i2c_msg

i2c_msg:

  • i2c_msg中的flags用来表示传输方向:bit 0等于I2C_M_RD表示读,bit 0等于0表示写

  • 一个i2c_msg要么是读,要么是写

  • 举例:设备地址为0x50的EEPROM,要读取它里面存储地址为0x10的一个字节,应该构造几个i2c_msg?

    • 要构造2个i2c_msg

    • 第一个i2c_msg表示写操作,把要访问的存储地址0x10发给设备

    • 第二个i2c_msg表示读操作

    • 代码如下

u8 data_addr = 0x10;
i8 data;
struct i2c_msg msgs[2];

msgs[0].addr   = 0x50;
msgs[0].flags  = 0;
ms
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值