打印
[ZLG-MCU]

I2C总结

[复制链接]
4277|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
思行合一|  楼主 | 2011-2-26 01:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一):I2C必须知道的术语:
Transmitter :The device which sends data to the bus。
发送端:该设备发送数据到总线上
Receiver: The device which receives data from the bus
接收端:该设备从总线上接收数据
Master :The device which initiates a transfer,generates clock signals and terminates a transfer
主设备:该设备开始一个传输,生成时钟信号和终止一个传输。
Slave :The device addressed by a master
从设备:被主设备寻址的器件。
(单主设备只要知道上面的就行了,注:一个CPU外挂一个I2C的RTC,和一个I2C的EEPROM的系统也是一个单主设备。标准I2C允许多主机器件在总线上达成,连接多于一个微控制器到I2C 总线,可能性意味着超过一个主机可以同时尝试初始化传输数据。为了避免由此产生混乱,发展出一个仲裁过程。就有下面的名词)
Multi-master: More than one master can attempt to control the bus at the same time without corrupting the message。
Arbitration : Procedure to ensure that, if more than one master simultaneously tries to control the bus, only one is allowed to do so and the winning message is not corrupted。
Synchronization :Procedure to synchronize the clock signals of two or more devices。
二)I2C的数据传输速率(由芯唐科技提供的NUC系列资料得知):
总线上数据的传输速率在标准模式下可达100kbit/s 在快速模式下可达400kbit/s 在高速模式,直至 1.0 Mbit/s 的增强高速模式。
三)明白I2C总线何时可以传输,如何启动一次数据传输:
  
当I2C总线处于空闲状态下,说明没有主机对总线发起传输请求(SCL 和SDA线同时为高),主机可以对总线发出起始信号。起始信号,通常表示为S-bit, 当SCL线为高时,SDA线上信号由高至低,标示总线上产生起始信号,新的传输开始。(注:当SCL为低电平时,SDA上的状态可以改变,当SCL为高电平时,SDA上的状态必须保持。如果改变,则对应了一个起始和结束状)
重复起始信号 (Sr) 。如果产生重复起始Sr 条件而不产生停止条件,总线会一直处于忙的状态。此时的起始条件S和重复起始Sr 条件在功能上是一样的.
四)标准I2C传输协议(就是CPU读或写一次I2C器件数据传输过程):
通常标准I2C传输协议包含四个部分
1) 起始信号或重复起始信号
2) 从机地址传输
3) 数据传输
4) 停止信号
  
(注意上图总共的Sr表示:重复起始信号,MSB在起始位后面表示是高位先发送,MSB:最高位)
知道了I2C传输协议的4大部分,下面先单独介绍其中第2部分(数据传输):
A)主机向从机“写”数据,过程是这样的:主机先向从机发送地址,然后写数据,这个过程传输方向未改变。

(注:由上图得出要明白以下信息:
上图的灰色和白色表示含义;

其中“acknowledge”表示应答信号;
masterA = acknowledge (SDA low) “低电平”表示有应答; /A = not acknowledge (SDA high)“高电平”表示无应答)

B)主机从从机“读”数据,过程是这样的:主机先向从机发送地址,然后从从机中读数据,这个过程传输方向发生改变。
  
(有上面两个图要明白以下信息:
地址传输:第一个字节的头7 位组成了从机地址,当发送了一个地址后,系统中的每个器件都在起始条件后将头7 位与它自己的地址比较,如果一样器件会认为它被主机寻址,从而当SCL第9个时钟沿时,在SDA上发出低信号作为应答。至于是从机接收还是从机发送,由RW位决定
数据传输:当从机地址被成功识别,就可以根据RW所决定的方向,开始一字节以字节的数据传输,每字节最后带一个响应信号,如果从机上产生无响应信号(NACK), 主机产生停止信号,或者产生重复起始信号开始新一轮的数据传输。当主机作为接收器件时,发生无响应信号(NACK) ,从机释放SDA线,使主机产停止信号或重复起始信号.

五)I2C程序控制:下面主要通过模拟I2C方式控制,(因为很多cpu都有I2C内部控制模块,传输操作也都是对寄存器的读写操作,不方便理解I2C传输过程,这里特用模拟的方式控制更容易理解I2C通讯过程)

1)如果要启动I2C总线,当SCL为高电平时使SDA产生一个负跳变,可以利用下面的类似函数:
void I2C_Start(void)
{      
        SDA=1;
        SCL=1;
        DELAY(DELAY_TIME);
        SDA=0;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
}
2)如果要终止I2C总线,当SCL为高电平时使SDA产生一个正跳变,可以利用下面的类似函数
void I2C_Stop(void)
{
        
        SDA=0;
        SCL=1;
        DELAY(DELAY_TIME);
        SDA=1;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
}
3)如果要传输一个bit位:注意下图

(注:当SCL为低电平时,SDA上的状态可以改变,当SCL为高电平时,SDA上的状态必须保持。如果改变,则对应了一个起始和结束状)
(低位时)发送0,在SCL为高电平时使SDA信号为低
void SEND_0(void)   /* SEND ACK */
{
        SDA=0;  /*由I2C_Start( )函数知:开始命令启动后,SCL都是0,所以这里改变SDA值不会对应起始或结束命令*/
        SCL=1;/*这里和下面3句目的产生一个下降沿,通知从机接收数据,注意电平的改变要添加一定的延时*/
        DELAY(DELAY_TIME);
        SCL=0;  
        DELAY(DELAY_TIME);
}
(高位时)发送1,在SCL为高电平时使SDA信号为高
void SEND_1(void)  
{
        SDA=1;
        SCL=1;
        DELAY(DELAY_TIME);
        SCL=0;
        DELAY(DELAY_TIME);
} 转载请注明来自秦工的博客,本文地址:http://www.arm32.com/post/10986.html

相关帖子

沙发
huzixian| | 2011-2-26 11:00 | 只看该作者
以前搞过一段时间,反正是没有搞明白

使用特权

评论回复
板凳
bairan168| | 2011-2-26 21:49 | 只看该作者
:),多搞撒

使用特权

评论回复
地板
yinguangwei| | 2011-3-14 22:31 | 只看该作者
那个延时的时间 DELAY(DELAY_TIME);  是多少ms?    IIC协议中建议的是多少啊?

IO口模拟IIC总线时,传输速度是不是就是根据 数据传输时那个延时计算的?

使用特权

评论回复
5
over_chain| | 2011-3-18 20:25 | 只看该作者
很全面

使用特权

评论回复
6
bit6019| | 2011-3-20 17:46 | 只看该作者
很好的资料

使用特权

评论回复
7
jiangsong0227| | 2011-3-21 15:40 | 只看该作者
学习了

使用特权

评论回复
8
潇湘道人| | 2011-3-21 16:36 | 只看该作者
MARK!!!
IIC很不爽!
尤其是带很多实时的从机设备!

使用特权

评论回复
9
FVJFIFE| | 2011-3-21 17:02 | 只看该作者
好资料,收藏了

使用特权

评论回复
10
黑发尤物| | 2011-3-21 17:10 | 只看该作者
收藏了

使用特权

评论回复
11
kobesff| | 2011-3-21 19:22 | 只看该作者
本帖最后由 kobesff 于 2011-3-21 19:24 编辑

当SCL为高电平时,SDA上的状态必须保持。如果改变,则对应了一个起始和结束状)
重复起始信号 (Sr) 。如果产生重复起始Sr 条件而不产生停止条件,总线会一直处于忙的状态。此时的起始条件S和重复起始Sr 条件在功能上是一样的.
================================
这个不太明白。重复起死Sr是什么?
为什么会有I2C软件包呢?不太明白这个干嘛用的。

使用特权

评论回复
12
肖敏123| | 2011-3-22 17:34 | 只看该作者
很好

使用特权

评论回复
13
huzixian| | 2011-3-23 22:32 | 只看该作者
很有用啊,收下了

使用特权

评论回复
14
-自己人| | 2011-3-24 20:49 | 只看该作者
太好了,收藏了,谢分享

使用特权

评论回复
15
380121850| | 2011-3-24 23:58 | 只看该作者
用硬件IIC,遇到过锁死情况发生
不知道为什么

使用特权

评论回复
16
lin415804| | 2011-4-5 15:26 | 只看该作者
iic的高电平是几v以上?

使用特权

评论回复
17
即时生效| | 2011-4-5 16:35 | 只看该作者
好东西,收藏了

使用特权

评论回复
18
foreverly| | 2011-4-29 23:25 | 只看该作者
不错。受教了。

使用特权

评论回复
19
bairan168| | 2011-4-30 13:55 | 只看该作者
大过节的,帮你顶了。

使用特权

评论回复
20
金鱼木鱼| | 2011-4-30 13:57 | 只看该作者
不错的资料

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

215

主题

1391

帖子

2

粉丝