i2c通讯协议及程序
I2C通讯协议(中文译版)I2C_Spec

1.1 版本 1.0-1992 .................................................................................................................... 3 1.2 版本 2.0-1998 .................................................................................................................... 3 1.3 版本 2.1-2000 .................................................................................................................... 3 1.4 购买 Philips 的 I2C 总线元件 .............................................................................................. 3
I2C通信时序图解析

I2C通信时序图解析⼀、I2C协议简介 I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要 USART、CAN 等通讯协议的外部收发设备,现在被⼴泛地使⽤在系统内多个集成电路(IC)间的通讯。
关于I2C协议的更多内容,可阅读《I2C总线协议》,本博⽂主要分析I2C波形图,对于I2C的基础知识不在做介绍。
⼆、I2C协议标准代码2.1 起始信号&停⽌信号 起始信号:当 SCL 线是⾼电平时 SDA 线从⾼电平向低电平切换。
停⽌信号:当 SCL 线是⾼电平时 SDA 线由低电平向⾼电平切换。
2.1.1 起始信号代码void I2C_Start(void){I2C_SDA_High(); //SDA=1I2C_SCL_High(); //SCL=1I2C_Delay();I2C_SDA_Low();I2C_Delay();I2C_SCL_Low();I2C_Delay();}2.1.2 停⽌信号代码void I2C_Stop(void){I2C_SDA_Low();I2C_SCL_High();I2C_Delay();I2C_SDA_High();I2C_Delay();}2.2 发送⼀个字节 CPU向I2C总线设备发送⼀个字节(8bit)数据u8 I2C_SendByte(uint8_t Byte){uint8_t i;/* 先发送⾼位字节 */for(i = 0 ; i < 8 ; i++){if(Byte & 0x80){I2C_SDA_High();}else{I2C_SDA_Low();}I2C_Delay();I2C_SCL_High();I2C_Delay();I2C_SCL_Low();I2C_Delay();if(i == 7){I2C_SDA_High(); /* 释放SDA总线 */}Byte <<= 1; /* 左移⼀位 */I2C_Delay();}} 2.3 读取⼀个字节 CPU从I2C总线设备上读取⼀个字节(8bit数据)u8 I2C_ReadByte(void){uint8_t i;uint8_t value;/* 先读取最⾼位即bit7 */value = 0;for(i = 0 ; i < 8 ; i++){value <<= 1;I2C_SCL_High();I2C_Delay();if(I2C_SDA_READ()){value++;}I2C_SCL_Low();I2C_Delay();}return value;}2.4 应答2.4.1 CPU产⽣⼀个ACK信号void I2C_Ack(void){I2C_SDA_Low();I2C_Delay();I2C_SCL_High();I2C_Delay();I2C_SCL_Low();I2C_Delay();I2C_SDA_High();}2.4.2 CPU产⽣⼀个⾮ACK信号void I2C_NoAck(void){I2C_SDA_High();I2C_Delay();I2C_SCL_High();I2C_Delay();I2C_SCL_Low();I2C_Delay();}2.4.3 CPU产⽣⼀个时钟,并读取器件的ACK应答信号uint8_t I2C_WaitToAck(void){uint8_t redata;I2C_SDA_High();I2C_Delay();I2C_SCL_High();I2C_Delay();if(I2C_SDA_READ()){redata = 1;}else{redata = 0;}I2C_SCL_Low();I2C_Delay();return redata;}三、I2C通信时序图解析 有了上边的I2C总线标准代码的基础,下⾯我们进⼊本博⽂所要讲解的内容,怎么分析I2C的时序图,以O2Micro的OZ9350为例,OZ9350是⼀款模拟前端(AFE)的IC器件。
I2C通讯协议介绍ppt课件

结束整个通讯并且释放总线;
最新课件
15
I2C数据传送
•SCL线呈现高电平期间,SDA线上的电平必 须保持稳定,低电平表示0(此时的线电压 为地电压),高电平表示1(此时的电压由元 器件的VDD决定)。只有在SCL线为低电平期 间,SDA上的电平允许变化。
• 在多主机系统中,可能同时有几个主机企 图启动总线传输数据。为了避免混乱,I2C 总线要通过总线仲裁决定由哪一台主机控 制总线——支持多主控模块,但同一时刻 只允许有一个主控
最新课件
13
•启动信号START后紧接着发送一个地址字节,其中 7位为被控器件的地址码,一位为读/写控制位 R/W,R. /W位为0表示由主控向被控器件写数据, R/W为1表示由主控向被控器件读数据;
字节; • 5. 主控收到数据后发送ACK表示继续传送数据,发送
NACK表示传送数据结束; • 6. 主控发送完全部数据后,发送一个停止位STOP,结
束整个通讯并且释放总线
最新课件
17
I2C数据的中断
• 接收器收到一个完整的数据字节后,有可 能需要完成一些其它工作,如处理内部中 断服务等,可能无法接受下一个字节,这 时候接收器可以将SCL线拉成低电平,从而 使主机处于等待状态,直到接收器准备好 接受下一个字节时,再释放SCL线使为高电 平,使数据传输继续。
I2C串行總線的原理
1、总线的概述 2、总线结构 3、总线传输协议 4、常见波形分析
最新课件
1
I2C串行總線概述
• I2C(Inter-Integrated Circuit)總線是由 PHILIPS公司開發的兩線式串行總線,用于 连接微控制器及其外圍設備。是微電子通 信控制領域廣泛采用的一種總線標準。
I2C通信原理及程序详细讲解

I2C通信原理及程序详细讲解I2C(Inter-Integrated Circuit)是一种串行通信协议,常用于连接微控制器、传感器和其他外部设备。
I2C通信协议由荷兰飞利浦公司于1982年开发,它使用两根信号线(SDA和SCL)进行数据传输。
I2C通信协议采用主从结构,一个主设备(如微控制器)可以连接多个从设备(如传感器)。
主从设备之间通过SDA和SCL线进行数据传输。
SDA线是双向数据线,用于传输数据,SCL线是时钟线,用于同步数据传输。
I2C通信协议中,设备的地址是一个重要概念。
每个设备都有一个唯一的地址,通过该地址可以选择和通信特定的设备。
地址由7个位组成,其中最高位是固定的,并取决于设备是主设备还是从设备。
如果最高位为0,则表示该设备是主设备;如果最高位为1,则表示该设备是从设备。
通过以下步骤,让我们详细了解如何在I2C总线上进行通信。
1.初始化I2C总线:在程序开始时,需要初始化I2C总线。
这通常包括初始化SDA和SCL引脚,设置时钟频率等。
具体的初始化步骤取决于使用的硬件和软件环境。
2.发送开始信号:开始信号表示I2C数据传输的开始。
它由主设备发送,并且SDA线从高电平转为低电平时发出。
发送开始信号后,SDA线上的数据将被解释为地址数据。
3.发送设备地址:主设备发送一个包含设备地址和读/写位(R/W)的数据字节。
设备地址是唯一的,并且由主设备选择。
读/写位指示从设备是要读取数据还是写入数据。
4.等待从设备响应:主设备发送设备地址后,会等待从设备的响应。
从设备将响应一个应答位(ACK)来确认地址接收成功。
如果收到ACK位,则继续进行下一步,否则可能是设备未连接或通信错误。
5.发送数据:主设备发送数据给从设备。
数据可以是命令、配置或实际数据,具体取决于应用场景。
发送数据的方式是将每个数据字节传输到SDA线上,并在每个数据字节后发送一个ACK位。
6.接收数据:从设备将数据发送给主设备。
数据可以是传感器读数、存储器数据等。
I2C协议及用IO口实现I2C

关键字:iic总线 iic协议 iic总线协议 iic程序 i2c总线 i2c协议 i2c总线协议 i2c程序 i2c接口 i2c是什么 i2c驱动 i2c存储器IIC即I2C,一种总线结构。
IIC 是作为英特尔IC 的互补,这种总线类型是由菲利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实施数据传输的控制源。
这种方式简化了信号传输总线。
例如:内存中的SPD信息,通过IIC,与BX芯片组联系,IIC 存在于英特尔PIIX4结构体系中。
随着大规模集成电路技术的发展,把CPU和一个单独工作系统所必需的ROM、RAM、I/O端口、A/D、D/A等外围电路集成在一个单片内而制成的单片机或微控制器愈来愈方便。
目前,世界上许多公司生产单片机,品种很多。
其中包括各种字长的CPU,各种容量的ROM、RAM以及功能各异的I/O接口电路等等,但是,单片机的品种规格仍然有限,所以只能选用某种单片机来进行扩展。
扩展的方法有两种:一种是并行总线,另一种是串行总线。
由于串行总线的连线少,结构简单,往往不用专门的母板和插座而直接用导线连接各个设备。
因此,采用串行线可大大简化系统的硬件设计。
PHILIPS公司早在十几年前就推出了I2C串行总线,利用该总线可实现多主机系统所需的裁决和高低速设备同步等功能。
因此,这是一种高性能的串行总线。
1 、I2C总线的硬件结构I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。
所有接到I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。
典型的I2C总线结构如图1所示。
为了避免总线信号的混乱,要求各设备连接到总线的输出端时必须是开漏输出或集电极开路输出。
设备与总线的接口电路如图2所示。
设备上的串行数据线SDA接口电路应该是双向的,输出电路用于向总线上发送数据,输入电路用于接收总线上的数据。
I2C通信原理及程序详细讲解

I2C 通信:起始条件:SCL为高电平,SDA电平从高变低,这一变化即完成了通信的起始条件。
起始条件和数据通信间,通常会有延时要求具体的指标见设备说明。
数据传输阶段:一字节需要9个时钟周期;且每一位需要一个时钟周期;如上图所示,ADDRESS为目标设备的地址,R/ w为通信的的方向位;"1"时表示读,即后续的数据由目标设备发出,主机进行接收;"0"时表示写,即后续的数据由主机发出目标设备进行接收。
当ACK信号为"0"时,说明接收成功;为"1"时,说明接收失败。
每个字节的传输都是由高位(MSB)到低位(LSB)依次进行传输。
在数据通信过程中,总是由数据接收方发出ACK信号。
终止阶段:当主机完成数据通信,并终止本次传输时会发出终止信号。
当SCL 是高电平时,SDA电平由低变高,这个变化意味着传输终止。
注:每个时钟周期的高电平期间,SDA的数据状态达到稳定。
下面给出了模拟I2C总线进行读写的伪代码,用以说明如何使用GPIO 实现I2C通信:int i2c_start() /* I2C起始条件*/{//初始化GPIO口set_gpio_direction(SDA, OUTP); //设置SDA方向为输出set_gpio_direction (SCL, OUTP); //设置SCL方向为输出set_gpio_value(SDA, 1); //设置SDA为高电平set_gpio_value(SCL, 1); //设置SCL为高电平delay(); //延时//起始条件set_gpio_value(SDA, 0); //SCL为高电平时,SDA由高变低delay(); //适当延时}void i2c_stop() /* I2C终止条件*/{set_gpio_value(SCL, 1);set_gpio_direction(SDA, OUTP);set_gpio_value(SDA, 0);delay();set_gpio_value(SDA, 1); //SCL高电平时,SDA由低变高}/* I2C读取ACK信号(写数据时使用)返回值:0表示ACK信号有效;非0表示ACK信号无效*/unsigned char i2c_read_ack(){unsigned char r;set_gpio_direction(SDA, INP); //设置SDA方向为输入set_gpio_value(SCL,0); // SCL变低r = get_gpio_value(SDA); //读取ACK信号delay();set_gpio_value(SCL,1); // SCL变高delay();return r;}/* I2C发出ACK信号(读数据时使用) */int i2c_send_ack(){set_gpio_direction(SDA, OUTP); //设置SDA方向为输出set_gpio_value(SCL,0); // SCL变低set_gpio_value(SDA, 0); //发出ACK信号delay();set_gpio_value(SCL,1); // SCL变高delay();}void i2c_write_byte(unsigned char b) /* I2C字节写*/{int i;set_gpio_direction(SDA, OUTP); //设置SDA方向为输出for (i=7; i>=0; i--){set_gpio_value(SCL, 0); // SCL变低delay();set_gpio_value(SDA, b & (1<<i)); //从高位到低位依次发送数据set_gpio_value(SCL, 1); // SCL变高delay();}i2c_read_ack(); //检查目标设备的ACK信号}/* I2C字节读*/unsigned char i2c_read_byte(){int i;unsigned char r = 0;set_gpio_direction(SDA, INP); //设置SDA方向为输入for (i=7; i>=0; i--){set_gpio_value(SCL, 0); // SCL变低delay();r = (r <<1) | get_gpio_value(SDA); //高位到低位依次数据读取set_gpio_value(SCL, 1); // SCL变高delay();}i2c_send_ack(); //向目标设备发送ACK信号return r;}/* I2C读操作addr:目标设备地址buf:读缓冲区len:读入字节的长度*/void i2c_read(unsigned char addr, unsigned char* buf, int len){int i;unsigned char t;i2c_start(); //起始条件,开始数据通信//发送地址和数据读写方向t = (addr << 1) | 1; //低位为1,表示读数据i2c_write_byte(t);//读入数据for (i=0; i<len; i++)buf[i] = i2c_read_byte();i2c_stop(); //终止条件,结束数据通信}/* I2C写操作addr:目标设备地址buf:写缓冲区len:写入字节的长度*/void i2c_write (unsigned char addr, unsigned char* buf, int len){int i;unsigned char t;i2c_start(); //起始条件,开始数据通信//发送地址和数据读写方向t = (addr << 1) | 0; //低位为0,表示写数据i2c_write_byte(t);//写入数据for (i=0; i<len; i++)i2c_write_byte(buf[i]);i2c_stop(); //终止条件,结束数据通信}。
IIC通讯协议详解
IIC通讯协议详解IIC概述IIC:两线式串⾏总线,它是由数据线SDA和时钟线SCL构成的串⾏总线,可发送和接收数据。
在CPU与被控IC之间、IC与IC之间进⾏双向传送,⾼速IIC总线⼀般可达400kbs以上。
时钟线SCL:在通信过程起到控制作⽤。
数据线SDA:⽤来⼀位⼀位的传送数据。
IIC分为软件IIC和硬件IIC软件IIC:软件IIC通信指的是⽤单⽚机的两个I/O端⼝模拟出来的IIC,⽤软件控制管脚状态以模拟I2C通信波形,软件模拟寄存器的⼯作⽅式。
硬件IIC:⼀块硬件电路,硬件I2C对应芯⽚上的I2C外设,有相应I2C驱动电路,其所使⽤的I2C管脚也是专⽤的,硬件(固件)I2C是直接调⽤内部寄存器进⾏配置。
补充:1.硬件I2C的效率要远⾼于软件的,⽽软件I2C由于不受管脚限制,接⼝⽐较灵活。
2.IIC是半双⼯通信⽅式IIC通信协议IIC通信过程由开始、结束、发送、响应、接收五个部分构成。
1、(在发送、接收数据的时候)当SCL为⾼电平时,SDA线不允许变化;当SCL线为低电平时,SDA线可以任意0、1变化。
2、(在任意时候)只有当SCL为⾼电平时,IIC电路才对SDA线上的电平(0或者1)进⾏记录,当SCL线为低电平时,⽆论SDA是⾼还是低,IIC电路都不对SDA进⾏采样。
空闲状态在介绍上⾯五个部分前,我们⾸先说说空闲状态,什么是空闲状态,就是没有通信时的状态(初始状态)I2C总线的SDA和SCL两条信号同时处于⾼电平时,规定为总线的空闲状态。
此时各个器件的输出级场效管均处在截⽌状态,即释放总线,由两条信号线各⾃的上拉电阻把电平拉⾼。
开始信号与停⽌信号开始信号:当SCL为⾼期间,SDA由⾼到低的跳变;启动信号是⼀种电平跳变时序信号,⽽不是⼀个电平。
停⽌信号:当SCL为⾼期间,SDA由低到⾼的跳变;停⽌信号也是⼀种电平跳变时序信号,⽽不是⼀个电平信号。
开始信号程序://产⽣IIC起始信号//1.设置SDA输出//2.先拉⾼SDA,再拉⾼SCL,空闲状态//3.拉低SDA//4.准备接收数据void IIC_Start(void){SDA_OUT(); //sda线输出IIC_SDA=1;IIC_SCL=1;delay_us(4);IIC_SDA=0;//START:when CLK is high,DATA change form high to lowdelay_us(4);IIC_SCL=0;//钳住I2C总线,准备发送或接收数据}停⽌信号程序://产⽣IIC停⽌信号//1.设置SDA输出//2.先拉低SDA,再拉低SCL//3.拉⾼SCL//4.拉⾼SDA//5.停⽌接收数据void IIC_Stop(void){SDA_OUT();//sda线输出IIC_SCL=0;IIC_SDA=0;//STOP:when CLK is high DATA change form low to highdelay_us(4);IIC_SCL=1;IIC_SDA=1;//发送I2C总线结束信号delay_us(4);}应答信号发送器每发送⼀个字节,就在时钟脉冲9期间释放数据先,由接收器反馈⼀个应答信号。
I2C的原理与应用
I2C的原理与应用I2C(Inter-Integrated Circuit)是一种串行通信协议,由飞利浦公司于1980年代开发,用于在数字电子系统中连接各个芯片。
它主要使用两根线进行通信,即SDA(Serial Data Line,串行数据线)和SCL (Serial Clock Line,串行时钟线),同时支持多主机和多从机的通信方式。
I2C协议被广泛应用于各种数字设备的互连,包括传感器、存储器、协处理器等。
I2C的通信原理如下:1.总线结构:I2C总线包含一个主机和多个从机。
主机负责控制总线,并发起数据传输请求;从机等待主机发送命令,并根据命令执行相应操作。
2.时序:I2C总线上的通信需要依靠时钟信号进行同步。
主机通过时钟信号SCL驱动数据传输。
数据线SDA上的数据在时钟信号的上升沿或下降沿进行采样和发送。
3.起始和停止位置:数据传输始于主机发送一个起始信号,结束于主机发送一个停止信号。
起始信号通知所有从机总线上的数据传输即将开始;停止信号表示数据传输已经结束。
4.地址与数据传输:在起始信号之后,主机发送一个地址帧给从机。
地址帧的最高位表示读写操作,从机通过地址帧判断自身是否为数据传输的对象,并相应地进行操作。
主机可以在同一个传输过程中多次发送数据,并且可以从一个从机读取多个字节的数据。
I2C的应用广泛,以下是一些常见的应用领域:1.传感器:I2C通信协议在许多传感器和芯片中得到应用,例如加速度计、陀螺仪、温度传感器和压力传感器等。
这些传感器通过I2C协议与主处理器进行通信,并将采集到的数据传输到主处理器进行处理。
2. 存储器:I2C接口也广泛应用于存储器设备,如EEPROM (Electrically Erasable Programmable Read-Only Memory)和FRAM (Ferroelectric Random Access Memory)。
这些存储器设备可以通过I2C总线进行读写操作,从而存储和检索数据。
i2c通信的详细讲解
i2c通信的详细讲解I2C(Inter-IntegratedCircuit)通信协议是一种用于连接两个不同芯片的系统总线技术,也称为两级串行总线协议或者双总线协议。
I2C协议是由 Philips Semiconductors公司发明的,并被广泛应用于许多不同类型的处理器,特别是嵌入式系统中。
在本文中,我们将讨论I2C协议的原理,它的优点及其在实际应用中的使用方法。
I2C协议使用两根线,一根叫作“时钟”(SCL),另一根叫作“数据”(SDA)。
它们可以用来传输数据,也可以用来控制时钟(SCL)和数据(SDA)的发送和接收。
I2C协议的发明是为了实现多设备的联动,使多个设备之间的信息传输更加高效,性能也更加稳定。
I2C协议的优点:1.省电池电量:I2C协议会在不发送数据时减少时钟信号电平,这样可以有效降低电池电量的消耗;2.单:I2C协议只需要两根电线,可以满足大多数多芯片联动的应用需求;3.能稳定:I2C协议传输稳定,在多设备环境中信号传输时间间隔距离短;4.讯范围宽:I2C协议可以实现多芯片间的远近程度,并通过扩展的协议可以扩大通讯的范围;5.持动态分配:I2C协议允许动态的分配芯片通信地址,以及通过地址捕获技术加快芯片通讯的效率。
I2C协议在实际应用中主要用于在不同芯片之间进行信息传输,比如CPU和外设(例如继电器或者显示器)之间的通讯。
运行I2C协议的系统必须具备以下特性:1. 主从模式:I2C要求两个通讯芯片必须有一个主芯片(Master)来控制所有的通讯,而其他芯片则作为从芯片(Slave)来响应主芯片的指令;2.特率:I2C的数据传输不仅要考虑传输的速度,还需要考虑传输的波特率,这个波特率会影响传输的效率;3.址捕获:I2C需要使用地址捕获技术来增加通信的效率,借此可以最大限度的减少不必要的数据通讯量。
I2C协议的应用非常广泛,它可用于控制多种不同的设备,从简单的温度传感器到复杂的PLC控制器,从内存管理到模拟/数字信号处理,几乎都可以用到I2C协议。
i2c通信协议
i2c通信协议I2C通信协议,全称Inter-Integrated Circuit,是一种串行通信协议,通常用于IC之间的通信。
I2C协议由飞利浦公司(现在是恩智浦半导体)于1982年开发,是一种低速、短距离的通信协议,典型传输速率为100 kbits/s。
I2C协议采用主从式结构,即一方为主机,另一方为从机。
I2C总线上可连接多个从机,而每个从机有唯一的地址。
主机可以向从机发送数据,也可以从从机接收数据。
I2C还支持多主操作,即多个主机可以共享一个I2C总线,实现互相协作。
I2C协议使用两根线进行通信:串行数据线(SDA)和串行时钟线(SCL)。
这两根线都必须由外部上拉电阻拉高。
数据传输分为两种模式:传输模式和地址模式。
在传输模式下,主机向从机发送数据;在地址模式下,主机发送一个地址字节,以获取从机的响应。
在传输模式下,I2C总线上的所有从机将监测SDA线上的数据。
主机首先发送一个起始信号,SDA线的电平会从高电平降到低电平,同时SCL线也会变成低电平,表示一个通信周期的开始。
接下来,主机发送从机地址字节,从机检测到地址匹配后,就会响应主机的请求。
主机通过发送数据字节给从机进行通信,所有的字节传输完毕后,主机会发送一个停止信号,SDA线的电平会从低电平升到高电平,同时SCL线也会变成高电平,表示通信周期的结束。
在地址模式下,主机向总线发送一个地址字节,以向特定从机发送命令或检索数据。
从机检测到地址字节匹配后,就会响应主机的请求。
在一些应用中,从机可以返回一个或多个字节的数据,以响应主机的请求。
总之,I2C协议是一种非常灵活和可靠的通信协议,广泛用于单片机、传感器、LCD显示器和其他许多集成电路中,可使用在许多不同的应用场合中,提供了一个在各种不同设备之间进行通信的标准。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
I2C通信协议简介
(2013-01-17 10:48:03)
转载▼
分类:通讯协议
标签:
杂谈
ACK是acknowledge的意思,确认.
摒弃复杂的情况,这里只对I2C做简单的介绍。
一、I2C 总线的一些特征:
• 只要求两条总线线路一条串行数据线SDA一条串行时钟线SCL • 每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机从机关系软件设定地址主机可以作为主机发送器或主机接收器• 它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏
• 串行的8 位双向数据传输位速率在标准模式下可达100kbit/s 快速模式下可达400kbit/s 高速模式下可达3.4Mbit/s
• 片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整
• 连接到相同总线的IC 数量只受到总线的最大电容400pF 限制
二、I2C总线在传送数据过程中共有三种类型信号:开始信号、结束信号和应答信号。
开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据
起始和结束:
bool I2C_Start(void)
{
SDA_H;
SCL_H;
I2C_delay();
if(!SDA_read)return FALSE; // SDA线为低电平则总线忙,退出
SDA_L; // 拉低SDA线(当SCL为高电平时,SDA由高电平向低电平跳变表示开始信号)
I2C_delay();
if(SDA_read) return FALSE; // SDA线为高电平则总线出错,退出
SDA_L; //数据为准备好时,拉低SCL线
I2C_delay();
return TRUE;
}
发出开始信号之后,设备在数据未准备好时,拉低SCL线,这样主设备可知从设备未发送数据,从设备在数据准备好,可以发送的时候,停止拉低SCL线,这时候才开始真正的数据传输
void I2C_Stop(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H; // SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据
I2C_delay();
SDA_H;
I2C_delay();
}
STOP在单主环境下非必要,但在多主环境就非常必要,主控总线的设备发送STOP后,通知总线其他设备总线已经闲置.
void I2C_Ack(void)
{
SCL_L;
I2C_delay();
SDA_L;
I2C_delay();
SCL_H;
I2C_delay();
SCL_L;
I2C_delay();
}
当主机作为接收设备时,主机对最后一个字节不应答,以向发送设备(从设备)标识数据传送结束。
这是因为每次传输都应得到应答信号后再进行下一个字节传送。
如果此时接收机应答了,那它就接收的不是最后一个字节了。
如果是最后一个字节,第9个时钟周期发送的是非应答信号(此时发送的不是应答信号就是非应答信号),最后发送停止信号。
1)主发从收:主START->主发地址->从ACK->(主发数据->从ACK(循环))->主STOP或主START启动下一次传输
这一过程中,主控SCL线,从只在ACK时控SDA线,其他时刻主控SDA线。
2)主收从发:主START->从发地址->主ACK->(从发数据->主ACK(循环))->接受至最后一个字节时,主NACK->主STOP 或主START启动下一次传输
并非每传输8位数据之后,都会有ACK信号,有以下3中例外
1.当从机不能响应从机地址时(例如它正忙于其他事而无法响应IIC
总线的操作,或者这个地址没有对应的从机),在第9个SCL周期内SDA线没有拉低,即没有ACK信号。
这时,主机发出一个P信号终止传输或者重新发出一个S信号开始新的传输。
2.如果从机接收器在传输过程中不能接收更多的数据时,它不会发
出ACK信号。
这样,主机就可以意识到这点,从而发出一个P信号终止传输或者重新发出一个S信号开始新的传输。
3.主机接收器在接收到最后一个字节后,也不会发出ACK信号。
于是,从机发送器释放SDA线,以允许主机发出P信号结束传输。
位传输:
主机向从机发送一字节数据
void I2C_SendByte(u8 SendByte) //数据从高位到低位
{
u8 i=8;
while(i--)
{
SCL_L;
I2C_delay();
if(SendByte&0x80)
SDA_H;
else
SDA_L;
SendByte<<=1;
I2C_delay();
SCL_H;
I2C_delay();
}
SCL_L;
}
三、7位寻址
在起始条件S 后发送了一个从机地址,这个地址共有7 位,紧接着的第8 位是数据方向位R/W ,0表示发送写、1表示请求数据读:
数据传输一般由主机产生的停止位P终止,但是如果主机仍希望在总线上通讯它可以产生重复起始条件Sr和寻址另一个从机,而不是首先产生一个停止条件。
完整的数据传输:
stm32如何建立与EEPROM的通讯
1、配置I/O端口,确定并配置I2C的模式,使能GPIO和I2C时钟。
2、写:
检测SDA是否空闲;
->按I2C协议发出起始讯号;
->发出7位器件地址和写模式;
->要写入的存储区首地址;
->用页写入方式或字节写入方式写入数据;
3、读:
检测SDA是否空闲;
->按I2C协议发出起始讯号;
->发出7位器件地址和写模式(伪写);
->发出要读取的存储区首地址;
->重发起始讯号;
->发出7位器件地址和读模式;
->接收数据;。