IIC总线协议程序

合集下载

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读写程序的详细讲解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协议详解
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通信协议

实验八 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总线协议-基于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总线协议及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】

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从机流程
IIC(Inter-IntegratedCircuit)是一种串行通信总线协议,可用于连接多个从设备和一个主设备。

IIC从机流程如下:
1. 从机地址匹配:当主设备发送帧时,帧中包含从机地址和读写位。

从机需要与帧中的从机地址匹配,才会响应主设备的请求。

2. 数据传输:当地址匹配成功后,主设备会发送数据或命令给从机。

从机接收到数据或命令后,按照主设备的要求进行处理,然后将处理结果返回给主设备。

3. 响应主设备:从机接收到主设备的请求后,需要及时响应。

响应有两种方式:ACK(应答)和NACK(非应答)。

如果从机成功接收到数据或命令,会返回ACK;如果从机不能接收或处理数据或命令,会返回NACK。

4. 结束传输:当主设备和从机都完成数据传输后,需要结束传输。

主设备会发送停止条件,表示传输结束。

从机接收到停止条件后,将结束传输。

以上就是IIC从机流程的基本步骤。

从机需要按照这个流程与主设备进行通信,保证通信的顺畅和可靠。

- 1 -。

iic协议代码

iic协议代码

iic协议代码IIC协议,也称为I2C协议或IIC,是一种用于连接低速外围设备的串行通信总线。

它是由飞利浦公司(现在的恩智浦半导体)在1980年代早期为了让主板、嵌入式系统或手机中的芯片之间能通过少量的引脚进行通信而开发的。

IIC协议的代码通常指的是实现IIC通信协议的软件或固件代码。

在不同的编程环境和应用中,实现IIC协议的细节可能会有所不同。

下面是一个非常基础的伪代码示例,展示了如何实现一个简单的IIC通信过程:```python# 假设我们有一个IIC通信类class IICCommunication:def __init__(self, sda_pin, scl_pin):self.sda_pin = sda_pinself.scl_pin = scl_pin# 初始化IIC引脚为输入模式pinMode(sda_pin, INPUT)pinMode(scl_pin, INPUT)# 初始化其他必要的变量def start(self):# 发送起始条件digitalWrite(self.sda_pin, HIGH)digitalWrite(self.scl_pin, HIGH)# 等待时钟线变为低电平while digitalRead(self.scl_pin) == HIGH:pass# 设置SDA为低电平,表示开始条件digitalWrite(self.sda_pin, LOW)def send_byte(self, byte):# 发送一个字节for i in range(8):# 发送位bit = byte & 0x01# 设置SDA线digitalWrite(self.sda_pin, bit)# 等待时钟线变为低电平while digitalRead(self.scl_pin) == HIGH:passbyte >>= 1# 发送ACK位(应答位)digitalWrite(self.sda_pin, LOW)def read_byte(self):# 读取一个字节byte = 0for i in range(8):byte <<= 1# 等待时钟线变为低电平while digitalRead(self.scl_pin) == HIGH:pass# 读取SDA线状态bit = digitalRead(self.sda_pin)byte |= bit# 发送ACK位digitalWrite(self.sda_pin, LOW)return bytedef stop(self):# 发送停止条件digitalWrite(self.sda_pin, LOW)digitalWrite(self.scl_pin, LOW)# 等待时钟线变为高电平while digitalRead(self.scl_pin) == LOW:passdigitalWrite(self.sda_pin, HIGH)# 使用IICCommunication类进行通信iic = IICCommunication(D2, D1) # 假设D2和D1是控制SDA和SCL的GPIO引脚iic.start()iic.send_byte(0x55) # 发送设备地址# 接收应答ack = iic.read_byte()if ack == 0: # 如果接收到ACK,继续通信iic.send_byte(0x00) # 发送命令或数据data = iic.read_byte() # 读取数据# ...处理数据...iic.stop()```请注意,这只是一个示例,实际代码实现会依赖于具体的硬件和软件环境。

iic协议格式

iic协议格式

iic协议格式
【最新版】
目录
1.IIC 协议简介
2.IIC 协议的基本组成部分
3.IIC 协议的数据传输方式
4.IIC 协议的优点和应用场景
正文
I.IIC 协议简介
I2C(Inter-Integrated Circuit)协议,又称为 I2C 总线,是一种串行通信协议,它是由 Philips 公司在 1980 年代开发的。

I2C 协议主要用于低速度、短距离的双向通信,特别适合于连接微处理器和外围设备,如存储器、传感器、LCD 驱动器等。

II.IIC 协议的基本组成部分
I2C 协议的基本组成部分包括:
1.主设备(Master):主设备是 I2C 总线上的控制设备,它发起通信,生成时钟信号,并控制数据传输。

2.从设备(Slave):从设备是 I2C 总线上的被控制设备,它响应主设备的通信请求,提供数据或接收数据。

3.总线(Bus):I2C 协议的数据传输通过两根信号线完成,分别是数据线(SDA)和时钟线(SCL)。

III.IIC 协议的数据传输方式
I2C 协议采用多主设备、仲裁通信的方式进行数据传输。

当多个主设备连接到同一总线上时,它们可以通过地址(Address)和数据(Data)
两条信号线进行通信。

I2C 协议支持插拔功能,即设备可以在系统运行过程中连接或断开。

IV.IIC 协议的优点和应用场景
I2C 协议具有以下优点:
1.支持多主设备,便于扩展和灵活配置;
2.通信速率较低,适合低速通信场景;
3.硬件接口简单,成本较低;
4.支持插拔功能,便于设备维护和升级。

I2C 协议广泛应用于嵌入式系统、物联网、智能家居等领域。

iic从机代码例程

iic从机代码例程

iic从机代码例程全文共四篇示例,供读者参考第一篇示例:IIC,全称为Inter-Integrated Circuit,是一种常见的串行通信协议,用于在电子设备之间进行数据传输。

在很多电子产品中,IIC总线被广泛应用,比如各种传感器、存储器芯片、显示屏等等。

IIC总线有两种设备,即主机和从机,主机负责控制总线上的通信,而从机则被动地响应主机的命令。

在本文中,我们将重点讨论IIC从机代码例程的制作。

从机代码是指实现IIC通信协议的一组程序,用于从机设备与主机设备进行数据传输。

在制作IIC从机代码例程时,需要考虑一系列因素,包括从机设备的特性、通信协议的格式、数据传输的安全性等等。

制作IIC从机代码例程需要了解从机设备的硬件特性。

不同的从机设备在硬件上有不同的接口结构和通信要求,因此需要根据具体的从机设备来编写相应的代码。

通常来说,从机设备会有一个IIC接口或是IIC引脚,通过这个接口来进行数据传输。

在编写从机代码例程时,需要注意从机设备的接口类型、通信速率、寄存器地址等硬件相关的信息。

制作IIC从机代码例程需要了解通信协议的格式。

IIC通信协议有以下几个重要的部分:起始信号、地址和数据传输、应答位、停止信号。

在编写从机代码时,需要按照这个格式来进行通信。

起始信号是一个特定的电平变化,表示通信的开始;地址和数据传输是主机向从机发送命令或数据;应答位是从机设备返回的一个应答信号,表示是否成功接收数据;停止信号是一个特定的电平变化,表示通信的结束。

制作IIC从机代码例程需要考虑数据传输的安全性。

在IIC通信中,数据的正确传输是非常重要的。

为了确保数据的安全性,可以采用一些校验方法,比如CRC校验。

CRC校验是一种通过计算数据的校验和来检测数据是否传输正确的方法,可以有效减少数据传输错误的概率。

在编写从机代码时,可以加入CRC校验功能,以提高数据传输的可靠性。

制作IIC从机代码例程是一项涉及硬件、协议和安全性的复杂任务。

iic标准程序

iic标准程序

IIC(Inter-Integrated Circuit)是一种串行通信协议,用于连接微控制器、传感器、存储器和其他外围设备。

以下是IIC标准程序的示例代码,用于在微控制器和外围设备之间进行通信:#include <stdio.h>#include <stdint.h>#include <unistd.h>#include <fcntl.h>#include <sys/ioctl.h>#include <linux/i2c-dev.h>int main(){int file;char *filename = "/dev/i2c-1"; // I2C bus 1 的设备文件路径uint8_t address = 0x50; // I2C 设备的地址char *buffer = malloc(2); // 用于存储从I2C 设备读取的数据的缓冲区// 打开I2C 总线设备文件file = open(filename, O_RDWR);if (file < 0) {perror("Failed to open i2c bus");return -1;}// 设置I2C 总线设备的地址和速率if (ioctl(file, I2C_SLAVE, address) < 0) {perror("Failed to acquire bus access and/or talk to slave");return -1;}// 向I2C 设备写入数据buffer[0] = 0x01; // 要写入的数据的第一个字节buffer[1] = 0x0A; // 要写入的数据的第二个字节int n = write(file, buffer, 2); // 将数据写入I2C 设备if (n < 1) {perror("Write failed");return -1;}// 从I2C 设备读取数据n = read(file, buffer, 1); // 从I2C 设备读取一个字节的数据到缓冲区中if (n < 1) {perror("Read failed");return -1;}printf("Read data: %x\n", buffer[0]); // 打印读取的数据的十六进制表示形式// 关闭I2C 总线设备文件close(file);free(buffer);return 0;}以上代码使用了Linux下的I2C-dev驱动,需要包含`<linux/i2c-dev.h>`头文件。

vivad sdk iic例程

vivad sdk iic例程

Vivado SDK I2C例程一、简介Vivado SDK 是由Xilinx提供的一款灵活且功能强大的开发套件,便于集成和调试Xilinx 器件的应用程序。

I2C(Inter-Integrated Circuit,简称IIC)是一种高效的低速通信总线协议,有两个管脚,分别是 SDA 和 SCL,可用于两个电路板之间的连接,在很多物联网的硬件开发和软件调试中有着重要作用,本文主要介绍 Vivado SDK 中I2C例程的基本使用。

二、环境搭建1. Vivado 的安装和注册Vivado SDK(Software Development Kit)是 Xilinx 提供的一款灵活且功能强大的开发套件,用户可以在 Vivado 注册页面进行 Vivado 的下载和安装,安装过程非常简单,只需按照它的提示依次点击即可完成。

2.Vivado SDK 的配置Vivado SDK 集成了 Xilinx 硬件驱动程序,可以直接和系统中的硬件设备进行通信,而在开发之前首先需要配置 Vivado SDK,用户可以在 File->Project Settings->Project Settings 选项卡中设置项目 board support package 以及项目的运行选项。

三、I2C例程运行1.参数设置I2C例程需要设置 SDA 和 SCL 的引脚号,以及 I2C 的时钟频率等参数,可以通过在Vivado SDK 中打开 I2C IP 核,在 Parameter 选项卡中进行设置,也可以在 C 代码的定义处进行设置。

2.I2C代码编写编写完 I2C 的参数设置之后,就可以在 Vivado SDK 中编写 I2C 代码。

I2C 代码的编写主要包括 I2C 初始化的函数,数据发送和读取的函数,以及其他相关函数,例如延时函数等。

3.程序烧写在 I2C 代码编写完成之后,就可以将代码烧录到 Xilinx 芯片中,烧录前需要编译代码,编译完成之后就可以在 Program Device 选项卡中烧录代码。

杰理iic程序讲解

杰理iic程序讲解

杰理iic程序讲解全文共四篇示例,供读者参考第一篇示例:杰理IIC程序讲解杰理IIC(Inter-Integrated Circuit)是一种用于在芯片之间或者与外部设备之间进行通信的串行通信协议。

它是由飞思卡尔公司(Freescale Semiconductor)推出的一种新型通信协议,设计用来解决传输速度慢、带宽窄的问题。

杰理IIC协议具有高速传输、简单硬件接口和多设备连接的特点,因此被广泛应用于各种电子设备当中。

杰理IIC协议的工作原理非常简单,它使用两条线路来进行通信:一条是串行数据线(SDA),另一条是串行时钟线(SCL)。

在通信过程中,SCL线由主设备负责产生时钟信号,SDA线用于传输数据。

在开始通信前,主设备发送一个开始信号,然后发送设备地址和数据,接收设备在正确接收数据后发送一个应答信号。

通信完成后,主设备发送停止信号,结束通信。

在杰理IIC通信中,每个设备都有一个唯一的7位地址,用来标识设备的身份。

主设备可以向多个从设备发送数据,也可以从多个从设备接收数据。

通信过程中,主设备和从设备之间需要按照一定的协议进行数据交换,确保数据的正确传输。

杰理IIC协议还包括了高速模式、扩展地址模式和多主模式等扩展功能,可以满足不同应用场景的需求。

为了方便开发人员使用杰理IIC协议进行通信,飞思卡尔公司提供了一套完整的软件库和开发工具,可以帮助开发人员快速上手并实现各种功能。

开发人员只需要根据自己的需求编写相应的程序代码,就可以实现各种复杂的通信功能。

下面我们来讲解一下如何使用杰理IIC 软件库进行开发。

开发人员需要下载并安装杰理IIC软件库和开发工具,飞思卡尔公司官网提供了相应的软件包和文档。

安装完成后,开发人员需要按照文档中的说明配置开发环境,并连接目标设备到开发环墵。

接下来,开发人员可以使用开发工具打开一个新的工程,并选择杰理IIC协议。

在工程中添加必要的源文件和头文件,并进行相应的配置。

IIC协议详解-基于AT24CXX详细编程

IIC协议详解-基于AT24CXX详细编程

{
u8 t;
u32 temp=0;
for( t=0; t<Len; t++ )
{
temp<<=8;
temp+ = AT24CXX_ReadOneByte ( ReadAddr+ Len – t - 1 );
} return temp; }
4).写入时序:
//在 AT24CXX 指定地址写入一个数据
//WriteAddr :写入数据的目的地址 //DataToWrite:要写入的数据
void AT24CXX_WriteOneByte( u16 WriteAddr, u8 DataToWrite )
{
IIC_Start();
//首先开始信号
delay_us(2);
//对 TEA5767 这三个延时都是必须的
IIC_SCL=1;
//发送数据
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
}
8.读取一个字符
每次程序的开始都默认 SCL=0,因此程序最后要将 SCL=0
SCL 高电平期间才可以读数据
//读 1 个字节,ack=1 时,发送 ACK,ack=0,发送 nACK
二、AT24C02 读写时间周期
三、I2C 总线协议 1、只有在总线空闲时才允许启动数据传送; 2、在数据传送过程中,当 SCL=1 时,数据线 SDA 必须保持稳定状态,不 允许有跳变;SCL=1 时,数据线 SDA 的任何电平变化将被看作总线的起始 或停止信号;
AT24C02 程序设计
1.开始信号:
//sda 线输出
注意:SCL=1 时, SDA 线不能有变化, 有变化被视为开始或停止

如何对AT24C02编写驱动程序——IIC总线协议

如何对AT24C02编写驱动程序——IIC总线协议

如何对AT24C02编写驱动程序——IIC总线协议AT24C02是一种2Kbit(256字节)的串行EEPROM芯片,采用I2C总线协议进行通信。

编写AT24C02的驱动程序需要了解I2C总线协议的工作原理以及AT24C02的读写操作。

以下是编写AT24C02驱动程序的步骤:1. 硬件配置:首先,需要在单片机上配置I2C总线的硬件连接。

I2C 总线需要两根信号线,即SDA(Serial Data Line)和SCL(Serial Clock Line)。

将SDA和SCL引脚连接到AT24C02的对应引脚,并通过上拉电阻将其拉高。

2.初始化I2C总线:在驱动程序中,需要初始化I2C总线的相关寄存器和配置参数。

这包括设置I2C总线的通信速率、使能I2C模块、使能中断等。

3.开始信号和设备地址:发送开始信号START,然后发送AT24C02的设备地址,设备地址由3位固定的值和一个读/写位组成。

读写位为0代表写操作,为1代表读操作。

4.发送数据:如果是写操作,发送要写入的数据到AT24C02的指定地址。

数据写入时,需要注意AT24C02的内存地址范围,以及页写操作的限制。

如果是读操作,发送读取的目标地址。

5.停止信号:传输完成后,发送停止信号STOP,结束通信。

6.延时和轮询:在I2C总线通信中,需要一定的延时等待数据传输完成。

在写入大量数据或读取数据时,还需要轮询等待操作完成。

7.错误处理:在驱动程序中,需要考虑到可能发生的错误和异常情况。

例如,设备地址未响应、通信超时、数据传输错误等,都需要进行相应的错误处理。

8.封装函数接口:为了方便上层应用调用,可以将上述操作封装成函数接口。

例如,提供读写函数、擦除函数和查询设备ID的函数等。

除了以上的驱动程序,还可以根据实际需求进行功能扩展。

例如,可以实现批量写入数据、随机读取数据、擦除操作等。

总之,编写AT24C02的驱动程序主要包括硬件配置、初始化I2C总线、发送开始信号和设备地址、发送数据、发送停止信号、延时和轮询、错误处理等步骤。

IIC通信协议

IIC通信协议

IIC通信协议协议名称:IIC通信协议一、引言IIC通信协议是指基于I2C(Inter-Integrated Circuit)总线的通信协议,用于在数字系统中实现不同设备之间的数据传输和通信。

本协议旨在规范IIC通信的硬件连接、通信协议、数据传输格式等方面的要求,以确保设备之间的数据交换和通信的可靠性和稳定性。

二、术语定义1. IIC总线:一种串行通信总线,由两根线组成,即SDA(Serial Data Line)和SCL(Serial Clock Line)。

2. 主设备:通过IIC总线控制和管理其他设备的设备。

3. 从设备:通过IIC总线接收主设备的控制和管理的设备。

4. 起始条件:在IIC总线上,主设备将SDA线从高电平拉低,同时将SCL线从高电平拉低。

5. 停止条件:在IIC总线上,主设备将SDA线从低电平拉高,同时将SCL线从低电平拉高。

6. 读操作:主设备从从设备读取数据的操作。

7. 写操作:主设备向从设备发送数据的操作。

三、硬件连接要求1. IIC总线的物理连接应满足以下要求:a. SDA线和SCL线应连接到主设备和从设备的对应引脚上。

b. SDA线和SCL线应通过适当的电平转换电路连接到主设备和从设备的供电电源上,以确保电平兼容性。

c. IIC总线上的每个设备应具有唯一的IIC地址,以便主设备能够正确地识别和寻址从设备。

四、通信协议要求1. 起始条件和停止条件:a. 主设备在发起通信前,应发送起始条件。

b. 主设备在通信结束后,应发送停止条件。

2. 通信速率:通信速率应根据具体应用需求进行设置,但不得超过IIC总线的最大传输速率。

3. 读操作:a. 主设备向从设备发送读命令,并等待从设备的响应。

b. 从设备在接收到读命令后,将数据发送到SDA线上供主设备读取。

c. 主设备在接收完数据后,发送一个ACK(Acknowledge)信号给从设备,表示数据接收成功。

d. 如需继续读取数据,主设备继续发送读命令,从设备继续发送数据。

IIC总线协议及应用

IIC总线协议及应用

IIC总线协议及应用IIC(Inter-Integrated Circuit)总线协议是一种广泛应用于数字电路中的串行通信协议。

它由Philips公司在20世纪80年代初提出,今天已成为一种通用的数字串行通信接口。

IIC总线协议具有简单、高效、容错性好等优点,被广泛应用于各种设备之间的通信,特别是在集成电路中的设备之间。

IIC总线协议使用两根信号线来进行通信,即数据线(SDA)和时钟线(SCL)。

SDA线用于发送和接收数据,而SCL线用于同步数据传输的时钟信号。

总线上传输的数据被分为地址和数据两部分,地址部分用于指定设备或寄存器,数据部分用来进行数据传输。

IIC总线协议支持多主机和多从机的通信方式。

IIC总线协议可以广泛应用于各种数字设备的通信。

首先,它可以用于存储器和外围设备之间的通信。

比如,存储器芯片可以通过IIC总线协议与微处理器进行通信,以实现数据的读取和写入。

其次,IIC总线协议也常用于各种传感器和控制器之间的通信。

例如,温度传感器可以通过IIC总线协议将测量结果传输给微控制器,然后进行相应的控制。

此外,IIC总线协议还可以应用于各种外围设备之间的通信。

比如,多个数字设备可以通过IIC总线协议进行通信,实现多个设备之间的数据交换和共享。

此外,IIC总线协议还可以用于系统调试和配置。

在系统调试中,可以通过IIC总线协议实现对系统的监测和调试。

在系统配置中,可以通过IIC总线协议来配置各种设备的参数和功能。

在IIC总线协议的应用中,通常需要定义各个设备之间的通信协议和通信地址。

通信协议定义了数据的传输格式和传输规则,而通信地址用于标识和寻址各个设备。

在实际应用中,通常会使用控制器和驱动器来实现IIC总线协议的通信功能。

控制器负责协议的处理和控制,而驱动器负责数据的发送和接收。

控制器和驱动器可以是硬件实现,也可以是软件实现。

总之,IIC总线协议是一种广泛应用于数字电路中的串行通信协议。

它具有简单、高效、容错性好等优点,被广泛应用于各种设备之间的通信。

iic 标准通信时序

iic 标准通信时序

iic 标准通信时序
IIC通信协议的时序分为四个阶段:开始信号、地址字节、数据字节和停止信号。

1. 开始信号:主设备通过拉低数据线(SDA)时钟线(SCL)仍为高电平来发送开始信号。

此时,从设备需准备好接收数据,并等待地址字节的到来。

2. 地址字节:主设备发送一个地址字节到从设备以确定通信对象。

地址字节的高七位是设备的地址,最低一位是读写控制位,通常为0表示写操作,1表示读操作。

此时,从设备会检查其地址是否与发送的地址字节匹配。

3. 数据字节:主设备和从设备之间的数据传输是通过数据字节来完成的。

主设备发送数据字节,从设备接收数据字节。

数据的传输是以字节为单位的,每个数据字节传输后都会有一个应答信号。

4. 停止信号:主设备发送停止信号作为传输的结束。

iic工作原理

iic工作原理

iic工作原理IIC工作原理IIC(Inter-Integrated Circuit)是一种串行通信协议,也被称为I2C(Inter-IC)总线。

它是由飞利浦公司(现在的恩智浦半导体公司)在1982年开发的,用于在芯片之间进行通信。

IIC总线是一种双向、串行、同步通信协议,可以连接多个设备,具有简单、灵活、可靠的特点,被广泛应用于各种电子设备中。

IIC总线的工作原理IIC总线由两根线组成:串行数据线(SDA)和串行时钟线(SCL)。

SDA线用于传输数据,SCL线用于传输时钟信号。

IIC总线上的每个设备都有一个唯一的地址,用于在总线上识别设备。

IIC总线上的通信是由主设备控制的,主设备可以是微控制器、DSP、FPGA等。

从设备可以是各种芯片,如传感器、存储器、显示器等。

IIC总线的通信分为两种模式:传输模式和地址模式。

在传输模式下,主设备向从设备发送数据或从设备向主设备发送数据。

在地址模式下,主设备向从设备发送地址,以选择要通信的从设备。

在IIC总线上,数据的传输是通过时钟信号来同步的。

主设备产生时钟信号,从设备根据时钟信号来接收或发送数据。

时钟信号的频率由主设备控制,可以根据需要进行调整。

在传输数据时,主设备先发送起始信号,然后发送设备地址和读写位,从设备接收到地址后,会发送应答信号。

主设备接收到应答信号后,就可以开始发送数据或接收数据了。

在传输数据的过程中,主设备会发送一个停止信号,表示传输结束。

IIC总线的优点IIC总线具有以下优点:1. 简单:IIC总线只需要两根线就可以实现多个设备之间的通信,非常简单。

2. 灵活:IIC总线可以连接多个设备,可以根据需要进行扩展。

3. 可靠:IIC总线采用同步通信方式,可以保证数据的可靠传输。

4. 低功耗:IIC总线的传输速度较慢,功耗较低。

IIC总线的应用IIC总线被广泛应用于各种电子设备中,如传感器、存储器、显示器等。

以下是一些常见的应用场景:1. 温度传感器:温度传感器可以通过IIC总线向主设备发送温度数据,主设备可以根据温度数据来控制其他设备的工作状态。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
SCL = 1; I2C _DELAY;
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 ;
相关文档
最新文档