w25q64扇区地址,写扇区错误

小科普 216

摘要:在单片机开发板上或者是核心板上通常会看到除了MCU之外的的芯片—EEPROM和FLASH,一般是AT24CXX、W25QXX这两颗芯片。但在利用单片机做一些项目的时候,比如做一个小车,驱动一些外设、显示一些温湿度信息等,却发现一般没有用到这些芯片。在做一些显示的时候却会用到。他们与单片机之间的通信方式就是IIC和SPI通信,在单片机的开发中用到的非常多。很多小伙伴就会说了,用OLED来显示一些数据,IIC通信直接用别人的代码,驱动SD卡或者NRF24L01直接拿别人的SPI代码就可以啊,难道我还自己去写驱动吗?

当然需要,学会了这些操作,层次就会提高很多,不信那就接着往下看!

EEPROM AT24C02存储器

学单片机的时候大家可能有一个问题,为啥是IIC读写EEPROM,而不是读写其他的东西。为什么大部分的单片机开发教程都教我利用IIC通信来读写EEPROM这颗AT24C02芯片?4针0.96寸OLED也是IIC操作的,为啥他们不叫我如何利用IIC通信来操作OLED?

原因很简单,主要是读写EEPROM你学完了没有成就感,会读写EEPROM又怎么样?归根到底是没有掌握IIC体会到IIC通信的重要性。今年疫情很严重,有一款红外测温芯片mlx90641就是通过IIC来读取温度的。

我想如果教程是IIC读写红外测温芯片,大家可能会比较感兴趣。言归正传,来说一说EEPROM。

ROM是Read Only Memory的缩写,意为只能读的存储器。由于技术的发展,后来设计出了可以方便写入数据的 ROM,而这个Read Only Memory的名称被沿用下来了。EEPROM(Electrically Erasable Programmable ROM)是电可擦除存储器。EEPROM 可以重复擦写,EEPROM 是一种掉电后数据不丢失的存储器,常用来存储一些配置信息,以便系统重新上电的时候加载之。它的擦除和写入都是直接使用电路控制,不需要再使用外部设备来擦写。而且可以按字节为单位修改数据,无需整个芯片擦除。现在主要使用的ROM芯片都是EEPROM。24C02是一个2K Bit的串行EEPROM存储器(掉电不丢失),内部含有256个字节,在24C02里面有一个8字节的页写缓冲器。

操作任何的IIC设备一般都要知道从机地址,也就是利用单片机操作读写的那个设备的地址。一般来说对于IIC设备地址是7位,其中高 4 位固定为:1010 b,低 3 位则由 A0/A1/A2信号线的电平决定。所以一个IIC总线上可以挂载2^3=8个EEPROM芯片,当然一般一个单片机只有一块EEPROM芯片,所以我们直接把这个A2A1A0接地即可,当然接VCC也没有问题,如果接GND那么地址就是1010000(0X50),如果接VCC那么地址就是1010111(0X57)。

3年嵌入式物联网学习资源整理分享:C语言、Linux开发、数据结构;软件开发,STM32单片机、ARM硬件开发、物联网通信开发、综合项目开发教程资料;笔试面试真题。点击下方插件免费领取↓↓↓https://s.pdb2.com/l/cnklSITCGo24eIn

因为24C02是一个2K Bit的串行EEPROM存储器(掉电不丢失),内部含有256个字节。也就是说有256个存储单元,一个字节就是一个存储单元,因为每个字节可以出存256个数,也就是说每个存储单元可以存0~255个数。我们可以这样理解,AT24C02是一栋教学楼,这个教学楼有256个房间(存储单元),没每个房间可以容纳256个学生(每个存储单元可以存储0 ~ 255个数)。而且这个芯片在断电的时候数据不会丢失,利用掉电不会丢失以及这款芯片容量不大的特性,可以大致判断它会在哪些地方可以用到。比如我们看电视得时候,正在看CCTV6电影频道,播放的声音比较大,那么这时候正好停电了。那么你下次来电时你打开电视机,电视机默认肯定是CCTV6电影频道,播放的声音也是很大。那么这些频道、音量这些数据就存在EEPROM里面,至于是不是ATC02就不一定了。

总结:

存储量少,用起来方便可以任意访问地址数据,每一个存储单片可以独立访问,写入前是不需要对写入的单片做独立的擦除

这三个特点对我们理解存储器的特性非常重要,因为接下来要说的FLASH芯片的特性就与它完全相反。

FLASH W25Q128存储器

FLSAH字面意思就是闪现、一瞬间的意思,所以FLSAH存储器又称闪存,与 EEPROM都是掉电后数据不丢失的存储器,但FLASH存储器容量普遍大于 EPROM,现在基本取代了它的地位。生活中常用的 U 盘、SD卡、SSD 固态硬盘以及我们 STM32 芯片内部用于存储程序的设备,都是 FLASH 类型的存储器。在存储控制上,最主要的区别是 FLASH 芯片只能一大片一大片地擦写,而 EEPROM可以单个字节擦写。

FLASH 芯片的最小擦除单位为扇区(Sector),而一个块(Block)包含 16 个扇区,4Kbytes为一个Sector,16个扇区为1个Block。W25Q64 容量为8M字节(即 64M bit), 分为128块(Block),每一块的大小为64K字节,每块又分为16个扇区(Sector),那么每个扇区就是4K个字节。W25Q128 容量为16M字节(即 128M bit),分为256块(Block),每一块的大小为64K字节,每块又分为16个扇区(Sector),那么每个扇区就是4K个字节(4096个字节,也就是4096个存储单元)。

W25Qxx的最小擦除单位为一个扇区,也就是每一次必须擦除4K字节。所以必须给W25Qxx开辟至少4K的缓冲区,这样对单片机的RAM的要求比较高,要求芯片必须有4K以上的RAM才能很好的操作。所有的FLASH我们在写之前都要擦出对应的扇区,擦除后的数据是0XFF。我们可以这样理解。我们要改写FLASH芯片W25Q128的一个扇区中某一个数据,就必须在STM32芯片的内部RAM中开辟4K字节(4096字节)的缓冲区域。先把FLASH芯片W25Q128的一个扇区中数据全部读到STM32芯片的内部RAM中开辟4K字节(4096字节)的缓冲区域中去,把我们要改写的数据在缓冲区域改写好之后,再把FLASH芯片W25Q128的一个扇区中的数据全部擦除完毕,擦除完成之后再把数据写回去。这是写入数据的操作,在读数据的时候不需要以扇区为单位,想读哪个扇区就读哪个扇区的数据。

/*************************************************************************
* Function Name : SPI_Flash_Write
* Description : 在指定地址开始写入指定长度的数据,该函数带擦除操作!
* Input : *pBuffer:要写入数据的指针
WriteAddr:开始写入的地址(24bit)
NumByteToWrite:要写入的字节数(最大16 x 1024 x 1024)
* Output : None
* Return : None
****************************************************************************/voidSPI_Flash_Write(u8* pBuffer, u32WriteAddr, u16NumByteToWrite)
{
u8NumOfPage=0,NumOfSingle=0,Addr=0,count=0, temp =0;Addr=WriteAddr@96;//mod运算求余,若writeAddr是4096整数倍,运算结果Addr值为0NumOfPage=NumByteToWrite/4096;//计算出要写多少整数扇区NumOfSingle=NumByteToWrite@96;//mod运算求余,计算出剩余不满一扇区的字节数count=4096-Addr;//差count个数据值,刚好可以对齐到扇区地址if(Addr==0)//Addr=0,则WriteAddr刚好按扇区对齐或者说小于一个扇区{//NumByteToWrite

上一篇:

下一篇:

  推荐阅读

分享