十一、AT24C02(I2C总线)

一、存储器介绍

易失性存储器/RAM(Random Access Memory)运行存储器

非易失性存储器/ROM(Read-Only Memory)

  1. 功能不同:RAM是一种随机存取的存储器,主要用于临时存储程序和数据,其内容可以随时读取和写入。而ROM是一种只读存储器,主要用于存储固化程序和数据,其内容只能被读取,不能被写入或修改。

  2. 可写性不同:RAM是可读写的存储器,可以随时修改和更新存储的数据。而ROM是只读的存储器,一旦存储数据后就不能修改。

  3. 容量不同:RAM的容量通常比ROM大得多,可以存储更多的程序和数据。而ROM的容量通常比RAM小,只能存储少量的程序和数据。

  4. 速度不同:RAM的访问速度比ROM快得多,可以实现实时的数据读取和处理。而ROM的访问速度相对较慢,只能用于存储静态数据和程序。

RAM

  • SRAM(stact RAM):内部结构类似于D触发器,用数字电路来存储数据,D触发器(D Flip-Flop)是一种常用的数字电路元件,用于存储数字信号的状态。D触发器可以将输入信号(D)的值在时钟信号(CLK)的上升沿或下降沿时锁存,并将锁存后的状态输出。

  • DRAM(dynamic RAM):用电容充放电存储电路,但是因为电容集成特别高,会有漏电现象,所以需要一直扫描向有电的电容充电,来达到存储数据的目的

SRAM的速度大于DRAM

ROM

  • Mask ROM(掩膜 ROM):用电路来存储数据,不能写入只能读取

  • PROM(可编程 RAM):只能写入一次

  • EPROM(可擦除可编程ROM):可写入可擦除,擦除需要紫外线30分钟

  • E^2PROM(电可擦除可编程ROM):可随意写入和擦除,但是容量小

  • Flash(闪存):是一种非易失性存储器件,可以用于存储数据和程序代码等信息。Flash存储器通常由许多电子存储单元(Cell)组成,每个存储单元可以存储一个或多个比特的数据

  • 硬盘、软盘、光盘等

二、存储器简化模型

  • 地址总线和数据总线并不是交错的,而是立体有间隔的,如果直接相连会造成干扰,所以地址总线与数据总线用二级管相连(正向导通,反向截止),这样电流就不会通过导通的节点流向其他行的节点,干扰其他行。

  • PROM接有两个二极管,蓝色的二极管在电压超过一定数值后会被击穿从断路变成短路。所以可以写入一次

  • 地址总线一次只能选中一行,所以一般会接一下138译码器。

三、AT24C02介绍

  • AT24C02是一种可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息

  • 存储介质:E2PROM

  • 通讯接口:I2C总线

  • 容量:256字节

四、引脚及应用电路

引脚功能
VCC、GND电源(1.8V~5.5V )
WP写保护(高电平有效)
SCL、SDAI2C接口
A0、A1、A2I2C地址

  • SCL和SDA接在两个上拉电阻,是I2C协议规范需要的。

开发板上的电路图

WE为写使能,低电平使能,如果是WP则是写保护则高电平有效。

因为I/O口都已接上了上拉电阻,所以模块上并未标注。

五、内部结构框图

EEPROM存储单元就是上面提到的网格,左边是X DEC(X译码器),接着地址线,地址线左边接着DATA WORD ADDR/COUNTER(数据字地址/寄存器),每写入或者读出一个地址,寄存器会加一;下面是数据输入输出端(SERIAL MUX:串行数据选择端),通过左边的Y译码器一位一位的输出出去;上面一段是进行数据擦除的;左上角是I2C的结构框图。

六、I2C总线介绍

  • I2C总线(Inter IC BUS)是由Philips公司开发的一种通用数据总线。

  • 两根通信线:SCL(Serial Clock)、SDA(Serial Data)。

  • 同步、半双工,带数据应答。

  • 通用的I2C总线,可以使各种设备的通信标准统一,对于厂家来说,使用成熟的方案可以缩短芯片设计周期、提高稳定性,对于应用者来说,使用通用的通信协议可以避免学习各种各样的自定义协议,降低了学习和应用的难度。

七、I2C电路规范

  • 所有I2C设备的SCL连在一起,SDA连在一起。

  • 设备的SCL和SDA均要配置成开漏输出模式。

  • SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右。

  • 开漏输出和上拉电阻的共同作用实现了“线与”的功能,此设计主要是为了解决多机通信互相干扰的问题。

当需要跟其中一个通信时,为了防止其他设备干扰,需要将其断开,此时I/O口都置1(断开状态),所有的设备都接着共同的上拉电阻,通信时,当需要0则将主动给0,当给1时,则表示松手动作上拉电阻会将电位上拉。

如下图所示:两个人上面有一根竹竿,竹竿上面连着弹簧,两人面前各有一个刻度尺来判断高低电平,当两个人需要通信时,需要给0的电平信号,此时将竹竿拉下来,当需要发送1时,便松手,此时竹竿会自己升上去。

上拉电阻                                                                         开漏输出

                     

当需要输出1时,开关断开,电路不会接地,会将电信号输出

当需要输出0时,开关闭合直接接地,此时电信号输出到地,不会通过电路输出。

    

 

当开关闭合时,输出信号0

当开关断开时,此时电路处于浮空状态,浮空状态有点小抖动电压就会产生变化,处于电路断开,电压不稳定状态。

八、I2C时序结构

  1. 起始条件:SCL高电平期间,SDA从高电平切换到低电平

  2. 终止条件:SCL高电平期间,SDA从低电平切换到高电平

 3.发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节

4.接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)

 

5.发送应答:在接收完一个字节之后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答

6.接收应答:在发送完一个字节之后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)

九、I2C数据帧

  1. 发送一帧数据

2.完成任务:向谁发什么

3.接收一帧数据

4.完成任务:向谁收什么

5.先发送再接收数据帧(复合格式)

 6.完成任务:向谁收指定的什么

十、AT24C02数据帧

  1. 字节写:在WORD ADDRESS处写入数据DATA

2.随机读:读出在WORD ADDRESS处的数据DATA

3.AT24C02的固定地址为1010,可配置地址本开发板上为000 所以SLAVE ADDRESS+W为0xA0,SLAVE ADDRESS+R为0xA1

4.字节写:在“字地址”处写入“数据”

5.随机读:读出在“字地址”处的“数据”

十一、AT24C02数据存储

#include <REGX52.H>

sbit I2C_SCL=P2^1;
sbit I2C_SDA=P2^0;

/**
  * @brief  I2C开始
  * @param  无
  * @retval 无
  */
void I2C_Start(void)
{
	I2C_SDA=1;
	I2C_SCL=1;
	I2C_SDA=0;
	I2C_SCL=0;
}

/**
  * @brief  I2C停止
  * @param  无
  * @retval 无
  */
void I2C_Stop(void)
{
	I2C_SDA=0;
	I2C_SCL=1;
	I2C_SDA=1;
}

/**
  * @brief  I2C发送一个字节
  * @param  Byte 要发送的字节
  * @retval 无
  */
void I2C_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		I2C_SDA=Byte&(0x80>>i);
		I2C_SCL=1;
		I2C_SCL=0;
	}
}

/**
  * @brief  I2C接收一个字节
  * @param  无
  * @retval 接收到的一个字节数据
  */
unsigned char I2C_ReceiveByte(void)
{
	unsigned char i,Byte=0x00;
	I2C_SDA=1;
	for(i=0;i<8;i++)
	{
		I2C_SCL=1;
		if(I2C_SDA){Byte|=(0x80>>i);}
		I2C_SCL=0;
	}
	return Byte;
}

/**
  * @brief  I2C发送应答
  * @param  AckBit 应答位,0为应答,1为非应答
  * @retval 无
  */
void I2C_SendAck(unsigned char AckBit)
{
	I2C_SDA=AckBit;
	I2C_SCL=1;
	I2C_SCL=0;
}

/**
  * @brief  I2C接收应答位
  * @param  无
  * @retval 接收到的应答位,0为应答,1为非应答
  */
unsigned char I2C_ReceiveAck(void)
{
	unsigned char AckBit;
	I2C_SDA=1;
	I2C_SCL=1;
	AckBit=I2C_SDA;
	I2C_SCL=0;
	return AckBit;
}

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值