I2C总线协议程序

合集下载

I2C总线协议及工作原理

I2C总线协议及工作原理

I2C总线协议及工作原理I2C总线协议及工作原理之巴公井开创作一、概述1、I2C总线只有两根双向信号线。

一根是数据线SDA,另一根是时钟线SCL。

SCL:上升沿将数据输入到每个EEPROM器件中;下降沿驱动EEPROM器件输出数据。

(边沿触发)SDA:双向数据线,为OD门,与其它任意数量的OD与OC门成"线与"关系。

I2C总线通过上拉电阻接正电源。

当总线空闲时,两根线均为高电平(SDL=1;SCL=1)。

连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系。

2、主设备与从设备系统中的所有外围器件都具有一个7位的"从器件专用地址码",其中高4位为器件类型,由生产厂家制定,低3位为器件引脚定义地址,由使用者定义。

主控器件通过地址码建立多机通信的机制,因此I2C总线省去了外围器件的片选线,这样无论总线上挂接多少个器件,其系统仍然为简约的二线结构。

终端挂载在总线上,有主端和从端之分,主端必须是带有CPU的逻辑模块,在同一总线上同一时刻使能有一个主端,可以有多个从端,从端的数量受地址空间和总线的最大电容 400pF的限制。

主端主要用来驱动SCL line;从设备对主设备发生响应;二者都可以传输数据,但是从设备不克不及发起传输,且传输是受到主设备控制的。

二、协议1.空闲状态I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。

此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

2.起始位与停止位的定义:起始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,而不是一个电平信号。

停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。

起始和终止信号都是由主机发出的,在起始信号发生后,总线就处于被占用的状态;在终止信号发生后,总线就处于空闲状态。

实验八 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来记录单片机复位或者开机的次数,并将复位或者开机的次数显示在数码管上。

I2C协议—24C08读写操作源程序

I2C协议—24C08读写操作源程序
clock();
i=readx();
stop();
delay1(10);
return(i);
}
//////向24c02的address地址中写入一字节数据info/////
void x24c08_write(unsigned char address,unsigned char info)
{
unsigned char i,j,k=0;
scl=0;
flash();
sda=1;
for (i=0;i<8;i++)
{
flash();
scl=1;
flash();
if (sda==1) j=1;
else j=0;
k=(k<<1)|j;
scl=0;
}
flash();
scl=0;
flash();
}
void stop() //停止I2C总线
{
sda=0;
flash();
scl=1;
flash();
sda=1;
flash();
}
void writex(unsigned char j) //写一个字节
{
unsigned char i,temp;
unsigned char x24c08_read(unsigned char address)
{
unsigned char i;
start();
writex(0xa0);
clock();
writex(address);
clock();

I2C总线协议AT24c02程序

I2C总线协议AT24c02程序

I2C总线协议(AT24c02)程序主:STC89C54从:AT24C02电路图时序图下面是代码#include ;#define uchar unsigned char#define addr_x 0xae//写#define addr_d 0xaf//读sbit sda = P2^1;//数据管脚sbit scl = P2^0;//时钟管脚bit ack;void DelayUs2x(unsigned char t)//延时1{while(--t);}void DelayMs(unsigned char t)//延时2{ while(t--){ //大致延时1mS DelayUs2x(245); DelayUs2x(245);}}void delay() //延时大于4μs{;;}void i2_qs()//起始信号{sda = 1;//拉高数据scl = 1;//拉高时钟delay();//延时大于 4μssda =0;//拉低数据产生起始信号(下降沿)delay();//延时大于 4μsscl = 0;//拉低时钟delay();//延时大于4μs}void i2_tz()//停止信号{sda = 0;//拉低数据scl = 1;//拉高时钟delay();//延时大于 4μssda = 1;//拉高时钟产生结束信号(上升沿)delay();//延时大于4μs}void i2_ack(bit _ack)//入口产生 0 ack 1nak{sda = _ack;//ack或者nakscl = 1;//拉高时钟delay();//延时大于 4μsscl = 0;//拉低时钟delay();//延时大于 4μs}void i2_fs(uchar Data) //发送8位数据{uchar i;for(i=0;i<8;i++)//8位计数{Data <<= 1;//把最高位移送到进制标志位中(CY)sda = CY;//把进制位中的数据赋值给数据线scl = 1;//拉高时钟delay();//延时大于 4μsscl = 0;//拉低时钟//这里}//下面代码是接收ACK的代码delay();//延时大于4μssda = 1;//拉高数据准备接收ACKscl = 1;//拉高时钟产生稳定的有效的数据(相对的)if(sda==1)//确认接收的是ACK还是NAKack = 0;//ackelseack = 1;//nakscl = 0;//拉低时钟delay();//延时大于 4us}uchari2_js()//接收8位数据{uchar i,Data = 0;sda = 1;//使能内部上拉,准备读取数据for(i=0;i<8;i++)//8位计数器{Data <<= 1;//移出数据的最高位scl = 1;//拉高时钟delay();//延时大于 4usData |= sda;//接收数据scl = 0;//拉低时钟delay();//延时大于 4us}return Data;}void i2_sj_x(uchar addr,uchar Data)//往设备内写入数据(参数 1、寄存器地址 2、写入的数据){i2_qs();//起始信号i2_fs(addr_x);//设备地址+写信号i2_fs(addr);//寄存器内部地址i2_fs(Data);//写入设备的数据i2_tz();//停止信号}uchar i2_sj_d(uchar addr)//读取数据(参数寄存器地址){ucharData;i2_qs();//起始信号i2_fs(addr_x);//设备地址+写信号i2_fs(addr);//寄存器内部地址i2_qs();//起始信号i2_fs(addr_d);//设备地址+读信号Data =i2_js();//读取数据i2_ack(0);//ACK应答i2_tz();//停止信号return Data;//返回读取的数据}voidmain(void){uchar dat;i2_sj_x(3,0x0f); //数据写入24c02DelayMs(50);dat = i2_sj_d(3); //从24c02中读取数据P1 = dat;//使用8个LED显示读出的数据while(1){;}}以上代码只是简单的实现I2C总线的读写。

I2C通信原理及程序详细讲解

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

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总线读写程序通用

//==========================头文件加载===============================#include <reg52.h> //加载52系列单片机头文件//===========================端口声明================================sbit CLK=P3^6; //74hc574时钟信号线sbit G=P2^4; //74hc574使能sbit IIC_SDA=P2^6; //声明IIC总线的数据线接在单片机的P2。

5端口。

sbit IIC_SCL=P2^5; //声明IIC总线的时钟线接在单片机的P2。

7端口。

unsigned char tabl[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0BF,0x8C};//0,1,2,3,4,5,6,7,8,9,-,P//===========================函数声明================================ void display(unsigned char aa);void delay(unsigned int t);void delay_IIC(void);void IIC_Init(void);void IIC_start(void);void IIC_stop(void);bit IIC_Tack(void);void IIC_single_byte_write(unsigned char Daddr,unsigned char Waddr,unsigned char Data);unsigned char IIC_single_byte_read(unsigned char Daddr,unsigned char Waddr);void IIC_write_byte(unsigned char Data);unsigned char IIC_read_byte(void);//============================主函数================================= void main() //主函数{unsigned char Data=2,addr=0x01;//—-——-—--—————————-——--————-系统初始化——-—-—--—-—-—————-—---———-IIC_Init();//初始化IIC总线。

杰理iic程序讲解

杰理iic程序讲解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

C程序代码]I2C总线协议程序
程序代码 2009-10-11 14:05 阅读48 评论0
/****************************************************************
I2C总线协议程序
****************************************************************/
#define NOP {_nop_();_nop_();_nop_();_nop_();}
sbit SDA=P1^2; /*模拟I2C数据传送位*/
sbit SCL=P1^3; /*模拟I2C时钟控制位*/
bit ack; /*应答标志位*/
void Start_I2c()
{
SDA=1; NOP;
SCL=1; NOP;
SDA=0; NOP;
SCL=0; NOP;
}
void Stop_I2c()
{
SDA=0; NOP;
SCL=1; NOP;
SDA=1; NOP;
}
void Senduchar(uchar c)
{
uchar i;
for(i=0;i<8;i++)
{
c<<=1;
SDA=CY; NOP;
SCL=1; NOP;
SCL=0; NOP;
}
SDA=1; NOP;
SCL=1; NOP;
if(SDA==1) ack=0;
else ack=1;
SCL=0; NOP;
}
uchar Rcvuchar()
{
uchar i,x=0;
SDA=1;
for(i=0;i<8;i++)
{
SCL=0; NOP;
SCL=1; NOP;
x=x<<1;
if(SDA) x=x+1;
NOP;
}
SCL=0; NOP;
return(x);
}
void Ack_I2c(bit a)
{
SDA=a; NOP;
SCL=1; NOP;
SCL=0; NOP;
}
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
Start_I2c(); /*启动总线*/
Senduchar(sla); /*发送器件地址*/
if(ack==0)return(0);
Senduchar(suba); /*发送器件子地址*/
if(ack==0)return(0);
for(i=0;i<no;i++)
{
Senduchar(*s); /*发送数据*/
if(ack==0)return(0);
s++;
}
Stop_I2c(); /*结束总线*/
return(1);
}
bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
Start_I2c(); /*启动总线*/
Senduchar(sla); /*发送器件地址*/
if(ack==0)return(0);
Senduchar(suba); /*发送器件子地址*/
if(ack==0)return(0);
Start_I2c();
Senduchar(sla+1);
if(ack==0)return(0);
for(i=0;i<no-1;i++)
{
*s=Rcvuchar(); /*发送数据*/
Ack_I2c(0); /*发送就答位*/
s++;
}
*s=Rcvuchar();
Ack_I2c(1); /*发送非应位*/
Stop_I2c(); /*结束总线*/
return(1);
}。

相关文档
最新文档