现在的位置: 首页 > 综合 > 正文

和菜鸟一起学linux总线驱动之初识i2c总线协议

2013年08月16日 ⁄ 综合 ⁄ 共 1440字 ⁄ 字号 评论关闭

       就这么稀里糊涂地过了两天,都在公司里。为了不是我的任务的工作,是对,还是错。自己定的计划都没有实现,要看的书也没看,要玩的板子也没玩。不过终于体验到了,加班,其实对于IT业来说,太平常不过了。目前的部门还好,基本不用加班,布置的小任务,还是可以提前完成的,也有点时间用来记录所学的过程,慢慢成长。昨天,和我们子公司的工程师赶项目到9点半才回去,今天他说,他是凌晨3点回去的。不容易啊,工作4年后,我也要这样吗?他们公司就他一个人做软件,andriod上层应用到底层驱动都是他做的。

      听他说,他们的技术副总监,工作10年了,他一个人可以从画PCB到写驱动,然后应用,再UI界面,整个项目一个人可以操办。10年磨一剑,也许很多人,10年就只会打打代码,重复的代码。而且他居然还是和我同校的,从什么都不知道的测试做起,然后再搞技术,接着成为10年后的他。觉得,我应该比他幸运吧,刚毕业就直接开始技术了,现在也渐渐入门了,也得到了同事和领导的认可。所以,我坚信,我不用10年就可以达到比他还要好的成就。人都是被逼出来了,只有坚定的信念才会促使我们成长,才不会在成功路上步履蹒跚。你想或者不想,目标永远都在哪儿等着你。需要的只是时间,还有你那颗向往着的心。累,永远是借口。

      Linux的很多设备都是i2c总线控制的,所以,学习下i2c总线的驱动还是不错的。首先要看看i2c的协议了。

I2C总线由两根线组成,即串行数据(SDA)和串行时钟(SCL)。每个器件都有一个唯一的地址识别,而且都可以作为一个发送器或接收器。下面贴些主要的术语。

发送器: 
发送数据到总线的器件

接收器: 
从总线接收数据的器件

主机: 
初始化发送产生时钟信号和终止发送的器件

从机: 
被主机寻址的器件

多主机: 
同时有多于一个主机尝试控制总线但不破坏报文

仲裁:是一个在有多个主机同时尝试控制总线但只允许其中一个控制总线并使报文不被破坏的过程

同步: 
两个或多个器件同步时钟信号的过程

 

如上图所示,SDASCL线上挂接着很多设备。也有两个主机,AB

SDASCL都是双向线路,就是即可以当输入也可以当输出的,他们都通过上拉电阻连接到正的电源电压上。当总线空闲时,这两条线路都是高电平的。连接到总线的器件输出级必须是漏极开路或者集电极开路才能执行与的功能。

I2C总线上数据的传输速率在标准模式下可以达到100kbit/s,在快速模式下可达到400kbit/s,在高速模式下可达3.4Mbit/s。连接到总线的接口数量只由总线电容是400pF的限制决定。

 

I2C是按位传输的,一个时钟一位数据。SDA线上的数据必须在时钟的高电平周期保持稳定。数据线的高或低电平状态只有在SCL线的时钟信号是低电平时才能改变。

 

       I2C总线中,有起始(S)和停止(P)。

起始位:当SCL是高电平时,SDA线从高电平向低电平转换。

停止位:当SCL是高电平时,SDA线从低电平向高电平转换。

如图所示:

       I2C传输的数据中,发送到SDA线上的每个字节为8位。每个字节后必须跟一个响应位,即ACK。其简单的数据传输的时序如下

 

I2C的地址共有7位,紧接着的第8位是数据方向位,0表示发送(写),1表示请求数据(读)。下图为完整的数据传输图

 

上图就是I2C协议的整个过程了,首先是起始位,然后寻找设备,发送设备地址,接着发送数据,或者请求数据。最后停止位。

至于其他很多模式就不说了,用到了再说吧,这个是常用的。

抱歉!评论已关闭.