学习笔记——IIC总线

学习笔记——IIC总线

IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、 IC 与 IC 之间进行双向传送, 高速 IIC 总线一般可达 400kbps 以上。

IIC简介

IIC 总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号: SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。
结束信号: SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。

应答信号:接收数据的 IC 在接收到 8bit 数据后,向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据。 CPU 向受控单元发出一个信号后,等待受控单元发出一个应答信号, CPU 接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

IIC时序图

IIC总线时序图

每个接到I2C总线上的器件都有唯一的地址。主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发送器。由总线上接收数据的器件则为接收器。

数据传送格式

(1)字节传送与应答

每一个字节必须保证是8位长度。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有9位)。
一个字节的传输时序

(2)数据帧格式

IIC总线上传送的数据信号是广义的,既包括地址信号,又包括真正的数据信号。
在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据(R)。每次数据传送总是由主机产生的终止信号结束。但是,若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一从机进行寻址。
在总线的一次数据传送过程中,可以有以下几种组合方式:

a、主机向从机发送数据,数据传送方向在整个传送过程中不变:


注:有阴影部分表示数据由主机向从机传送,无阴影部分则表示数据由从机向主机传送。
A表示应答, A非表示非应答(高电平)。S表示起始信号,P表示终止信号。

b、主机在第一个字节后,立即从从机读数据

c、在传送过程中,当需要改变传送方向时,起始信号和从机地址都被重复产生一次,但两次读/写方向位正好反相。

代码介绍

开始信号

void I2cStart()
{
SDA=1;    //先置SDA为高
Delay10us();   
SCL=1;     //在SCL为高的情况下
Delay10us();//在这里延时时间>4.7us
SDA=0;     //SDA由高变为地
Delay10us();//在这里延时时间>4us
SCL=0;			
Delay10us();		
}

结束信号

void I2cStop()
{
SDA=0;    //先置SDA为低

Delay10us();
SCL=1;   //在SCL为高的情况下
Delay10us();//在这里延时时间?>4.7us
SDA=1;   //SDA由低变为高
Delay10us();		
}

发送一个字节

unsigned char I2cSendByte(unsigned char dat)
{
unsigned char a=0,b=0;//最大255,一个机器周期1us,最大延时255US
for(a=0;a<8;a++)//发送8位且从最高位开始
	{
	SDA=dat>>7;	//SDA得到最高位,起始信号时已拉低SCL
	dat=dat<<1;
	Delay10us();
	SCL=1;
	Delay10us();//SCL由低变为高且延时>4.7us,使SDA得到的数据发送
	SCL=0;
	Delay10us();//	延时时间>4us
  }
SDA=1;
Delay10us();
SCL=1;
while(SDA)//等待从机应答即拉低SDA
{
	b++;
	if(b>200)	 //超过2000us即为发送失败或者无应答
	{
		SCL=0;
		Delay10us();
		return 0;   //发送失败
	}
}
SCL=0;
Delay10us();
return 1;		  //发送成功
}

读取字节

unsigned char I2cReadByte()
{
unsigned char a=0,dat=0;
SDA=1;			//起始发送后SDA均为低电平
Delay10us();
for(a=0;a<8;a++)
{
	SCL=1;    //SCL为高电平时读取1位
	Delay10us();
	dat<<=1;   
	dat|=SDA;
	Delay10us();
	SCL=0;
	Delay10us();
}
return dat;		
}

EEPROM

EEPROM (Electrically Erasable Programmable read only memory),带电可擦可编程只读存储器–一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用。
不同的从机有着不同的读写规则,这次学习的是AT24C02存储器
EEPROM原理图
AT24C02引脚说明

往AT24C02中某个内存地址写入一个数据
void At24c02Write(unsigned char addr,unsigned char dat)
{
I2cStart();
I2cSendByte(0xa0);//发送写器件地址(前七位),最后一位代表读或者写
I2cSendByte(addr);//发送要写入的内存地址
I2cSendByte(dat); //发送数据
I2cStop();
}
从AT24C02中某个内存地址读取一个数据
unsigned char At24c02Read(unsigned char addr)
{
unsigned char num;
I2cStart();
I2cSendByte(0xa0); //发送写器件地址
I2cSendByte(addr); //发送要读取的内存地址
I2cStart(); //每次读写反向反转时都需要再给一个起始信号
I2cSendByte(0xa1); //发送读器件地址
num=I2cReadByte(); //读取数据
I2cStop();
return num;
}

猜你喜欢

转载自blog.csdn.net/qq_43413381/article/details/83246348