I2C协议

目录

I2C协议

E2PROM  AT24C02

I2C协议

假设主设备想要向从设备 发送 数据:
1. 主发送器发送 START 条件并寻址从接收器
2. 主发送器将数据发送到从接收器
3. 主发送器以 STOP 条件终止传输
如果主设备想要从从设备 接收 /读取数据:
1. 主发送器发送 START 条件并寻址从接收器
2. 主接收器发送请求读取的寄存器
3. 主接收器从从发送器接收数据
4. 主发送器以 STOP 条件终止传输
SCL:串行时钟
SDA:串行数据线
启动和停止条件:
与主设备的 I2C 通信由主设备发送 START 条件启动,并由主设备发送 STOP 条件终止。 当SCL为高电平时,SDA线上由高到低的转换定义了START条件。 当SCL为高电平时,SDA线上由低到高的转换定义了STOP条件。
I2C协议_第1张图片

一个字节由SDA线上的8位组成,数据首先传输最高位(MSB),SDA线上的数据必须在时钟周期的高电平期间保持稳定,因为当SCL为高电平时数据线的变化被解释为控制命令(START或STOP)。要在SCL是高电平前操作SDA。

PB6  PB7引脚。

总结:

时钟信号SCL为高时,SDA必须保持稳定,SCL为低时,SDA才可以变化。

写数据时:SCL为低时,改变SDA。

读数据时:SCL为高时,读取IO电平。

E2PROM  AT24C02

器件地址:1010000(R/W') 0xA0表示51向AT24C02写数据,0xA1表示51读AT24C02的数据。

WP:写入保护,当WP为高电平时,无法写入数据。

总共能存256个字节,写入周期5毫秒。

把资料包提供的I2C.c和I2C.h复制到文件里。

比赛中需要自己编写E2PROM的读写函数,记得声明:

//写24C02
void EEPROM_Write(u8 add,u8 dat)
{
	I2CStart(); 
	I2CSendByte(0xa0); 
	I2CWaitAck(); 
	
	I2CSendByte(add);	
	I2CWaitAck(); 
	I2CSendByte(dat); 
	I2CWaitAck(); 
	I2CStop();
	HAL_Delay(5);
}
//读24C02
u8 EEPROM_Read(u8 add)
{
	u8 dat;
	
	I2CStart(); 
	I2CSendByte(0xa0);
	I2CWaitAck(); 	
	I2CSendByte(add);
	I2CWaitAck(); 
	
	I2CStart();
	I2CSendByte(0xa1); 
	I2CWaitAck();
	dat = I2CReceiveByte(); 
	I2CSendNotAck();
	I2CStop();
	
	return(dat);
}

E2PROM很多时候用来统计设备的开机次数:

I2C协议_第2张图片

 I2C协议_第3张图片

 

你可能感兴趣的:(单片机,蓝桥杯嵌入式,学习,单片机,嵌入式硬件,stm32)