关于STM32 SPI总线方式读取W25x16 FLASH芯片中的一个几天来一直不太理解的问题,今天终于在看w25x16数据手册的时候明白了一点。
数据手册中说道,在进行“页编程”时,写完一页(256个字节)之后,必须把地址改为0,不然的话,如果时钟还在继续,地址将自动变为页的开始地址,在某些时候,需要写入的字节不足256个字节的话,其他写入的字节都是无意义的。如果写入的字节大于256个字节,多于字节将会加上无用的字节覆盖刚刚写入的256个字节。所以需要保证写入字节小于或等于256个字节。
所以这也就是为什么在写入数据之前需要检查和擦除,擦除之后再重新写入数据的原因。接下来说说为什么检测的时候检测w25x16地址上面的数据是0xFF的原因。
数据手册中写道,“扇区擦除”指令将一个扇区(4K字节)擦出,擦出之后扇区都为1,扇区字节都为FFh。“块区擦出”指令将一个块区(64K字节)全部变为1,即字节都变为FFh。这也就是为什么检测FLASH芯片上面的数据必须保证为0XFF,如果不为0Xff则表示不正确或者上面有数据。如果需要在这个地址上面写入数据,就要参照上面所说的步骤,判断是否需要擦除整个块,扇区。
接下来,就是一直不太理解的为什么要随时往FLASH芯片中写入0XFF来读取数据,(今天看见了一个解释,觉得自己还是可以接受的)首先,写入0xFF不会使FLASH芯片中的数据发生变化(因为芯片中的数据都是0Xff),然后就是SPI发送虚拟数据,是为了得到数据,因为SPI在通信过程中,发送和接收是同时进行的,所以若是想主动获得对方的数据,需要SPI的通信时钟给对方,对方才会将发送寄存器中的数据发送回来。所以,发送虚拟数据的目的是为了得到时钟信号。 |