AT24C02(I2C总线)_AT24C02数据存储)

AT24C02(I2C总线)_AT24C02数据存储

  • 小白极客的51单片机笔记(自用)
    • 第一部分—存储器介绍
    • 第二部分—AT24C02存储芯片介绍
    • 第三部分—I2C总线介绍(重难点)
      • I2C总线介绍
      • I2C电路规范
      • I2C时序结构
      • I2C数据帧
    • 第四部分—AT24C02数据帧
    • 第五部分—编写程序

小白极客的51单片机笔记(自用)

这篇文章写于本人大二暑假实习的面试前,因为觉得这部分的内容很重要又自觉自己无法看一遍就能全部理解并记忆,于是写下了人生中值得纪念的第一篇博客,因为是给自己用的知识点整理文章,所以较为粗糙,如有错误请尽情指出。

第一部分—存储器介绍

存储器分易失性存储器/RAM,与非易失性存储器/ROM
前者分为SRAM(静态RAM)与DRAM(动态RAM)两种,优点是存储速度特别快,缺点是掉电丢失,这是它最为鲜明的缺点。
后者有Mask ROM(掩膜ROM)、PROM(可编程ROM)、EPROM(可擦除可编程ROM)、E2PROM(电可擦除可编程ROM)、Flash(闪存)、硬盘(软盘、光盘等), 优点是掉电不丢失,缺点是存储比较慢

RAM

  1. SRAM(静态RAM) ,内部的存储结构是锁存器,是一个D触发器,用电路来存储数据,是所有存储器中最快的一个,一般用于电脑CPU高速缓存,单片机里面也是SRAM,比如定义的变量就存储在SRAM里面,特殊功能寄存器也是一种SRAM。它的容量较小成本较高。
  2. DRAM(动态RAM) 用电容来存储数据,我们知道电容充完电后显示高电平,放完电后显示低电平。但是因为这个电容它集成度特别高所以容值特别小,因为电容存在漏电现象,所以在存储数据后很快就会漏电漏完了。所以我们要给它配一个扫描电路,每隔一段时间就读取它的数据,并给它重新充电,每隔一段时间刷新一下,补上那些因为漏电现象所丢失的电能,所以它叫动态RAM,因为它要动态刷新。但是DRAM相比SRAM成本更低,容量更大,包括电脑里面的内存条和手机里面的运行内存都是动态RAM。

ROM

  1. MaskROM(掩膜ROM) 最早的ROM,在刚开始做出来后仅仅依靠电路来存储数据,芯片成品无法更改,可以保证掉电不丢失,ROM得名于此,即read only memory;
  2. PROM(可编程ROM) 相对于上一代而言,PROM是可写入的,缺点是只能写入一次,PROM生产出来以后,第一次写好,以后就永远是这个数据从,无法再进行更改;
  3. EPROM(可擦除可编程ROM) 是PROM的升级版,生产出来后我们也可以对它进行编程,同时也可以再编程结束后将它清除成编程前的状态,但是需要紫外线将其照射三十分钟才可将其擦除。同时“ROM”这个词已经成为了一个广义的概念,掉电不丢失的非易失性存储器都概括为ROM;
  4. E2PROM(电可擦除可编程ROM) 本节的AT24C02就是一种E2PROM,在5V的低压电的情况下,几毫秒就可将其擦除,但应用不是特别广泛;
  5. Flash(闪存) 功能十分强大,应用十分广泛,包括单片机的程序存储器、U盘、内存卡、电脑的固态硬盘和手机里用来存储的介质全部都采用的Flash;
  6. 硬盘(软盘、光盘等) 像是电脑里的机械硬盘,它是靠磁介质来存储信息的,软盘是早期电脑刚出来时候的产品,容量也很小,现在都被淘汰了,现在的电脑都是从C盘开始的,在早期的时候,A盘和B盘就是留给软盘的,光盘是用光信号存储的。

第二部分—AT24C02存储芯片介绍

AT24C02是一种可以实现掉电不丢失的存储器,可用于保存单片机运行时想要永久保存的数据信息。
存储介质:E2PROM
通讯接口:I2C总线
容量:256字节

引脚及应用电路
AT24C02(I2C总线)_AT24C02数据存储)_第1张图片
AT24C02(I2C总线)_AT24C02数据存储)_第2张图片
内部结构框图
AT24C02(I2C总线)_AT24C02数据存储)_第3张图片
X DEC-译码器,左边是地址线,输入译码器又回来
SERIAL MUX-串行数据选择端,借助Y DEC(Y译码器)通过D(out)/ACK LOGIC一位一位的输出出去;
DATA WORD ADDR/COUNTER-用来设置地址,内部设有存储地址的寄存器,每写入或读出一个地址,这个寄存器会自动加一,如果读出不指定地址的话,它默认把寄存器的数据拿出来

第三部分—I2C总线介绍(重难点)

I2C总线介绍

  1. I2C总线(Inter IC bus)是由Philips公司开发的一种通用数据总线。
  2. 两根通信线:SCL(Serial Clock串行时钟线)、SDA(Seriak Data串行数据线)。
  3. 同步、半双工,带数据应答。
    *注:同步(因为它有单独的时钟线)、半双工(SDA只有一根线,并且还要来回通信)
  4. 通用的I2C总线,可以使各种设备的通信标准统一,对于厂家来说,使用成熟的方案可以缩短芯片设计周期、提高稳定性,对于应用者来说,使用通用的通信协议可以避免学习各种各样的自定义协议,降低了学习和应用的难度。
    *注

I2C电路规范

  • 所有I2C设备的SCL连在一起,SDA连在一起
  • 设备的SCL和SDA均要配置成开漏输出模式
    *开漏输出模式-断开时引脚成浮空状态(电路断开,电压不稳定)
  • SCL和SDA各添加一个上拉电阻,阻值一般为4.7KΩ左右
  • 开漏输出和上拉电阻的共同作用实现了“线与”的功能,此设计主要是为了解决多机通信互相干扰的问题
    AT24C02(I2C总线)_AT24C02数据存储)_第4张图片

I2C时序结构

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

  • 终止条件:SCL高电平期间,SDA从低电平切换到高电平
    AT24C02(I2C总线)_AT24C02数据存储)_第5张图片

  • 发送一个字节:SCL低电平期间,主机将数据位依次放到SDA线上(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可发送一个字节
    AT24C02(I2C总线)_AT24C02数据存储)_第6张图片

  • 接收一个字节:SCL低电平期间,从机将数据位依次放到SDA总线上(高位在前),然后拉高SCL,从机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)AT24C02(I2C总线)_AT24C02数据存储)_第7张图片
    *把SDA置1,相当于释放,释放的时候,主机是完全不干预通讯线的,换言之就是主机将线的控制权交给了从机,紫色代表从机控制着总线

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

  • 接收应答:在发送完一个字节之后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)
    AT24C02(I2C总线)_AT24C02数据存储)_第8张图片

I2C数据帧

  • 发送一帧数据
  1. 首先发送一个Start
  2. S:SLAVE ADDRESS+W——发送一个字节数据(I2C规定,在Start之后第一个字节数据一定要发从机地址+读写位,前四位——A6、A5、A4、A3——是固定端1010)
  3. 每发送一个字节之后都要跟一个acceptance acknowledge(接收应答),从机应该给我应答(给我发0)
  4. S:BYTE 1 ——接着就可以发送第一个字节数据了
  5. 。。。
  6. S:BYTE n
  7. RA:0
  8. P
  • 完成任务:向谁发什么

AT24C02(I2C总线)_AT24C02数据存储)_第9张图片

  • 接收一帧数据
  1. 首先发送一个Start
  2. S:SLAVE ADDRESS+R——发送一个字节数据(一旦我们发送了READ这个字节,我们就默认代表我们已经把总线的控制权交给从机了)
  3. RA:0
  4. R:BYTE 1 ——接着就可以接收第一个字节数据了
  5. SA:0(接收应答)
  6. .。。。
  7. R:BYTE n
  8. SA:1(一般发分应答)
  9. P
  • 完成任务:向谁收什么

AT24C02(I2C总线)_AT24C02数据存储)_第10张图片

  • 先发送再接收数据帧(复合格式)
    *发送一帧数据(去掉STOP)和接收一帧数据的拼接
    AT24C02(I2C总线)_AT24C02数据存储)_第11张图片
  • 向谁收指定的什么

第四部分—AT24C02数据帧

AT24C02(I2C总线)_AT24C02数据存储)_第12张图片AT24C02(I2C总线)_AT24C02数据存储)_第13张图片

  • AT24C02的固定地址为1010,可配置地址本开发板上位000,所以SLAVE ADDRESS+W为0xA0(1010 000 0),SLAVE ADDDRESS+R为0xA1(1010 000 1)

  • 字节写:在”字地址“处写入”数据“
    AT24C02(I2C总线)_AT24C02数据存储)_第14张图片

  • 随机读:读出在“字地址”处的数据
    AT24C02(I2C总线)_AT24C02数据存储)_第15张图片

第五部分—编写程序

位声明——通过查看开发板原理图的EEPROM模块发现,SCL、SDA分别接在P2_1和P2_0,之后定义六个函数。
第一个函数——void I2C_Star(void)
首先在默认的情况下,SCL和SDA都是持续高电平,也就是空闲状态,因为没有人去动I2C总线。
但是在复合格式这个时序里,S(开始)可能是在RA之后被调用而不是在空闲时间里被被调用,因为RA之后SDA可能是高电平也可能是低电平,所以在S在整个帧里能够拼上,所以我们先把SDA置1,因为SDA可能是0也可能是1,而其他拼图结束的时候SCL都是0,一般我们都是在SCL低电平的时候变换数据所以我们先确保SDA=1,然后再把SCL拉高(SCL=1),这样就确保了在start之前SCL和SDA都是高电平然后再把SDA、SCL拉低,这样S就结束了。

void I2C_Star(void)
{
	I2C_SDA=1;
	I2C_SCL=1;
	I2C_SDA=0;
	I2C_SCL=0;
}

第二个函数——void I2C_Stop(void)
P可能会跟在RA:0也可能跟在SA:1后面,说明停止之前SDA可能是0也可能是1,所以在停止之前我们需要保证SDA是0,所以先将SDA拉低,再把SCL拉高,再把SDA拉高。

void I2C_Stop(void)
{
	I2C_SDA=0;
	I2C_SCL=1;
	I2C_SDA=1;
}

第三个函数——void I2C_SendByte(unsigned char Byte)
把SDA的电平变为SDA的最高位,再分别把SCL置高置低。但是我们把SCL置高后立马置低了,主机能不能在这期间读取到数据呢,我们在这里可以参考下AT24C02手册的交流电气特性。从中得知时钟频率,SCL在VCC=5V的情况下最大值是1000KHZ(1MHZ),而单片机IO口翻转最快也就是1微秒翻转一下,周期也就是500HZ,所以时钟拉高后立马拉低也不会超过最大时钟。

void I2C_SendByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
	I2C_SDA=Byte&(0x80>>1);			 //把Byte最高位取出来,赋给SDA
    I2C_SCL=1;
    I2C_SCL=0;
	}
}

第四个函数——unsigned char I2C_ReceiveByte(void)
在接收之前需要将SDA置1,释放总线。将SCL置高,如果SDA读取的是1,则把Byte的最高位置1,将SCL置0,以上循环8次,则接收一个字节。

unsigned char I2C_ReceiveByte(void)
{
 	unsigned char i,Byte=0x00;
	I2C_SDA=1;
	if(i=0;i<8;i++)
	{
	I2C_SCL=1;
	if(I2C_SDA){Byte|=(0x80>>i);}		//相当于如果SDA读取的是1,则把Byte的最高位置1
    I2C_SCL=0;
	}
	return Byte;
} 

第五个函数——void I2C_SendAck(unsigned char AckBit) //发送应答
让SDA=应答位,然后把SCL拉高再拉低。

void I2C_SendAck(unsigned char AckBit)    //发送应答
{
	I2C_SDA=AckBit;
	I2C_SCL=1;
	I2C_SCL=0;
}

第六个函数——unsigned char I2C_ReceiveAck(void)
主机先释放SDA,再把SCL拉高

unsigned char I2C_ReceiveAck(void)
{
	unsigned char AckBit;
	I2C_SDA=1;
	I2C_SCL=1;
	AckBit=I2C_SDA;
	I2C_SCL=0;
	retuen AckBit;
}

你可能感兴趣的:(笔记,单片机)