威廉希尔官方网站 设计william hill官网
直播中

张程明

12年用户 1749经验值
擅长:电源/新能源 模拟技术 控制/MCU
私信 关注
[问答]

想知道,外挂24C02 EEPROM和单片机具体的通讯过程,哪个坛友可以讲下,谢谢

想知道,外挂24C02 EEPROM和单片机具体的通讯过程,哪个坛友可以讲下,谢谢
  • 外挂24C02 EEPROM和单片机通讯过程.png

回帖(3)

lm12041204a

2019-12-3 17:38:52

最佳答案

楼主自己先看一下数据表、教材或网上搜一下吧,很多东西都是很容易找到的,关键是你要自己仔细阅读理解。(结合时序图)

51单片机入门 - EEPROM(24C02的使用)

1、EEPROM写数据流程
第一步,首先是 I2C 的起始信号,接着跟上首字节,也就是我们前边讲的 I2C 的器件地址,并且在读写方向上选择“写”操作。
第二步,发送数据的存储地址。24C02一共 256 个字节的存储空间,地址从0x00~0xFF,我们想把数据存储在哪个位置,此刻写的就是哪个地址。
第三步,发送要存储的数据第一个字节、第二个字节„„注意在写数据的过程中,
EEPROM 每个字节都会回应一个“应答位 0”,来告诉我们写 EEPROM 数据成功,如果没有回应答位,说明写入不成功。
在写数据的过程中,每成功写入一个字节,EEPROM 存储空间的地址就会自动加1,当加到 0xFF 后,再写一个字节,地址会溢出又变成了 0x00。

2、EEPROM读数据流程
第一步,首先是 I2C 的起始信号,接着跟上首字节,也就是我们前边讲的 I2C 的器件地址,并且在读写方向上选择“写”操作。这个地方可能有同学会诧异,我们明明是读数据为何方向也要选“写”呢?刚才说过了,24C02 一共有 256 个地址,我们选择写操作,是为了把所要读的数据的存储地址先写进去,告诉 EEPROM 我们要读取哪个地址的数据。这就如同我们打电话,先拨总机号码(EEPROM 器件地址),而后还要继续拨分机号码(数据地址),而拨分机号码这个动作,主机仍然是发送方,方向依然是“写”。
第二步,发送要读取的数据的地址,注意是地址而非存在EEPROM 中的数据,通知EEPROM 我要哪个分机的信息
第三步,重新发送 I2C 起始信号和器件地址,并且在方向位选择“读”操作。
这三步当中,每一个字节实际上都是在“写”,所以每一个字节EEPROM 都会回应一个“应答位 0”。
第四步,读取从器件发回的数据,读一个字节,如果还想继续读下一个字节,就发送一个“应答位ACK(0)”,如果不想读了,告诉 EEPROM,我不想要数据了,别再发数据了,那就发送一个“非应答位NAK(1)”。

和写操作规则一样,我们每读一个字节,地址会自动加 1,那如果我们想继续往下读,给EEPROM 一个 ACK(0)低电平,那再继续给 SCL 完整的时序,EEPROM 会继续往外送数据。如果我们不想读了,要告诉 EEPROM 不要数据了,那我们直接给一个NAK(1)高电平即可。这个地方大家要从逻辑上理解透彻,不能简单的靠死记硬背了,一定要理解明白。梳理一下几个要点:

A、在本例中单片机是主机,24C02 是从机;
B、无论是读是写, SCL 始终都是由主机控制的;
C、写的时候应答信号由从机给出,表示从机是否正确接收了数据;
D、读的时候应答信号则由主机给出,表示是否继续读下去。

另一个解释:
   首先我们应该了解的是I2C是两线串行总线(数据线SDA和时钟线SCL)。它主要是在CPU与被控IC之间、IC与IC之间双向传送。高速的I2IC一般可达到00KHZ以上,一般的则在100KHZ。

   了解了I2C的一些定义后,要想写代码必须知道它的时序。

一、空闲状态,I2C在空闲状态时SDA和SCL都是处于高电平。
二、开始信号,当SCL电平不发生变化的时候,SDA由高电平变为低电平的这一个过程是开始信号。
三、停止信号,当SCL电平不变的时候,SDA有低电平变为高电平的这一过程是停止信号。
四、应答信号,当8个时钟脉冲完的时候,第九个时钟脉冲来到之前SDA变为低电平,直达第九个时钟脉冲结束。(八个时钟脉冲也可以理解为一个字节的数据传输完成)五、数据的有效性,当SCL变为高电平之前,SDA上的数据(0或1)应该提前准备好,且在SDA变为低电平之后才可变化。

   如果理解了上面的文字,那么你就理解了I2C了,将时序理解透彻,那么就可以开始写IIC的程序了。

   学会了I2C这种通信自后,我们应该需要把他利用起来,比如数据传输后我们应该放到那里。在标题中我们可以看到一种EEPROM(24C02)。
24C02中的02表示可存储2K的数据,256字节的数据。而他的设备地址则只由你需要读写而改变,因为容量固定,地址也固定了(1 0 1 0 A2 A1 A0 R/W)如果是读则最后位为1,若是写最后位为0。上面换成16进制则是0XA1/0XA0。

   以上就是24C02的基本知识,如果想要写程序,那么必须知道的是它的工作时序。24C02的时序就三个,一个是写,一个是读,还有一个是检测。掌握了这三个就意味着掌握了24C02。

   首先是写时序:
1.起始信号;
2.写写的设备地址;
3.等待应答;
4.写读的地址
5.等待应答
6.写数据
7.等待应答
8.停止信号

   其次是读时序:
1.起始信号
2.写写的设备地址;
3.等待应答;
4.写读的地址
5.等待应答
6.起始信号
7.写读的设备地址
8.等待应答
9.写数据
10.停止信号

   最后是检测时序:
先读取地址255的数据,若为0x55则检测通过,若不等于就写一个0x55给地址255,
然后在读取地址为255的数据,若为0x55则通过,否则返回检测失败。(当然0x55只是我写的一个数据而已,也可以不用这个)
2 举报
  • 张程明: 就是找了很多资料看  没看懂 卡住了
  • 张程明: 再写一个字节,地址会溢出又变成了 0x00---那岂不是要算好?如果大于255就前功尽弃了

王燕

2019-12-4 11:11:10
@lm12041204a @ARMLIUNX 可以来看看
举报

lm12041204a

2019-12-4 11:56:15
EEPROM存储器24C02手册(中文)
https://wenku.baidu.com/view/cbc12e29453610661ed9f4ee.html
P4 相关时序
2 举报
  • 张程明: 这种8个脚的最大可以做到多少容量
  • lm12041204a 回复 张程明: 具体要看存储芯片了,24C02,最后两位就是表示容量。
    引脚,除去电源、控制线,剩余的引脚就是地址和数据线,是否复用,都有影响,地址线的多少、数据字长,结合起来就是容量。

更多回帖

发帖
×
20
完善资料,
赚取积分