一、存储器介绍
易失性存储器/RAM(Random Access Memory)运行存储器
非易失性存储器/ROM(Read-Only Memory)
-
功能不同:RAM是一种随机存取的存储器,主要用于临时存储程序和数据,其内容可以随时读取和写入。而ROM是一种只读存储器,主要用于存储固化程序和数据,其内容只能被读取,不能被写入或修改。
-
可写性不同:RAM是可读写的存储器,可以随时修改和更新存储的数据。而ROM是只读的存储器,一旦存储数据后就不能修改。
-
容量不同:RAM的容量通常比ROM大得多,可以存储更多的程序和数据。而ROM的容量通常比RAM小,只能存储少量的程序和数据。
-
速度不同: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、SDA | I2C接口 |
A0、A1、A2 | I2C地址 |
-
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时序结构
-
起始条件:SCL高电平期间,SDA从高电平切换到低电平
-
终止条件: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数据帧
-
发送一帧数据
2.完成任务:向谁发什么
3.接收一帧数据
4.完成任务:向谁收什么
5.先发送再接收数据帧(复合格式)
6.完成任务:向谁收指定的什么
十、AT24C02数据帧
-
字节写:在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;
}