I2C

先来看一下原理图

 

这是个存储芯片。只用两跟引脚与CPU的I2C控制器相连,一个就是I2C_SCL一个就是I2C_SDA。CPU上的I2C_SCL和I2C_SDA上可以接很多芯片。每个芯片都会有个设备ID,

或者称为设备地址,去看芯片的原理图,里面都有设备的地址,比如说我们这里的FM24CL04。

I2C硬件协议

首先CPU会发出一个start信号,保持SCL为高电平,SDA由高变为低,就是start信号,发出后,发出设备地址,I2C设备都是每八位进行传输,设备地址当成数据就好了,怎么发出这个数据呢?


在这里,发出start信号之后,我让这个时钟SCL由低电平变为高电平,在这个时钟的变为高电平的瞬间读到数据,当我低电平的时候你可以更改数据。设备地址里面有8位,但是只有7位来表示设备地址,还有以为表示读写,读写就是说紧接这后面这些数据,写的话表示是从CPU发给I2C设备,读的话表示CPU收到I2C设备发送过来的信息,发出地址之后,还有一个应答位(ACK),我发出START信号值,发出这些地址的值,这些信号就在总线上出现了,设备要不断的检测这些信号,如果这个地址吻合你的这些信号,这些设备其实有一点智能的,他先检测到start的信号,然后它就知道你紧接着会发设备地址了,然后我把这个设备地址检测一下,如果你的设备地址等于预先配置的值,那他就会回应一个ACK信号,ACK信号怎么回应呢,他就是把这个时钟拉低,拉低的过程是我CPU把数据放到SDA上了,等到8位发完的时候,我CPU就不驱动它了,如果对方表示能够相应这个地址的话,就会在第9个周期里面把SDA拉为低电平,然后他它会接着把它拉为高电平,就表示有回应信号。如果没有这个回应信号就表示没有这个设备,就不能接着访问, 如果有设备,那后面就是数据了,8位数据 加个ACK信号,如果我是写的话,这8位数据是发给设备,ACK由设备来提供,如果是读的话,是从设备里面读到,ACK设备由CPU提供,

传输数据如图


最后会发一个结束信号,结束信号就是让SCL信号保持高电平的同时,由SDA信号由高变低。

CPU实现了I2C的接口,但是这些数据有什么含义,我发出的数据和读的数据有什么含义,这个CPU是不知道的,只有外设才知道,我们来看看外设的数据手册


我怎么去写一个字节呢,你收到一个start信号,然后CPU写一个地址,然后你回应,然后CPU又会发一个地址,这个地址表示存储芯片内存的地址。然后回应一个ACK信号,然后会发一个数据,你再回一个ACK信号。这些数据本身的含义只有设备知道,我们CPU只管发出这些东西。

然后我们看读,先看随机读


随机读是随便读什么地址,CPU发一个start的地址,发个设备地址给你,我们想一下我们读一个地址,读100这个地址,我是不是要把100这个地址值发给芯片,所以一开始是先写,先写一个数据,把这个数据写给I2C芯片,这个数据的含义是内存地址,然后你收到地址后给我一个ACK信号,然后我再来发一个START信号,然后在发一个设备地址,表示读,然后读到一个数据,读到的这个数据就是存储芯片里面这个地址的数据。我读到一个数据之后,按理说我CPU应该给你一个回应信号,因为我值读到了一个数据,所以回不回都没关系。

I2C驱动

应用程序open  read write ,驱动就要提供相应的接口,比如说at24c08_open,at24c08_write函数,这些我们把它称为设备驱动,大家想像一下,在我们原理图里面只接有这个24C08,是不是也有可能接有其他芯片呢?我也有可能接有其他芯片,除了这个24C08之外,还有其他的设备驱动程序,很多个。这些设备驱动程序自己明白,这上面传输的数据有什么含义,他们明白这些含义,他要访问的时候都需要发出start信号,都需要发出设备地址,都要有ACK信号等等这些东西。他们有一些共性的东西,在下面会用到,我这里会有一些函数来发出start信号,发出设备地址,那些函数有哪些函数提供的,下面还有一层,我们可以分为几层,总线驱动程序,总线驱动程序负责一个是提供统一的I2C操作函数,然后还有CPU的硬件操作。所以这里分了3层,一个是设备层,一个是核心层,一个是适配器。他怎么把这三层结合在一块呢,这里又设计到另外一个东西,总线设备驱动模型。

我们I2C里面也有I2C_BUS_TYPE,这里面也有一个match函数,也有设备链表,也有驱动链表。这驱动链表称为I2C_DRIVER,设备链表称为i2c_client

我们来看看他是怎么匹配的


这里driver有个id_table,表示能够支持哪些设备


这个id_table里面有个name和我们client的name做比较,名字如果相同的话,就表示这个驱动程序可以支持你的设备

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值