Linux驱动学习--I2C驱动(一)

一、I2C硬件框架

 在一个芯片内部,有一个或者多个I2C控制器

在一个I2C控制器上,可以连接一个或多个I2C设备

I2C总线只需要2天线:时钟线SCL、数据线SDA

在I2C总线的SCL、SDA线上,都有上拉电阻

二、I2C软件框架

 

 以I2C接口的存储设备AT24C02为例:

  • APP:
    • 只提出要求:把字符串写入设备的寄存器地址中去
    • 他只需要调用设备驱动程序提供的接口           
  • AT24C02设备驱动:
    • 他知道AT24C02要求的地址、数据格式
    • 他知道发出什么信号才能让AT24C02执行擦除、烧写工作
    • 他知道怎么判断数据是否烧写成功
    • 他构造号一系列的数据,发送给I2C控制器
  • I2C控制驱动
    • 他根据I2C协议发出各类信号:I2C设备地址、I2C存储地址、数据

三、Linux中软件I2C和硬件I2C框架

对于Linux系统的I2C来说

APP可以通过两类驱动程序访问设备

        I2C设备自己的驱动程序

        内核自带的i2c-dev.c驱动程序,它是i2c控制器驱动程序暴露给用户空间的驱动程序(i2c-dev.c)

I2C Device Driver

        I2C设备自己的驱动程序

        内核自带的i2c-dev.c驱动程序,它是i2c控制器驱动程序爆露给用户控件的驱动程序(i2c-dev.c)

I2C Controller Driver

        芯片I2C控制器驱动程序(称为adapter)

        使用GPIO模拟的I2C控制器驱动程序(i2c-gpio.c)

四、I2C协议

1、i2c传输数据的格式

写操作,流程如下:

  • 主芯片要发出一个start信号
  • 然后发出一个设备地址(用来确定是哪个芯片写数据),方向(读/写,0表示写,1表示读)
  • 主设备回应(用来确定这个设备是否存在),然后就可以传输数据
  • 主设备发送一个字节数据给设备,并等待回应
  • 没传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据
  • 数据发送完之后,主芯片就会发送一个停止信号。

读操作,流程如下:

  • 主芯片要发出一个start信号
  • 然后发出一个设备地址,方向(读/写,0表示写,1表示读)
  • 从设备回应,然后就可以传输数据
  • 从设备发送一个字节数据给主设备,并等待回应
  • 每传输一字节数据,接收方要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据
  • 数据发送完之后,主芯片就会发送一个停止信号

五、I2C信号

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

  • 开始信号(S):SCL为高电平时,SDA先高电平向低电平跳变,开始传送数据。
  • 结束信号(P):SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
  • 响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA
  • SDA上传输的数据必须在SCL为高电平期间保持稳定,SDA上的数据只能在SCL为低电平期间变化

如何在SDA上实现双向传输?

主芯片通过一根SDA线既可以把数据发送给从设备,也可以从SDA上读取数据,连接SDA线的引脚里面必然有两个引脚。

主、从设备都可以通过SDA发送数据,肯定不能同时发送数据,怎么错开时间?

在9个时钟里,

前8个时钟由主设备发送数据的话,第9个时钟就由从设备发送数据;

前8个时钟由从设备发送数据的话,第9个时钟就由主设备发送数据。

双方设备中,某个设备发送数据时,另一方怎样才能不影响SDA上的数据?

设备的SDA中有一个三极管,使用开极/开漏电路(三极管是开极,CMOS管是开漏,作用一样)

真值表如下:

从真值表和电路图我们可以知道:

当某个芯片不想影响SDA线是,就不驱动这个三极管

想让SDA输出高电平,双方都不驱动三极管(SDA通过上拉电阻变为高电平)

想让SDA输出低电平,驱动三极管 

主设备发送(8bit)给从设备:

前8个clk

        从设备不要影响SDA,从设备不驱动三极管

        主设备决定数据,主设备要发送1时不驱动三极管,要发送0时驱动三极管

第9个clk,由从设备决定数据

        主设备驱动三极管

        从设备决定数据,要发出回应信号的话,就驱动三极管让SDA变为0

        从这里也可以知道ACK信号是低电平 

一条线上实现双向传输,因此SDA上要使用上拉电阻。

为何SCL也要上拉电阻?

在第9个时钟之后,如果有某一方需要更多的时间来处理数据,他可以一直驱动三极管把SCL拉低。当SCL为低电平时候,大家都不应该使用IIC总线,只有当SCL从低电平变为高电平的时候,IIC总线才能使用。当他就绪后,就可以不再驱动三极管,这是上拉电阻把SCL变为高电平,其他设备就可以继续使用IIC总线了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值