IIC 读取 EEPROM(AT24C02)

1、EEPROM的发展
(1)ROM(Read Only Memory):真正意义上的只读存储器,在出厂的时候数据就写在了芯片里,只能读不能写;
(2)PROM(Program Rom):可编程只读存储器,可编程的ROM芯片,出厂的时候芯片是空白的,自己可以写入一次数据,一旦写进去芯片也是只能读不能写;
(3)EPROM(Erasable Programmable Rom):可擦除可编程只读存储器,芯片上方有一个窗口,可以用紫外线透过芯片的窗口去擦除程序,擦除完再写入,平时要把窗口遮住,防止平时使用时有光线进入芯片,导致数据受损。
(4)EEPROM(Electrically Erasable Programmable Read-Only Memory):电可擦除可编程只读存储器”,可以随机访问和修改任何一个字节,可以往每个bit中写入0或者1。这是最传统的一种EEPROM,掉电后数据不丢失,可以保存100年,可以擦写100w次。具有较高的可靠性,但是电路复杂/成本也高。因此目前的EEPROM都是几十千字节到几百千字节的,绝少有超过512K的。


2、FLASH的分类
flash分为Norflash和Nandflash:Norflash容量小价格高,可以上电使用,通过总线与CPU连接,也可以片内执行,可用于设备启动;NandFlash容量大,价格便宜,必须初始化才能使用,通过NandFlash控制器与CPU通信。更详细的区别可以参考《嵌入式开发——常见的存储器分类和特性介绍》。
 

3、flash和EEPROM的异同
(1)两者都是属于ROM,并且都是电学原理进行存储
(2)FLASH比EEPROM的电路简单,同样面积flash可以存储更多数据,数据密度更高;
(3)FLASH是按块进行访问,EEPROM按字节进行访问;
(4)EEPROM的可擦写次数比FLASH多;
(5)EEPROM的单位容量价格比FLASH更高,EEPROM一般容量都很小;
(6)EEPROM一般都是用作存储程序运行时要掉电不丢失的数据,FLASH一般是用来存储程序的;
 

二、EEPROM的学习和使用方法

1、EEPROM写数据流程

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

2、EEPROM读数据流程

(1)第一步,首先写IIC的起始信号,紧接着写上首字节,即我们前边讲的IIC的器件地址,并且在读写方向上选择“”操作。
这个地方可能有人会感到很诧异,我们明明是读数据为何方向也要选“写”呢?刚才说过了,24C02芯片一共有256个地址,我们选择写操作,是为了把所要读的数据的存储地址先写进去,告诉EEPROM我们要读取哪个地址的数据。这就如同我们打电话,先拨总机号码(EEPROM的器件地址),而后还要继续拨分机号码(EEPROM的数据地址),而拨分机号码这个动作,主机仍然是发送方,方向依然是“写”。
(2)第二步,发送要读取的数据的地址,注意是地址而非存储在EEPROM中的数据,通知EEPROM我要读取哪个分机的信息。
(3)第三步,重新发送IIC的起始信号器件地址,并且在读写方向位上选择“”操作。
这三步当中,每一个字节实际上都是在“写”,所以每一个字节EEPROM都会回应一个“应答位0”。
(4)第四步,读取从器件发回的数据,读一个字节,如果还想继续读下一个字节,就发送一个“应答位ACK(0)”,如果不想读了,告诉EEPROM,我不想要数据了,别再发数据了,那就发送一个“非应答位NAK(1)”。
和写操作规则一样,每成功读取一个字节数据,EEPROM芯片的存储地址就会自动加1,那如果我们想继续往下读,给EEPROM一个ACK(0)低电平,然后再继续给SCL时钟线完整的时序,EEPROM会继续往外送数据。如果我们不想读了,要告诉EEPROM不要数据了,那我们直接给一个NAK(1)高电平即可。这个地方大家要从逻辑上理解透彻,不能简单的靠死记硬背了,一定要理解明白。

3、总结

(1)在通常的EEPROM应用中,单片机是主机,24C02是从机。
(2)无论是读操作还是写操作,SCL时钟线始终都是由主机控制的。
(3)写数据的时候应答信号由从机给出,表示从机是否正确接收了数据。
(4)读数据的时候应答信号则由主机给出,表示是否继续读下去。


 
 
 
  1. //读取指定地址的半字(16位数据)
  2. //faddr:读地址(此地址必须为2的倍数!!)
  3. //返回值:对应数据.
  4. u16 STMFLASH_ReadHalfWord(u32 faddr)
  5. {
  6. return *(vu16*)faddr;
  7. }
  8. #if STM32_FLASH_WREN //如果使能了写
  9. //不检查的写入
  10. //WriteAddr:起始地址
  11. //pBuffer:数据指针
  12. //NumToWrite:半字(16位)数
  13. void STMFLASH_Write_NoCheck(u32 WriteAddr,u16 *pBuffer,u16 NumToWrite)
  14. {
  15. u16 i;
  16. for(i= 0;i<NumToWrite;i++)
  17. {
  18. FLASH_ProgramHalfWord(WriteAddr,pBuffer[i]);
  19. WriteAddr+= 2; //地址增加2.
  20. }
  21. }


 
 
 
  1. //从指定地址开始写入指定长度的数据
  2. //WriteAddr:起始地址(此地址必须
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值