各内存大小的EEPROM的IIC通信原理

1、引脚图

各内存大小的EEPROM的IIC通信原理_第1张图片

知识点一:A0A1A2是硬件控制该设备地址

知识点二:WP读写保护位,SCL时钟信号(可模拟),SDA数据信号(可模拟)

2、EEPROM时序图

知识点一:时序就是一种mcu与硬件之间的通信协议决定的拥有变化占空比的模拟信号(简单的说就是用高低电平变化来表达他们之间的通信方式或者通俗的说就是他们自己的“方言”交流)。时序的读写步骤看下面两个图,看得懂英文就懂了。(ACK是应答,就是接收完发送回应信号,发送完要等待回应信号才继续,MSB与LSM看下面的设备地址)

各内存大小的EEPROM的IIC通信原理_第2张图片

各内存大小的EEPROM的IIC通信原理_第3张图片

知识点二:发送/读取“1”或“0”的规则如下图。SCL时钟信号高电平期间SDA有稳定的高电平代表数据1,有稳定的低电平代表数据0。可以类比我们日常交流时所谓的暗号(用什么方式表示什么信息一样)

各内存大小的EEPROM的IIC通信原理_第4张图片

知识点三:在读写时序中,无论是写设备地址还是写字节地址又或者是应答信号起始信号他们都是硬件自身规定的一串数据,你只要对应的发送好这个数据,那么就相当于写了这段时序的这一部分。发送数据方法就是知识点二。其次发送什么数据这里不赘述,不同内存的EEPROM的通信规则都是IIC查数据手册就知道对应发什么数据了。

3、基于不同内存的24c01/02/04/08/16的设备地址区别

各内存大小的EEPROM的IIC通信原理_第5张图片

知识点一:设备地址相当于一个设备名字区别于同一个数据口并联的其他EEPROM设备。是与EEPROM通信读写时序时必要写入的数据之一,用于选中该片EEPROM。

知识点二:型号信息(如24c02型号说明它内存为2kb,256字节)

知识点三:不同内存大小的EEPROM设备地址设置不一样,如上图即是各内存大小的设备地址,其中A0A1A2可硬件连接对应引脚置高低电平设置。P0P1P2不能设置只能由软件赋值让EEPROM自主查询,它们相当于组成的一组地址线,每个地址线有256字节数据(24c01本人估计它是一条地址线共128字节),当没有P0P1P2说明地址线就只有一条不需要排线,即24c02只有256字节内存同时拥有A2A1A0三位,说明他的设备地址(设备名称)可以有八种设置,也就是说如果并联多个eeprom最多八个,因为名字就最多八个而且不能重复名字不然不能识别具体哪个eeprom收发数据,如果只能设置A1A2以此类推即可知道最多并联4个eeprom。又例如24c16,它内存2048字节,因为它有P2P1P0三个位供软件设置,软件设置的P0/P1/P2不同共有2^3种情况,也就是可设置(或者说它内部存在)8个地址线,然后一个地址线256字节,那么24c16就一共8*256=2048字节*8=16kb的内存。

知识点四:传输数据的地址设置(地址是字节地址不是位地址)。对于16k内存以内的EEPROM,告诉EEPROM数据的地址要发送两次数据,首先要发送所谓的高地址(反正我理解的高地址就是告诉EEPROM数据写在哪个地址线),就是把上面的设备地址发一次,如16k内存的,发的数据地址是第266字节,那么根据一条地址线256个字节,266/256取整=1就知道这个地址在那个地址线,这里算到地址线1,那么P2P1P0三个位分别就是001以此类推。接下来发送数据所在的低位地址就是另外的八位数据,这八位数据就是说在这个地址线256字节位中的哪个字节位,那就是266%256=10,也就是说266地址在24c16里是在地址线1的第10个字节,低地址就是10(十进制)。那最终发送的高低地址是什么呢?如果是读,高地址就是10100011(二进制,写的话最后一位是0根据上图的设备地址规范就知道);低地址就是00001010(二进制,转为十进制就是10),然后在读写时序中写数据所存储地址的时候就依次发送这两个数据即可(每次发送完后要应答,根据时序图)。

4、总结——编程思路通俗讲解为

举例写数据到EEPROM :

1)大喊一声“喂”(发送起始信号,编程上要发送起始信号对应的时序),叫起若干个EEPROM储存片

2)看看有没有人回头回应(编程上等待EEPROM 的应答信号,应答信号的时序看手册,应答信号建议封装一个函数)

3)确定好你要叫的那个EEPROM的名字(确定好A2A1A0没有则忽略,编程上什么都不用做)

4)走到那个EEPROM的具体位置(确定数据地址,确定P0P1P2,没有则忽略。算高地址,编程上发送高地址)

5)看看那个人愿不愿意和你交流(同上,编程上等待应答信号)

6)他愿意交流,凑到他耳朵旁边准备悄悄话发暗号(算低地址,编程上发送低地址)

7)看他愿不愿意悄悄话(同上,编程上等待应答信号)

8)想说什么大胆地说吧(编程上发送数据内容,建议按字节发送,最好封装一个发送一个字节数据的函数)

9)看他听懂没有(同上,编程上等待应答信号)

10)听懂了就停止(编程上发送停止信号,建议封装一个停止信号函数,表示一个字节数据完毕)

11)悄悄话上瘾了?重复上面步骤(多字节存储建议把以上所有过程统一封装进一个函数,每次发送一个字节时调用即可)

此外对于内存大于16k的EEPROM鄙人暂时学艺不精,不好介绍,如果需要我觉得可以用多个IIC通信同时用多个EEPROM就能扩大内存。

对于内存大于16k的EEPROM我可以分享我个人的想法(仅供参考):

经过查找资料我发现他们与16k以内的区别是在于数据地址确定,因为16k以上用普通的控制方法最多8线地址每个线256字节满足不了他们的内存大小,因此不能用以上写地址的方法。此外24c32与24c64我看资料显示他们貌似要设置A0A1A2,这样一来地址就不能通过这P1P2P0三位设置。我猜测他们的原理是用新的八位做高地址就像16k以内的低地址一样。这样他们的编程写地址过程就是直接算字节地址高位地位的二进制值直接依次发送就不需要区分在哪个地址线了。而我看别人正确的代码来顺藤摸瓜的。希望有大佬发言接近鄙人疑惑。

视频详解看我个人的b站视频:https://www.bilibili.com/video/av61307747

这里还有其他技术视频

你可能感兴趣的:(模块学习,单片机学习)