Linux驱动学习——I2C

本文介绍了Linux环境下I2C驱动的工作原理,包括I2C总线协议的三档工作频率,模拟时序的注意事项,以及I2C总线驱动和设备驱动的角色。重点讲解了I2C设备驱动如何通过内核接口与总线驱动交互,利用dev和drv链表进行匹配,并阐述了SMBUS在驱动与硬件间的作用。
摘要由CSDN通过智能技术生成
I2C概念相关:
1.串行传输:一个时钟周期传输一个bit位,通过一根数据线完成
2.主端,主设备,master:一般就是常说的CPU
3.从端,从设备,slave:一般就是说的I2C设备
4.I2C总线:两线式串行总线,CPU跟外设之间的连接通过2根线进行,数据交互通过1根数据线完成。                  
                     在这两个线上可以挂接很多I2C设备。这两个线会接上拉电阻,默认的电平状态是高电平。
5.SDA:数据线,CPU和外设之间的数据传输,如果CPU向外设写入数据,SDA由CPU控制,如果CPU从外设读取数据,SDA由外设来控制。
6.SCL:时钟线,时钟信号由CPU发起,由CPU控制。

在I2C总线协议中

START信号:起始信号,CPU要访问从设备,必须首先由CPU发送一个START信号, SCL为高电平,SDA由高向低跳变,产生START信号
STOP信号:结束信号,如果CPU结束对从设备的访问,有CPU发送一个STOP信号, SCL为高电平,SDA由低向高电平跳变,产生一个STOP信号
ACK信号:应答信号,这个信号用于标识外设是否存在于总线上和CPU与外设之间的一个数据交互的结果。低电平有效!
设备地址:用于标识设备在总线上的唯一性。如果CPU要想访问某一个从设备,CPU必须发送这个从设备的地址。设备地址由芯片厂家和硬件原理图一块来决定。
以EEPROM,AT24C02为例:
设备地址:
1010A2A1A0R/W=>A2,A1,A0原理图接地
读设备地址:10100001 = 0xA1
写设备地址:10100000 = 0xA0
=》设备地址不算读写位,去除读写位,然后右移1位,高位补0=》AT24C02的设备地址=01010000=0x50

以I2C接口的LM77温度传感器为例:
10010A1A0:如果A1,A0都接地=》
LM77的设备地址=1001000=0x48
读设备地址:0x48<<1|1
写设备地址:0x48<<1|0

以I2C接口的背光灯芯片ADP8860为例:
ADP8860的设备地址:0101010x(x=1:read,x=0:write)
读设备地址:0x55;
写设备地址:0x54
最终的设备地址=0x2A

CPU和I2C从设备之间的数据交互过程: 必须参看从设备的芯片手册,参看其中的I2C时序操作!
1.CPU都会首先发送一个START信号
2.CPU会发送设备地址,包括读写位(到底是读设备还是写设备)
3.设备给CPU发送一个应答信号,前提是设备确实存在于总线上。如果不存在于总线上,从设备不会给CPU发。
4.根据读写进行数据的交互
5.CPU再发S
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值