第019课 I2C协议详解及裸机程序分析

2020-03-24来源: eefocus关键字:I2C  协议详解  裸机程序

第001节_I2C协议与EEPROM

I2C协议

I2C在硬件上的接法如下(图19-1)所示,主控芯片引出两条线SCL,SDA线,在一条I2C总线上可以接很多I2C设备,我们还会放一个上拉电阻(放一个上拉电阻的原因以后我们再说)。

这里写图片描述

我们怎么传输数据,我们需要发数据从主设备发送到从设备上去,也需要把数据从从设备传送到主设备上去,数据涉及到双向传输。


举个例子:

这里写图片描述

体育老师:可以把球发给学生,也可以把球从学生中接过来。


1.发球:a.老师说:注意了(start) 

b.老师对A学生说我要球发给你(地址)。 

:: c.老师就把球发出去了(传输)。 

:: d.A收到球之后,应该告诉老师一声(回应)。 

:: e.老师说下课(停止)


2.接球: 

:: a.老师说注意了(start), 

:: b.老师说:B把球发给我(地址) 

:: c.B就把球发给老师(传输) 

:: d.老师收到球之后,给B说一声,表示收到球了(回应)。 

:: e.老师说下课(停止)


我们就使用这个简单的例子,来解释一下IIC的传输协议。 

* 老师说注意了,表示开始信号(start) 

* 老师告诉某个学生,表示发送地址(address) 

* 老师发球/接球,表示数据的传输 

* 老师/学生收到球,回应表示:回应信号(ACK) 

* 老师说下课,表示IIC传输接受(P)


IIC传输数据的格式

1.写操作:


刚开始主芯片要发出一个start信号,然后发出一个设备地址(用来确定是往哪一个芯片写数据),方向(读/写,0表示写,1表示读)。


回应(用来确定这个设备是否存在),然后就可以传输数据,传输数据之后,要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。


每传输一个数据,接受方都会有一个回应信号,数据发送完之后,主芯片就会发送一个停止信号。


:: 白色背景:主→从 

:: 灰色背景:从→主


这里写图片描述

2.读操作:


刚开始主芯片要发出一个start信号,然后发出一个设备地址(用来确定是从哪一个芯片读取数据),方向(读/写,0表示写,1表示读)。


回应(用来确定这个设备是否存在),然后就可以传输数据,传输数据之后,要有一个回应信号(确定数据是否接受完成),然后在传输下一个数据。


每传输一个数据,接受方都会有一个回应信号,数据发送完之后,主芯片就会发送一个停止信号。


:: 白色背景:主→从 

:: 灰色背景:从→主


这里写图片描述

传输是以8位为单元数据传输的,先传输最高位(MSB),主芯片发出start信号之后,然后发出9个时钟传输数据。


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


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


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


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

这里写图片描述

1.问题:如何在SDA上实现双向传输?


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


2.问题:主设备(从设备)发送数据时,从设备(主设备)的发送引脚,不影响数据的发送,怎么做到呢?


答:里面放一个三极管,使用开极(极电集开发出去作为输出)电路,如下图 

这里写图片描述

下面画一个真值表: 

这里写图片描述

从真值表和电路图我们可以知道,当某一个芯片不行影响SDA线时,那就不驱动这个三极管。

想输出高电平时;都不驱动(高电平就由上拉电阻决定)。

想输出低电平,就驱动三极管。

从下面的例子可以看看数据是怎么传的(实现双向传输),比如:主设备发送(8bit)给从设备 

1.前8个clk 

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

* 主设备决定数据;


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

* 主设备不驱动三极管; 

* 从设备决定数据;


从上面的例子,就可以知道,怎样在一条线上实现,双向传输的办法。这就是为什么在SDA,SCL上放上拉电阻的原因。


在第9个时钟之后,如果有某一方处于繁忙状态,它可以一直把SCL拉低当SCL为低电平时候,大家都不应该使用IIC总线,只有当SCL从低电平变为高电平的时候,IIC总线才能被使用。


从前图我们也可以知道ACK信号应该是低电平。主设备不驱动三极管,如果从设备不驱动三极端的化SDA应该是高电平,当从设备接收数据之后,发出回应信号的时候,就会驱动三极管,让SDA变为低电平。所以说:ACK信号是低电平。


对于IIC协议它只能规定怎么传输数据,数据什么含义它完全不能够控制,数据的含义有从设备决定。


第002节_S3C2440的I2C控制器

在嵌入式系统里面的主控芯片一般都会有I2C控制器,要是没有可以根据I2C协议用GPIO管脚模拟,但是非常麻烦,我们要发送数据时,可以把数据放到某个寄存器,它就会自动的发出时钟,并且把数据发送给从设备,同时会等待从设备会返回回应信号。


当我们想发送一个数据的时候,要设置某个寄存器启动传输,它也一样会产生时钟,然后从设备就会把数据通过SDA传到I2C控制器里面,组装进某个寄存器里面,最终寄存器会把接收到的8位数据返回给我们的程序,从这里可以看到I2C控制器简化了I2C的操作。简短电路连接图,如图:


这里写图片描述

这里写图片描述

根据上图,我们首先设置IICCON(来设置时钟),时钟源是PCLK(是50MHZ)太快了我们需要设置这个分频系数,把时钟降低,降低到我们想要的SCL,然后我们要发出start信号,我们需要设置寄存器发出start信号,之后我们需要发出数据啊,我们的程序可以把数据写入到IICDS寄存器,一写入就会自动的发出时钟,并且把这8位数据从SDA发送给从设备,数据发送之后,在第九个时钟会收到回应信号,可以查询IICSTAT是否有ACK(有ACK表示数据发送成功了),可以继续发送数据,等发完数据之后,再来设置IICSTAT让它发出P信号。


在第九个CLK,就会产生一个中断,在中断处理过程中SCL被拉为低电平,谁都不能再使用IIC总线,等待中断处理完成.


怎样处理中断?


写操作: 

若无ACK,出错,然后发出P信号结束, 

:: 若有ACK信号表示上一个字节成功发送出去 

:: 若仍有数据,写入IICDS寄存器,然后清中断,一清中断就会释放SCL信号,继续发出时钟,把数据再次发送出去。 

:: 若没有数据了,发出P信号结束。


读操作: 

读到8位数时,应该回应一个ACK信号。 

:: 还想读数据,清中断,启动传输。等它再次发生中断时,再来读取IICDS寄存器,得到数据。不想读取数据,发出P信号结束。


重点: 发生中断时,我们的IIC控制器会把SCL拉低,阻止任何设备再使用IIC总线,清中断之后才能继续使用,这种机制就给我们中断服务程序的执行提供了时间。


读-写操作


在发送模式: 

:: 1.往寄存器IICDS寄存器放入一个val值。 

:: 2.发完,产生中断,并且会把 SCL拉低。 

:: 3.在中断程序里,判断状态,然后往IICDS里面写入下一个数据,一旦写入下一个数据IIC继续操作,若再次发完,就会再次产生中断。


在接受模式: 

:: 1.我的程序发起传输,接受数据。 

:: 2.接收到数据之后,产生中断,SCL被拉低。 

:: 3.中断程序里,判断数据是否要继续接受等,如果还有继续接受的话,再次设置,设置好之后读IICDS寄存器,一但读出来IIC。 

:: 继续接受下一个数据,收到新数据之后,又会产生一个中断(就是这样循环操作)。


(l)IICCON寄存器(Multi-masterIIC-buscontrol)


IICCON寄存器用于控制是否发出ACK信号、设置发送器的时钟、开启,i2c中断,并标识中断是否发生。它的各位含义如表:


这里写图片描述

使用IICCON寄存器时,有如下注意事项。


1.发送模式的时钟频率由位[6]、位[3:0]联合决定,另外,llCCON[6]=0,IICCON[3:0] 

不能取0或10


2.12c中断在以下3种情况下发生:当发出地址信息或接收到一个从机地址并且吻合时,当总线仲裁失败时,当发送/接收完一个字节的数据(包括响应位)时。


3.基于SDA、SCL线上时间特性的考虑,要发送数据时,先将数据写入IICDS寄存器,然后再清除中断。


4.如果IICCON[5]=0,IICCON14]将不能正常工作。所以,即使不使用12c中断,也要将IICCON[5]设为1。


(2)IICSTAT寄存器(Multi-masterIIC-buscontrol/status)


IICSTAT寄存器用于选择12c接口的工作模式,发出S信号、P信号,使能接收/发送功能,并标识各种状态,比如总线仲裁是否成功、作为从机时是否被寻址、是否接收到0地址、是否接收到ACK信号等。IICSTAT寄存器的各位如表:

这里写图片描述

(3)IICADD寄存器(Multi-masterIlC-busaddress)


用到IICADD寄存器的位[7:11],表示从机地址。IICADD寄存器在串行输出使能位 

IICSTAT[4]为0时,才可以写入:在任何时间都可以读出。IICADD寄存器的各位如表: 

这里写图片描述

(4)IICDS寄存器(Multi-masterIIC-busTx/Rxdatashift)


用到IICDS寄存器的位丨7:0],其中保存的是要发送或己经接收的数据。IICDS寄存器在串行输出使能位IICSTAT()1为1时,叼可以写入;在任何时间都可以读出。IICDS寄存器的各位如表:

这里写图片描述

读写操作流程图


主机发送器模式操作:

这里写图片描述

主机接收器模式操作:

这里写图片描述

第003节_程序框架

写程序之前 考虑好程序的框架,我们

[1] [2] [3] [4]
关键字:I2C  协议详解  裸机程序 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic492477.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:第018课 ADC和触摸屏硬件原理详解及裸机编程
下一篇:第20课 SPI协议详解及裸机程序开发分析

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

pic之I2C设置
在pic中设置i2c:初始化的时候不能把引脚设置为开漏输出,否则在模块使能的时候,两个引脚的电平会一直拉低的。在寄存器I2CxION直接把bit<15> 设置为1,设置波特率,后面的参考资料;
发表于 2020-03-09
STM8L驱动I2C类型的12864
原理之前没有操作过12864这种类型的屏,但是,操作过其他类型的,原理都是相通的。12864是拥有128x64像素点这类屏幕的称号吧。屏幕有64行,128列;每个汉字是16x16,所以一个这样的屏,最多可以显示4x8的汉字或者8x16的字符。我使用的是不带字库的I2C接口的屏幕,主芯片是ST7656。这样的屏,只能写,不能读。先配置屏幕,然后通过字模制作软件制作出待显示内容的像素数字,最后,通过数据线传送给屏幕显示。了解了原理后,接下来就根据主芯片的数据手册进行配置屏幕就好了。硬件连线CS:片选RST: 复位RS:数据或命令选择SDA:I2C数据线SCL:I2C时钟线I2C采用的是软件模拟的底层写操作#define
发表于 2020-03-04
s3c2440之IIS(4)S3C2440的I2S控制器
I2S音频总线学习(三)S3C2440的I2S控制器一、I2S控制器结构框图S3C2440A的Inter-IC Sound (IIS)总线接口作为一个编解码接口连接外部8/16位立体声音频解码IC用于迷你碟机和可携式应用。IIS总线接口支持IIS总线数据格式和MSB-justified数据格式。该接口对FIFO的访问采用了DMA模式取代了中断。它可以在同一时间接收和发送数据。图1 结构框图1 、总线接口,寄存器组和状态机(BRFC):总线接口逻辑和FIFO 访问由状态机控制。2、5 位双预定标器(IPSR):一个预定标器用于IIS 总线接口的主时钟发生器,另外一个用作外部编解码时钟发生器。3、64 位FIFO(TxFIFO
发表于 2020-02-29
s3c2440之IIS(4)S3C2440的I2S控制器
s3c2440之IIS(3)I2S总线协议
I2S总线协议 一、I2S总线概述音响数据的采集、处理和传输是多媒体技术的重要组成部分。众多的数字音频系统已经进入消费市场,例如数字音频录音带、数字声音处理器。对于设备和生产厂家来说,标准化的信息传输结构可以提高系统的适应性。I2S(Inter—IC Sound)总线是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准,该总线专责于音频设备之间的数据传输,广泛应用于各种多媒体系统。二、I2S总线规范I2S总线拥有三条数据信号线:1、SCK: (continuous serial clock)  串行时钟对应数字音频的每一位数据,SCK都有1个脉冲。SCK的频率=2×采样频率×采样位数2、WS
发表于 2020-02-29
s3c2440之IIS(3)I2S总线协议
在Proteus 6.9中调试I2C设备的方法
刚开始调试TWI总线与AT24C02连接时,因为我是第1次以硬件的方式实现I2C,因此走了几天的弯路。今天完全调试通了。写些调试经验,省得以后有人继续走弯路。可以这么说,利用Proteus调试I2C还是很方便的,比如在图纸上连接好MEGA8和AT24C02后,如果要看I2C调试情况,可以用两种方法:第1种方法是在I2C总线上多连接一个I2C Debugger仪器,在仿真调试期中,该仪器可以显示I2C数据传送时间、S(START状态)、Sr(ReStart状态)、A(Ask响应)、N (No ask状态)、P(Stop状态)、数据(同时显示数据的16进制值和每位的值)。通过查看I2C Debugger窗口的显示,可以知道I2C
发表于 2020-02-26
基于P87LPC764与SAA1064的I2C显示电路
简介:I2C总线是Philips公司推出的芯片间串行传输总线。它以串行数据线(SDA)和串行时钟线(SCL)2根连线实现了完善的全双工同步数据传送,可以极方便地构成多机系统和外围器件扩展系统。I2C总线是Philips公司推出的芯片间串行传输总线。它以串行数据线(SDA)和串行时钟线(SCL)2根连线实现了完善的全双工同步数据传送,可以极方便地构成多机系统和外围器件扩展系统。关于I2C总线的结构和工作原理详见参考文献1。一、P87LPC764单片机I2C总线接口P87LPC764是Philips公司生产的一种小封装、低成本、高性能的单片机(有关它的详细介绍见参考文献2)。它采用80C51加速处理器结构,片内带有支持I2C
发表于 2020-02-24
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved