福德正神彩票!
led
翻开客服菜单
抢手要害词 : 12V调速器 12V调速器
旧事静态
以后地位: 12V调速器 > 公司静态 > I²C初学题目解答疾速上手I²C
I²C初学题目解答疾速上手I²C
公布工夫 : 2019-09-10 16:34 阅读量 : 5

初学I²C在学习进程遇到以下题目I²C概述:
I²C 是Inter-Integrated Circuit的缩写,发音为"eye-squared cee" or "eye-two-cee" , 它是一种两线接口。
I²C 只是用两条双向的线,一条 Serial Data Line (SDA) ,另一条Serial Clock (SCL)。
SCL:上升沿将数据输出到每个EEPROM器件中;降落沿驱动EEPROM器件输入数据。(边沿触发)
SDA:双向数据线,为OD门,与别的恣意数目的OD与OC门成"线与"干系。
输入级

A

CMOS漏极开路

每一个I2C总线器件外部的SDA、SCL引脚电路构造都是一样的,引脚的输入驱动与输出缓冲连在一同。此中输入为漏极开路的场效应管,输出缓冲为一只高输出阻抗的同相器,这种电路具有两个特点:
1)由于SDA、SCL为漏极开路构造(OD),因而它们必需接有上拉电阻,阻值的巨细常为 1k8, 4k7 and 10k ,但1k8 时功能最好;当总线闲暇时,两根线均为高电平。连到总线上的任一器件输入的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线"与"干系。
2)引脚在输入信号的同时还将引脚上的电平停止检测,检测能否与方才输入分歧,为"时钟同步"和"总线仲裁"提供了硬件根底。
主设置装备摆设与从设置装备摆设
零碎中的一切核心器件都具有一个7位的"从器件公用地点码",此中高4位为器件范例,由消费厂家订定,低3位为器件引脚界说地点,由运用者界说。主控器件经过地点码树立多机通讯的机制,因而I2C总线省去了核心器件的片选线,如许无论总线上挂接几多个器件,其零碎依然为繁复的二线构造。终端挂载在总线上,有主端和从端之分,主端必需是带有CPU的逻辑模块,在统一总线上统一时辰使能有一个主端,可以有多个从端,从真个数目受地点空间和总线的最大电容 400pF的限定。  
主端次要用来驱动SCL line;
从设置装备摆设对主设置装备摆设发生呼应;
 
    二者都可以传输数据,但是从设置装备摆设不克不及提倡传输,且传输是遭到主设置装备摆设控制的。

B

4.速率:
  平凡形式:100kHz;
  疾速形式:400kHz;
  高速形式:3.4MHz;
  没有任何须要运用高速SCL,将SCL坚持在100k或以下,然后忘了它吧。
 
 
一、协议

1.闲暇形态

 I2C总线总线的SDA和SCL两条信号线同时处于高电平常,规则为总线的闲暇形态。此时各个器件的输入级场效应管均处在停止形态,即开释总线,由两条信号线各自的上拉电阻把电平拉高。

2.肇始位与中止位的界说:
肇始信号:当SCL为高时期,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号。
中止信号:当SCL为高时期,SDA由低到高的跳变;中止信号也是一种电平跳变时序信号,而不是一个电平信号

C

3.ACK
  发送器每发送一个字节,就在时钟脉冲9时期开释数据线,由接纳器反应一个应对信号。 应对信号为低电平常,规则为无效应对位(ACK简称应对位),表现接纳器曾经乐成地接纳了该字节;应对信号为高电平常,规则为非应对位(NACK),普通表现接纳器接纳该字节没有乐成。 关于反应无效应对位ACK的要求是,接纳器在第9个时钟脉冲之前的低电平时期将SDA线拉低,而且确保在该时钟的高电平时期为波动的低电平。 假如接纳器是主控器,则在它收到最初一个字节后,发送一个NACK信号,以告诉被控发送器完毕数据发送,并开释SDA线,以便主控接纳器发送一个中止信号P。

D

如下图逻辑剖析仪的采样后果:开释总线后,假如没有应对信号,sda应该不断继续为高电平,但是如图中蓝色虚线局部所示,它被拉低为低电平,证明收到了应对信号。

这外面给福德的两个信息是:1)接纳器在SCL的上升沿到来之前的低电平时期拉低SDA;2)应对信号不断坚持到SCL的降落沿完毕;正如前文白色标识所指出的那样。

E

4.数据的无效性:
 
I2C总线停止数据传送时,时钟信号为高电平时期,数据线上的数据必需坚持波动,只要在时钟线上的信号为低电平时期,数据线上的高电平或低电平形态才容许变革。

我的了解:固然只需求在高电平时期坚持波动,但是要有一个提早量,也便是数据在SCL的上升沿到来之前就需预备好,由于在后面I2C总线之(一)---概述一文中曾经指出,数据是在SCL的上升沿打入到器件(EEPROM)中的。

F

5.数据的传送:
 
  在I2C总线上传送的每一位数据都有一个时钟脉冲绝对应(或同步控制),即在SCL串行时钟的共同下,在SDA上逐位地串行传送每一位数据。数据位的传输是边沿触发。
 二、任务进程
  总线上的一切通讯都是由主控器引发的。在一次通讯中,主控器与被控器总是在饰演着两种差别的脚色。
1.主设置装备摆设向从设置装备摆设发送数据
  主设置装备摆设发送肇始位,这会告诉总线上的一切设置装备摆设传输开端了,接上去主机发送设置装备摆设地点,与这一地点婚配的slave将持续这一传输进程,而别的slave将会疏忽接上去的传输并等候下一次传输的开端。主设置装备摆设寻址到从设置装备摆设后,发送它所要读取或写入的从设置装备摆设的外部存放器地点; 之后,发送数据。数据发送终了后,发送中止位:
写入进程如下:
  发送肇始位
发送从设置装备摆设的地点和读/写选择位;开释总线,比及EEPROM拉低总线停止应对;假如EEPROM接纳乐成,则停止应对;若没有握手乐成或许发送的数据错误时EEPROM不发生应对,此时要求重发或许停止。
发送想要写入的外部存放器地点;EEPROM对其收回应对;
发送数据
发送中止位.
EEPROM收到中止信号后,进入到一个外部的写入周期,大约需求10ms,此间任何操纵都不会被EEPROM呼应;(因而以这种方法的两次写入之间要拔出一个延时,不然会招致失败,博主曾在这里小坑了一下)

G

H

需求阐明的是:①主控器经过发送地点码与对应的被控器树立了通讯干系,而挂接在总线上的别的被控器固然同时也收到了地点码,但由于与其本身的地点不符合合,因而提早加入与主控器的通讯;
 
2.主控器读取数据的进程:
  读的进程比拟庞大,在从slave读出数据前,你必需先要通知它哪个外部存放器是你想要读取的,因而必需先对其停止写入(dummy write):
发送肇始位;
发送slave地点+write bit set;
发送外部存放器地点;
重新发送肇始位,即restart;
重新发送slave地点+read bit set;
读取数据
主机接纳器在接纳到最初一个字节后,也不会收回ACK信号。于是,从机发送器开释SDA线,以容许主机收回P信号完毕传输。
发送中止位

I

J

为了加深对I2C总线的了解,用C言语模仿IIC总线,边看源代码边读波形:

如下图所示的写操纵的时序图:

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define write_ADD 0xa0
#define read_ADD 0xa1
uchar a; 
sbit SDA=P2^0;
sbit SCL=P2^1;
void SomeNop();     //短延时
void init();    //初始化
void check_ACK(void);
void I2CStart(void);
void I2cStop(void);
void write_byte(uchar dat);//写字节
void delay(uint z);
uchar read_byte();     //读字节
void write(uchar addr,uchar dat);  //指定地点写
uchar read(uchar addr);       //指定地点读
bit flag;  //应对标记位
void main()
{
    init();
    write_add(5,0xaa); //向地点5写入0xaa
    delay(10);      //延时,不然被坑呀!!!
     P1=read_add(5);      //读取地点5的值
     while(1);   
}
//纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟淫乱 
void delay()//复杂延时函数 
{ ;; } 
//纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟淫乱 
void start()  //开端信号 SCL在高电平时期,SDA一个降落沿则表现启动信号 
{    
    sda=1; //开释SDA总线 
    delay(); 
    scl=1; 
    delay(); 
    sda=0; 
    delay(); 

//纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟淫乱 
void stop()   //中止 SCL在高电平时期,SDA一个上升沿则表现中止信号 

    sda=0; 
    delay(); 
    scl=1; 
    delay(); 
    sda=1; 
    delay(); 
}
//纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟淫乱 
void respons()  //应对 SCL在高电平时期,SDA被从设置装备摆设拉为低电平表现应对 

    uchar i; 
    scl=1; 
    delay();
    //至少等候250个CPU时钟周期
    while((sda==1)&&(i<250))i++; 
    scl=0; 
    delay(); 

//纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟淫乱 
void init()//总线初始化 将总线都拉高一开释总线  发送启动信号前,要先初始化总线。即总有检测到总线闲暇才开端发送启动信号 

    sda=1; 
    delay(); 
    scl=1; 
    delay(); 

//纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟淫乱 
void write_byte(uchar date) //写一个字节 

    uchar i,temp; 
    temp=date; 
 
 
    for(i=0;i<8;i++) 
    { 
        temp=temp<<1; 
        scl=0;//拉低SCL,由于只要在时钟信号为低电平时期按数据线上的上下电平形态才容许变革;并在此时和上一个循环的scl=1一同构成一个上升沿 
        delay(); 
        sda=CY; 
        delay(); 
        scl=1;//拉高SCL,此时SDA上的数据波动 
        delay(); 
    } 
    scl=0;//拉低SCL,为下次数据传输做好预备 
    delay(); 
    sda=1;//开释SDA总线,接上去由从设置装备摆设控制,比方从设置装备摆设接纳完数据后,在SCL为高时,拉低SDA作为应对信号 
    delay(); 

//纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟淫乱 
uchar read_byte()//读一个字节 

    uchar i,k; 
    scl=0; 
    delay(); 
    sda=1; 
    delay(); 
    for(i=0;i<8;i++) 
    { 
        scl=1;//上升沿时,IIC设置装备摆设将数据放在sda线上,并在高电平时期数据曾经波动,可以接纳啦 
        delay();     
        k=(k<<1)|sda; 
        scl=0;//拉低SCL,使发送端可以把数据放在SDA上 
        delay();     
    } 
    return k; 

//纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟淫乱 
void write_add(uchar address,uchar date)//恣意地点写一个字节 

    start();//启动 
    write_byte(0xa0);//发送从设置装备摆设地点 
    respons();//等候从设置装备摆设的呼应 
    write_byte(address);//收回芯片边疆址 
    respons();//等候从设置装备摆设的呼应 
    write_byte(date);//发送数据 
    respons();//等候从设置装备摆设的呼应 
    stop();//中止 

//纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟纨绔子弟淫乱 
uchar read_add(uchar address)//读取一个字节 

    uchar date; 
    start();//启动 
    write_byte(0xa0);//发送发送从设置装备摆设地点 写操纵 
    respons();//等候从设置装备摆设的呼应 
    write_byte(address);//发送芯片边疆址 
    respons();//等候从设置装备摆设的呼应 
    start();//启动 
    write_byte(0xa1);//发送发送从设置装备摆设地点 读操纵 
    respons();//等候从设置装备摆设的呼应 
    date=read_byte();//获取数据 
    stop();//中止 
    return date;//前往数据 
}

标签: