IIC总线协议程序
IIC总线工作原理

IIC总线工作原理IIC(Inter-Integrated Circuit)总线,也称为I2C总线,是由飞利浦公司于1982年首次提出的一种串行通信协议,用于连接微控制器和外部设备之间的通信。
它是一种双线制的通信协议,使用一条数据线(SDA)和一条时钟线(SCL),能够连接多个设备,并且可以通过软件控制设备之间的通信。
1.总线拓扑结构2.起始信号和停止信号起始信号由主设备发送,它是在SCL为高电平的情况下,SDA从高电平切换到低电平。
停止信号也由主设备发送,它是在SCL为高电平的情况下,SDA从低电平切换到高电平。
3.地址传输在IIC总线中,每个设备都有一个唯一的7位地址。
主设备在发送起始信号后,紧接着发送设备的地址。
主设备发送的设备地址包含读写位。
读操作用1表示,写操作用0表示。
通过设备的地址,主设备可以选择与之通信的从设备。
4.数据传输在IIC总线中,数据的传输是以字节为单位进行的。
每次传输一个字节的数据时,都需要在每个位周期(Bit Period)的时钟脉冲上进行数据传输。
数据传输分为两种模式:主设备向从设备发送数据和从设备向主设备发送数据。
主设备向从设备发送数据时,数据由主设备发送,并且在每个位周期的时钟脉冲上,从设备会返回一个确认信号来确认数据是否接收成功。
从设备向主设备发送数据时,数据由从设备发送,并且在每个位周期的时钟脉冲上,主设备需要返回一个确认信号来确认数据是否接收成功。
5.应答位在IIC总线的数据传输过程中,每次主设备向从设备发送一个字节的数据后,从设备需要返回一个应答位(ACK)来确认数据是否已经接收成功。
如果从设备接收到了数据,它会将SDA引脚拉低来发送应答位。
6.数据传输速率总的来说,IIC总线是一种简单、高效的串行通信协议,它通过主从式的拓扑结构,通过起始信号和停止信号、地址传输、数据传输和应答位等机制来实现设备之间的通信。
它的优点在于可以连接多个设备、通信速率较快,适用于各种嵌入式系统和通信设备的应用。
i2c读写程序的详细讲解

i2c读写程序的详细讲解i2c是Inter-IntegratedCircuit的缩写,是一种主从机多总线的通信协议,也就是说,它可以允许多个电子设备在同一个信号线上通信。
i2c是分布式共享总线,它支持主机和多个从机之间的双向传输数据,因此本范文将针对i2c读写程序进行详细的讲解。
首先,我们来看一下i2c协议的特性:i2c协议使用两根信号线,分别是SCL(时钟线)和SDA(数据线),以及一个地线。
其中,SCL线用于传输时钟信号,SDA线用于传输数据,而地线用于给一个共同的参考电位。
i2c的数据传输是先信号再数据,即SCL脉冲先于SDA脉冲,且SDA数据根据SCL时钟的上升沿来储存和传输。
i2c协议的常见的特性包括节点重用,三线模式,通用性,简单性等。
接下来,我们来看一下i2c读写程序。
i2c读写程序是基于i2c协议来操作i2c总线上分布式设备的软件。
它包括一系列的控制参数,如速率、时钟频率、地址空间等,以及一系列读写操作。
i2c读操作通常有三种形式,分别为单字节读取、多字节读取和8位快速读取。
其中,单字节读取是i2c读操作中最常见的模式,其工作机制如下:首先,从主机发出一个读控制信号,只有当从机完成该信号指令后,才会将数据发送给主机;随后,主机收到数据后,发出一个确认信号来确认接收到了数据,从机收到信号后,就会发送下一个字节的数据。
多字节读取和单字节读取有很多相似之处,主要的不同在于它支持一次读取多字节的数据,首先,主机发出一个读控制信号,只有当从机完成该信号指令后,才会将数据发送给主机;随后,主机持续接收数据,直到接收到所有的数据为止。
8位快速读取模式是i2c总线上读取操作中最快的模式,它和其他读取模式有很多相同之处,主要是有一个专门的8位快速读指令,使用这个指令可以实现一次读取多字节数据的功能,而不需要反复发出读控制信号。
另外,i2c读写程序还支持写操作,其工作机制大致相同,只是在发出控制信号后,主机会将数据发送给从机,而不是从机将数据发送给主机。
i2c协议详解

i2c协议详解
I2C(Inter-Integrated Circuit)协议是一种双向串行总线,也称作IIC、TWI(Two-Wire Interface)或SMBus(System Management Bus),由Philips公司于1982年开发,用来连接多个微处理器和其它通信芯片。
I2C协议有两根线,分别是SCL(时钟线)和SDA(数据线),使用双线的好处就是只要两根线就可以完成数据传输,而不需要增加额外的线路,能够大大减少系统所需要的线路,减少系统的复杂度和成本。
I2C协议需要一个主控制器来控制整个系统,主控制器通过SCL线来发送时钟,并通过SDA线来发送和接收数据,从控制器则只负责接收数据。
I2C协议有7个基本信号,START、STOP、ACK、NACK、READ、WRITE和REPEAT START,START在传输数据前发出,STOP则在传输结束后发出,ACK和NACK则用来表示接收方是否正确接收到数据,READ和WRITE则用来指示当前传输的数据是读数据还是写数据,REPEAT START则用来重新开始新一轮的传输。
I2C协议的最大优点是简单、易用,而且可以支持多个从控制器,不过它的缺点也是显而易见的,它的传输速度相对较慢,而且它的传输距离也有限,约在50cm左右。
实验八 IIC通信协议

实验八I2C通信协议一、实验目的:1、培养学生阅读资料的能力;2、加深学生对I2C总线通信协议的理解;3、加强学生对模块化编程的理解;二、实验环境:1、硬件环境:PC机一台、单片机实验板一块、母头串口交叉线、USB电源线;2、软件环境:keil uVision2集成开发环境;STC-ISP下载上位机软件;三、实验原理:要学会I2C通信协议的编程,关键是要看懂并掌握其时序图,理解对I2C通信协议相关子程序的实验编写。
I2C通信协议的总线时序图如下所示:I2C总线时序图I2C相关子程序的详细介绍1、起始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
2、结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
起始信号和结束信号的时序图如下所示:起始信号和结束信号的时序图起始信号的流程如下:1、SCL和SDA拉高,保持时间约为0.6us-4us;2、拉低SDA,保持时间为约为0.6us-4us;3、拉低时钟线结束信号的流程如下:1、SCL置高电平,SDA置低电平,保持时间约为0.6us-4us2、SDA拉高,保持时间约为1.2-4us;应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。
CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。
若未收到应答信号,由判断为受控单元出现故障。
应答信号的时序图如下所示:应答时序图发送时的应答信号;**********应答信号**********ACK: SETB SDA ;数据线置高SETB SCL ;时钟线置高ACALL DELAYJB SDA,$ ;等待数据线变低ACALL DELAYCLR SCL ;时钟线置低RET注意:这里如果数据线一直为高将进入死循环,所以一般我们都会在这做一个容错的处理。
具体的程序如下:ACK: MOV R4,#00HSETB SDASETB SCLLOP0: JNB SDA,LOPDJNZ R4,LOP0 ;循环255次LOP: ACALL DELCLR SCLRET接收时的应答信号ACK1: CLR SDA ;数据线置低SETB SCL ;时钟线置高NOPNOPCLR SCL ;时钟线置低SETB SDA ;数据线置高RET3、字节的发送和接收写周期时序图一字节数据发送子程序,流程如下:图6-22 发送子程序流程图(2)一字节数据接收子程序,流程如下:图6-23 接收子程序流程图7、写操作(1)字节写图6-24 字节写时序图流程如下:图6-25 字节写的流程图(2)页写图6-26 页写时序图页写流程如下:8、读操作(1)选择读图6-28 选择读时序图图6-29 NO ACK时序图(2)连续读图6-30 连续读时序图四、实验原理图:I2C总线电路图五、实验例题:例题一编写一程序,实现I2C的指定字节读写,用24C08来记录单片机复位或者开机的次数,并将复位或者开机的次数显示在数码管上。
IIC总线协议-基于at24c64

IIC总线协议前言:1.只有在总线空闲时才允许启动数据传送.2.在数据传送过程中,当时钟线为高电平时,数据线必须保持稳定状态,不允许有跳变.时钟线为高电平时,数据线的任何电平变化将被看做总线的起始或停止信号.3.任何将数据传送到总线的器件作为发送器任何从总线接收数据的器件为接收器,主器件和从器件都可以作为发送器或接收器但由主器件控制传送数据.4.有两根数据线:SDA : IIC数据传送位SCL : IIC 时钟控制位下面对IIC的底层驱动加以说明,并给出汇编和C语言的代码,以AT24C64为例.在这之前先定义一些常量和公共代码:汇编:SDA BIT P3.4 ;数据端SCL BIT P3.5 ;时钟端DELAY : NOP ;延时子程序,根据单片机的晶振不同,延时长短略有不同NOP ;12MHZ晶振NOPNOPNOPNOPRETC语言:sbit SDA = P3.4;sbit SCL = P3.5;void delay(void) //延时子程序{unsigned char i;for(i=0;i<10;i++);}起始信号:时钟线保持高电平期间,数据线电平从高到低的跳变作为IIC总线的起始信号.汇编:IIC_ST: ;IIC起始代码LCALL DELAYCLR SCLLCALL DELAYLCALL DELAYSETB SDALCALL DELAYLCALL DELAYSETB SCLLCALL DELAYLCALL DELAYCLR SDALCALL DELAYLCALL DELAYCLR SCLLCALL DELAYRETC语言:void iic_start(void){SCL=0;delay();SDA=1;delay();SCL=1;delay();SDA=0;delay();SCL=0;delay();}停止信号:时钟线保持高电平期间,数据线电平从低变高. 汇编:IIC_SP:LCALL DELAYCLR SCLLCALL DELAYLCALL DELAYCLR SDALCALL DELAYLCALL DELAYSETB SCLLCALL DELAYLCALL DELAYSETB SDALCALL DELAYRETC语言:void iic_stop(void){delay();SCL=0;delay();SDA=0;delay();SCL=1delay();SDA=1;delay();}器件寻址:首先发送一个起始信号,启动发送过程,然后发送它所需要的寻址的从器件的地址.8从位器件地址的高4位固定为1010,接下来的三位为器件的地址位,最低一位作为读写控制位.1: 表示从器件进行读;0: 表示对器件进行写.应答信号:IIC总线数据传送时,每成功的传送一个字节数据后,接收器都必须产生一个应答信号.应答的器件在第九个时钟周期时将SDA拉低,表示收到一个8位数据.写操作:(字节模式)主器件发送起始信号和从器件地址信息(R/W位清0)给从器件,在从器件送回应答信号后,主器件发送两个8位地址字写入从器件的地址指针,主器件在收到从器件的应答信号后,再发送数据到到被寻址的从器件存储单元,从器件再次应答,并在主器件产生停止信号后开始内部数据的擦写.汇编:;##############写数据到at24c64-ATW2##############;说明:写一字节数据到at24c64,失败PSW.5置1;入口参数:A;出口参数:无;###############################################IIC_WB:MOV R2,#8CLR SCLJ4: RLC ALCALL DELAYLCALL DELAYMOV SDA,CLCALL DELAYLCALL DELAYSETB SCLLCALL DELAYLCALL DELAYCLR SCLDJNZ R2,J4SETB SDALCALL DELAYLCALL DELAYSETB SCL ;第九个时钟周期LCALL DELAYLCALL DELAYJB SDA,J1 ;正常情况下,第九个时钟周期收到的SDA应为低CLR SCL ;释放总线LCALL DELAYLCALL DELAYCLR PSW.5 ;接收成功LJMP edwJ1: CLR SCL ;释放总线SETB PSW.5 ;接收失败edw: RETC语言:void iic_write_byte(unsigned char w_byte){unsigned char i;SCL=0;for(i=0;i<8;i++){delay();if((w_byte<<i)&0x80)SDA=1;elseSDA=0;delay();SCL=1;delay();SCL=0;}SDA=1;delay();SCL=1; //第九个时钟周期delay();if(SDA==1) //正常情况下,第九个时钟周期时,收到的SDA应该为低电平{ //写入出错SCL=0;PSW.5=1; //出错标志}else{ //写入成功SCL=0;PSW.5=0; //成功标志}}读操作:读操作的初始化方式和写操作一样,仅把R/W位置1.读操作的种类:1.立即/当前地址读(本例未用)2.选择/随机读: 允许对任意字节进行读,首先发送起始信号,从器件地址和它想读的字节数数据地址,执行一个伪写操作,在A T24C64应答之后,主器件重新发送起始信号和从器件地址,此时R/W位置1.AT24C64响应并发送应答信号,然后输出所要求的一个8位字节数据.主器件不发送应答信号但产生一个停止信号.汇编1:;/** 单字节读**/;读出的一个字节存放在A中IIC_RB:CLR ACLR CLCALL DELAYLCALL DELAYCLR SCLLCALL DELAYLCALL DELAYMOV R2,#8J5: SETB SCLLCALL DELAYLCALL DELAYMOV C,SDARLC ALCALL DELAYCLR SCLLCALL DELAYLCALL DELAYDJNZ R2,J5CLR SDALCALL DELAYLCALL DELAYSETB SCL ;第九个时钟周期,应将SDA拉低作为应答信号LCALL DELAYLCALL DELAYCLR SCL ;释放总线LCALL DELAYLCALL DELAYSETB SDARET汇编2:;################序列读最后一字节###############;读最后一字节时需要发送停止信号IIC_RL:CLR ACLR CLCALL DELAYLCALL DELAYCLR SCLLCALL DELAYLCALL DELAYMOV R2,#8J50: SETB SCLLCALL DELAYLCALL DELAYMOV C,SDARLC ALCALL DELAYLCALL DELAYCLR SCLLCALL DELAYLCALL DELAYDJNZ R2,J50SETB SDALCALL DELAYSETB SCL ;停止信号LCALL DELAYLCALL DELAYRETC语言1: 单字节读unsigned char iic_read_byte(void){unsigned char i,j=0;delay();SCL=0;delay();for(i=0;i<8;i++){SCL=1;delay();j<<=1;if(SDA==1)j+=1;delay();SCL=0;delay();}SDA=0;delay();SCL=1;delay();SCL=0;delay();SDA=1;return j;}C语言2: 序列读最后一字节unsigned char iic_read_last_byte(void){unsigned char I,j=0;delay();SCL=0;delay();for(i=0;i<8;i++){SCL=1;delay();j<<=1;if(SDA==1)j+=1;delay();SCL=0;delay();}SDA=1;delay();SCL=1; //停止信号delay();return j;}举例: 以AT公司生产的IIC器件EEPROM: at24c64为例,对该器件进行读写1.原理图AT24C64器件简介:2.将位于R0(buf)所指向的地址单元中的COUNT(count)个数据写入AT24C64的ADDRH,ADDRL(addrh,dddrl)地址单元中.(括号内为c语言变量)汇编:(会用到上面给出的IIC驱动子程序以及定义的一些变量和接口)ADDRH EQU 13HADDRL EQU 14H ;定义读写AT24C64的首地址STOR1: MOV COUNT,#4 ;写入的字节数MOV ADDRH,#xx ; 写入到AT24C64的地址字MOV ADDRL,#xxLCALL WRDAT ;将位于R0所指向的地址单元中的COUNT个数据写入;AT24C64的ADDRH,ADDRL地址单元中;###########所有参数写入A T24C64,共4字节#################;说明:将表号和用户电量共四字节数据写入A T24C64中;入口参数:; 1.数据间接寻址地址-R0; 2.写入到AT24C64的地址字-ADDRH,ADDRL; 3.写入字节数-COUNT;出口参数:无;#######################################################WRDAT: LCALL IIC_ST ;STARTMOV A,#0A0HLCALL IIC_WB ;写器件寻址00H(第一片A T24C64) 将A中的字符发送JB PSW.5,WRDATMOV A,ADDRHLCALL IIC_WBJB PSW.5,WRDATMOV A,ADDRLLCALL IIC_WB ;存储单元地址JB PSW.5,WRDATMOV R7,COUNTWRDAT0: MOV A,@R0LCALL IIC_WB ;写入数据JB PSW.5,WRDATINC R0DJNZ R7,WRDAT0LCALL IIC_SP ;停止LCALL DL20MS ;延时,等待将数据擦写到at24c64中RETC语言:unsigned char count=0x04;unsigned char addrh=0xxx;unsigned char addrl=0xxx;unsigned char t_buf[];while(!write_byte(t_buf,addrh,addrl,count));/*###########所有参数写入AT24C64,共4字节################# //说明:将表号和用户电量共四字节数据写入AT24C64中//入口参数:; 1.数据间接寻址地址-buf; 2.写入到AT24C64的地址字-addh,addrl; 3.写入字节数-count;出口参数:1表示写成功,0表示写失败;#######################################################*/ bit write_byte(unsigned char * buf, //unsigned char addrh,unsigned char addrl,unsigned char count){unsigned char i;iic_start(); //startiic_write_byte(0x0a0); //写器件寻址0x00(第一片at24c64) if(PSW.5)return 0;iic_write_byte(addrh);if(PSW.5)return 0;iic_write_byte(addrl);if(PSW.5)return 0;for(i=0;i<count;i++){iic_write_byte(*buf);if(PSW.5)return 0;buf++;}iic_stop();return 1;}2.从at24c64的ADDRH,ADDRL(addrh,addrl)地址单元中读出COUNT(count)个数据存放到单片机R0(buf)指定的地址单元中.(括号中为C语言变量)汇编: (会用到上面给出的IIC驱动子程序以及定义的一些变量和接口)ADDRH EQU 13HADDRL EQU 14H ;定义读写AT24C64的首地址STOR1: MOV COUNT,#4 ;读出入的字节数MOV ADDRH,#xx ; 读入的AT24C64的地址字MOV ADDRL,#xxLCALL LDDAT ; 从at24c64中读数据;/*############从at24c64中读数据#########################; 入口参数:LDDA T: LCALL IIC_ST ;STARTMOV A,#0A0H ;对器件进行写LCALL IIC_WB ;虚写操作器件寻址00H(第一片AT24C64)JB PSW.5,LDDA TMOV A,ADDRHLCALL IIC_WB ;JB PSW.5,LDDA TMOV A,ADDRLLCALL IIC_WB ;虚写存储单元地址JB PSW.5,LDDA T;以上为先初始化一个读数据地址LCALL IIC_ST ;STARTMOV A,#0A1HLCALL IIC_WB ;读操作器件寻址00H(第一片A T24C64)JB PSW.5,LDDA TMOV R7,COUNTCJNE R7,#01,LD01LJMP LDDA T1LD01: DEC R7LDDAT0: LCALL IIC_RB ;现行地址读(0000H)MOV @R0,AINC R0DJNZ R7,LDDAT0LDDAT1: LCALL IIC_RL ;读最后一字节,读完后给A T24C64发停止信号MOV @R0,Ainc r0LCALL IIC_SP ;停止信号RETC语言:unsigned char count=0x04;unsigned char addrh=0xxx;unsigned char addrl=0xxx;unsigned char r_buf[];while(!read_byte(r_buf,addrh,addrl,count));/* */bit read_byte(unsigned char *buf, //存放读到的数据unsigned char addrh,unsigned char addrl, //要读的数据地址unsigned char count) //需要读的个数{unsigned char i;iic_start();iic_write_byte(0x0a0); //对器件进行寻址,虚写操作器件寻址00H(第一片) if(PSW.5)return 0;iic_write_byte(addrh); //虚写存储单元地址if(PSW.5)return 0;iic_write_byte(addrl); //虚写存储单元地址if(PSW.5)return 0;//以上为初始化一个读数据地址iic_start(); //重发起始信号iic_write_byte(0x0a1); //对器件读命令if(PSW.5)return 0;if(count==1){*buf=iic_read_last_byte();buf++;}else{for(i=0;i<count;i++){*buf=iic_read_byte();buf++;}}iic_stop();return 1;}。
IIC总线协议及EEPROMAT24C02

IIC总线协议及EEPROMAT24C02IIC总线协议及EEPROMAT24C02IIC总线协议是一种串行通信协议,用于在电子设备之间进行数据传输。
它也被称为I2C(Inter-Integrated Circuit)协议。
IIC总线协议由Philips(现在的NXP Semiconductors)在1982年开发,用于同一电路板上的集成电路芯片之间的通信。
IIC总线是一种主从式结构,其中一个设备作为主设备,其他设备作为从设备。
主设备负责控制数据传输和通信的时序。
每个从设备都有一个唯一的地址,主设备根据地址选择要与之通信的从设备。
从设备根据主设备发出的命令来执行特定的操作,例如读取数据或写入数据。
EEPROM是一种可擦写可编程只读存储器(Electrically Erasable Programmable Read-Only Memory),用于存储非易失性数据。
AT24C02是Microchip Technology公司制造的一种EEPROM芯片,具有容量为2Kbit的存储能力。
AT24C02采用了IIC总线协议,因此可以通过IIC总线与其他设备进行通信。
它有一个7位地址寄存器,可以设置其作为IIC总线上的从设备的地址。
在与主设备通信时,主设备发送一个启动条件,然后发送从设备地址,接下来是读写位和数据。
AT24C02根据主设备的指令来执行读取或写入操作。
AT24C02有一个内部的写保护电路,可以保护存储的数据被误写。
它还支持分页写入,即可以一次写入多个字节的数据,从而提高写入效率。
总结:IIC总线协议是一种用于串行通信的协议,适用于设备之间的数据传输。
AT24C02是一种采用IIC总线协议的EEPROM芯片,具有2Kbit的存储容量。
它通过主设备的控制来进行读写操作,同时具有写保护和分页写入等特性。
I2C总线编程实例(k1-k4:写入、读取、加+、清零)【EEPROM-AT24C02】

I2C总线编程实例(k1-k4:写⼊、读取、加+、清零)【EEPROM-AT24C02】(1)AT24C02是⼀种EEPROM元器件,是⼀种只读寄存器,断电保持,可保存数据100年, 是⼀种可擦除读写的芯⽚,相当于ROM硬盘,在下⾯实验中充当从机⾓⾊;(2)51在下⾯实验中充当主机⾓⾊;(3)在IIC总线标准协议上,进⾏51单⽚机(主机)和AT24C02(从机)的相互读写数据的操作。
⼩结:51单⽚机和各种EEPROM芯⽚之间可以通过IIC总线标准协议进⾏数据交互(通信)的。
实验:四个独⽴按键对应四个不同的功能,k1:将数据写⼊单⽚机,断电保存k2:读取上次保存的数据,断电后仍可读取上次保存的数据k3:当前数据+1k4:当前数据清零------------------------------------------------------------- 采⽤多⽂件的框架模式 -------------------------------------------------------------i2c.h:/*这个⽂件进⾏宏定义:定义I2C串⾏总线的相关数据端⼝、⽅法函数,以及定义⼀些使⽤频率较⾼的元素*/#ifndef _I2C_H_ // 如果没有定义宏#define _I2C_H_ // 定义⼀个宏// 需要⽤到51单⽚机的管脚,所以需要引⼊库⽂件#include <reg52.h>// 查单⽚机原理图可知(其中,SCL是时钟线,SDA是数据线)sbit SCL=P2^1;sbit SDA=P2^0;/* 相关函数 */// I2C的起始信号函数void I2cStart();// I2C的终⽌信号函数void I2cStop();// I2C发送(写⼊)字节函数,成功返回1,失败返回0unsigned char I2cSendByte(unsigned char dat);// I2C接收(读取)字节函数,返回读取的数据unsigned char I2cReadByte();// AT24C02芯⽚的写⼊数据函数void At24c02Write(unsigned char addr, unsigned dat);// AT24C02芯⽚的读取数据函数,返回读取的数据unsigned char At24c02Read(unsigned char addr);#endif // 结束i2c.c:/* 这个⽂件专门针对I2C模块的编程,其他模块可以新建另外⼀个⽂件 */#include <i2c.h> // 引⼊I2C的库⽂件/******************************************************************************** 函数名 : Delay10us()* 函数功能 : 延时10us* 输⼊ : ⽆* 输出 : ⽆*******************************************************************************/void Delay10us() //误差 0usunsigned char a,b;for(b=1;b>0;b--)for(a=2;a>0;a--);}/******************************************************************************** 函数名 : I2cStart()* 函数功能 : 起始信号:在SCL时钟信号在⾼电平期间SDA信号产⽣⼀个下降沿* 输⼊ : ⽆* 输出 : ⽆* 备注 : 起始之后SDA和SCL都为0,表⽰总线被主机占⽤*******************************************************************************/void I2cStart(){// 根据各个单⽚机的时序图来写SDA=1;Delay10us();SCL=1;Delay10us(); // 建⽴时间是SDA保持时间>4.7usSDA=0;Delay10us(); // 保持时间是>4usSCL=0;Delay10us();}/******************************************************************************** 函数名 : I2cStop()* 函数功能 : 终⽌信号:在SCL时钟信号⾼电平期间SDA信号产⽣⼀个上升沿* 输⼊ : ⽆* 输出 : ⽆* 备注 : 结束之后保持SDA和SCL都为1;表⽰总线处于空闲状态*******************************************************************************/void I2cStop(){// 根据各个单⽚机的时序图来写SDA=0;Delay10us();SCL=1;Delay10us(); // 建⽴时间是SDA保持时间>4.7usSDA=1;Delay10us(); // 保持时间是>4us}/******************************************************************************** 函数名 : I2cSendByte(unsigned char dat)* 函数功能 : 通过I2C发送⼀个字节。
iic从机流程

iic从机流程
IIC(Inter-IntegratedCircuit)是一种串行通信总线协议,可用于连接多个从设备和一个主设备。
IIC从机流程如下:
1. 从机地址匹配:当主设备发送帧时,帧中包含从机地址和读写位。
从机需要与帧中的从机地址匹配,才会响应主设备的请求。
2. 数据传输:当地址匹配成功后,主设备会发送数据或命令给从机。
从机接收到数据或命令后,按照主设备的要求进行处理,然后将处理结果返回给主设备。
3. 响应主设备:从机接收到主设备的请求后,需要及时响应。
响应有两种方式:ACK(应答)和NACK(非应答)。
如果从机成功接收到数据或命令,会返回ACK;如果从机不能接收或处理数据或命令,会返回NACK。
4. 结束传输:当主设备和从机都完成数据传输后,需要结束传输。
主设备会发送停止条件,表示传输结束。
从机接收到停止条件后,将结束传输。
以上就是IIC从机流程的基本步骤。
从机需要按照这个流程与主设备进行通信,保证通信的顺畅和可靠。
- 1 -。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SDA = 0; I2C _DELAY; I2C _DELAY; }
//---------------------------------------------------------------//OK //---------------------------------------------------------------void I2C_Stop(void) { SDA = 0 ; I2C _DELAY;
//---------------------------------------------------------------void writeByte(INT8U datum) { INT8U bitCnt = 0 ;
for(bitCnt=0; bitCnt<8; bitCnt++) {
SCL = 0 ; I2C _DELAY;
/*---------------------------------------------------------------Acess the eeprom--24c04 ----------------------------------------------------------------*/ #include <intrins.h>
for(bitCnt=0; bitCnt<8; bitCnt++) {
SCL = 0; //?????????????????????????huan??????????????? I2C _DELAY;
tempbit = SDA ; if (tempbit) temp |= 0x01 ; else temp &= 0xfe ;
SCL = 0; I2C _DELAY;
SDA = 0; I2C _DELAY;
SCL = 1; I2C _DELAY;
}
//---------------------------------------------------------------// //---------------------------------------------------------------void sendNoAck(void) { SCL = 0;
在 Keil 中编辑好源文件以后,接下来就可以建立工程文件并生成相应的源 代码了,然后我们来绘制电路图。
此例的电路图极其简单。只需两个 IC,即 AT89C51和24C02C,和两个上 拉电阻,而且上拉电阻还可以省略。至于连接,就更为简单了。最后得到绘制好 的电路图如下图所示:
绘制好电路图,我们就可以将前面刚刚生成的程序源代码装入单片机了, 装入以后,下面我们就可以来进行仿真了。
下面我们用一个使用 IIC 总线连接器件的例子来简单说明 IIC 总线的仿真。 例.EEPROM24C02是采用 IIC 接口的一种常用2Kbit(256×8bit)的存储器 。 编写程序使用 AT89C51的 IO 口模拟实现 IIC 总线协议进行通信,并向24C02存 储器内从字节0到字节 FF 写入数字0到 FF。 51系列单片机本身没有 IIC 接口,但一些本身具有 IIC 接口的单片机往往是 高端产品,一方面价格不菲,另一方面我们的系统也没有必要使用之。通常我们 就使用软件通过51系列单片机的 IO 口来模拟实现 IIC 总线通信。 本例事实上比较简单,但需要对 IIC 总线时序有较好的理解。源文件如下图 所示(采用 C51语言编写):
//---------------------------------------------------------------INT8U readByte(void) { bit tempbit = 1 ; INT8U temp = 0 ; INT8U bitCnt ;
SDA = 1 ; // release the bus,ready to receive byte?????????????? I2C _DELAY;
for(; k>0; k--) { for(i=0; i<93; i++)
; } }
//---------------------------------------------------------------//OK //---------------------------------------------------------------void I2C_Start(void) { SDA = 1; I2C _DELAY;
if(!checkAck()) {
I2C_Stop() ; mDelay(100) ; } }
I2C_Stop() ; }
/*----------------------------------------------------------------read some bytes from ROM`s sequential address -----------------------------------------------------------------*/ void readFromROM(INT8U datum[], INT8U address, INT8U num) { bit tempbit ; INT8U i ; INT8U *datum_P ;
SCL = 1 ; I2C _DELAY;
SDA = 1 ; I2C _DELAY; I2C _DELAY; }
//---------------------------------------------------------------// //---------------------------------------------------------------void sendAck(void) {
SCL = 1 ; I2C _DELAY;
if(bitCnt<7) temp <<= 1 ;
}
return(temp) ; }
/*~~~~~~~~~~~~~~~~~~~~~~~ API ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*----------------------------------------------------------------write some bytes to sequential address -----------------------------------------------------------------*/ void writeToROM(INT8U datum[], INT8U address, INT8U num) { bit tempbit ; INT8U i ; INT8U *datum_P ;
for(i=0; i<num; i++) {
*(datum_P+i) = readByte() ;
#ifndef INT8U #define INT8U unsigned char #endif
#ifndef INT8S #define INT8S signed char #endif
#ifndef INT16U #deff
#define I2C_DELAY; _nop_();_nop_();_nop_();_nop_();_nop_(); // >=4.7uS
datum_P = datum ;
I2C_Start() ;
writeByte(0xa0) ; tempbit = checkAck();
writeByte(address) ; tempbit = checkAck();
for(i=0; i<num; i++) { writeByte(*(datum_P+i)) ;
51单片机 IO 口模拟 IIC 总线协议
2008-01-13 15:01
I2C 总线是 Philips 公司提出的一种集成电路 IC 器件之间相连接的总线协 议,其目的是使电子系统(不只限于单片机系统)各个 IC 器件之间的连线变得 容易。因为使用传统的并行总线在 IC 器件之间连接,往往会使得 IC 之间连线较 多,显得非常复杂。而 I2C 总线则使 IC 器件之间只需 SDA、SCL 两条连线就可 以传送数据,因而十分方便。由于 I2C 在印刷体中不容易书写(需要上标),所 以实际书写时,还常见到 IIC、I2C 等书写方法,本文采用 IIC 的写法,敬请注 意。关于 IIC 总线的知识,请参阅相关书籍,此处不再做进一步介绍。
首先点击仿真按钮,系统没有什么反映,只有高低电平变化的颜色。我们 要想查看结果,还要用前文中仿真扩展 RAM 存储器的方法,先点击暂停,然后 点击“Debug”菜单下的“I2C Memory Internal Memory – U2”子菜单来打开 U2即 EEPROM 存储器24C02C 的内容窗口“I2C Memory Internal Memory – U2”,然 后我们就看到了其中的内容,也就是
I2C _DELAY;
SDA = 1; I2C _DELAY;
SCL = 1; I2C _DELAY;
}
//---------------------------------------------------------------// 0 = noACK; 1 = ACK ; //---------------------------------------------------------------bit checkAck() { bit tempbit; /*发送完一个字节后检验设备的应答信号 */ SDA = 1;
//---------------------------------------------------------------// delay 100us //---------------------------------------------------------------void mDelay(INT8U k) { INT16U i ;