一、硬件?
二、W25Q64简介与API函数?
1)
W25Q有很多系列,其区别就是存储容量不一样
以我现在使用的举例W25Q64
64指的是64Mbit,不是64M字节要区分清楚
64Mbit = 8Mbyte,所以总的容量能存储8MByte
2)
W25q64的存储分为块、扇区、页
一页:256Byte? 一个扇区:16页 = 4096Byte? 一块:16个扇区;总共是32块
3)写注意事项
Flash的写的有个特性跟EEPROM一样,就是它的一页是256个Byte,也就是在写入的时候,一次最多可以写入256个字节的数据,超过了需要自行在代码中处理,一次最多编程256字节,写超的话会对当前页的前面数据进行覆盖。
4)读
读有没有像写这样我没去研究过,我直接使用跟写一样的方法,一旦跨页进行判断处理
5)檫除注意事项
由图片可知,檫除最小单位是扇区檫除,不能单独檫除页,所以你在使用时要合理分配空间,将相同数据分配在同一个扇区,如果跨扇区你在檫除就比较麻烦,因为它不能以页檫除
综上就是我使用遇到值得注意的问题,至于驱动代码时序我没记录了,很多博主开源了很多?
下面是我在读写中做的跨页代码
#define PAGE_SIZE ? 256u//页空间256Byte
void WriteParamBlock(uint32_t pBlock,uint8_t *pData,uint16_t Len)
{
?? ? ?uint16_t j,temp;
?? ??? ?
?? ? ?int num = (pBlock%PAGE_SIZE)+Len;
? ??? ?num = num - PAGE_SIZE;//是否需要“跨”页写
?? ??? ?
?? ??? ?if(num<1)?? ?//当页可以写完
?? ??? ?{
?? ??? ??? ?FlashSpiPageProgram(pBlock,pData,Len);
?? ??? ?}
?? ??? ?else //跨页
?? ??? ?{
?? ??? ??? ?while(Len)
?? ??? ??? ?{
?? ??? ??? ??? ?temp = PAGE_SIZE-(pBlock%PAGE_SIZE);//确定当页可写的数量,最大256字节
?? ??? ??? ??? ?if(Len>=temp)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?FlashSpiPageProgram(pBlock,pData,temp);
?? ??? ??? ??? ??? ?pData += temp;
?? ??? ??? ??? ??? ?Len -= temp;
?? ??? ??? ??? ??? ?pBlock += temp;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else if(Len<temp)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?FlashSpiPageProgram(pBlock,pData,Len);
?? ??? ??? ??? ??? ?pData += Len;
?? ??? ??? ??? ??? ?Len -= Len;
?? ??? ??? ??? ??? ?pBlock += Len;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}?? ?
}void ReadParamBlock(uint32_t pBlock,uint8_t *pData,uint16_t Len)
{
? ? uint16_t j,temp;
?? ??? ?
?? ? ?int num = (pBlock%PAGE_SIZE)+Len;
? ??? ?num = num - PAGE_SIZE;//是否需要“跨”页读
?? ??? ?
?? ??? ?if(num<1)?? ?//当页可以读取完
?? ??? ?{
?? ??? ??? ?FlashSpiRead(pBlock,pData,Len);
?? ??? ??? ?pData += Len;
?? ??? ?}
?? ??? ?else //跨页
?? ??? ?{
?? ??? ??? ?while(Len)
?? ??? ??? ?{
?? ??? ??? ??? ?temp = PAGE_SIZE-(pBlock%PAGE_SIZE);//确定当页可读的数量,最大256字节
?? ??? ??? ??? ?if(Len>=temp)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?FlashSpiRead(pBlock,pData,temp);//将此页读取完
?? ??? ??? ??? ??? ?pData += temp;
?? ??? ??? ??? ??? ?Len -= temp;
?? ??? ??? ??? ??? ?pBlock += temp;
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else if(Len<temp)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?FlashSpiRead(pBlock,pData,Len);//将此页读取完
?? ??? ??? ??? ??? ?pData += Len;
?? ??? ??? ??? ??? ?Len -= Len;
?? ??? ??? ??? ??? ?pBlock += Len;
?? ??? ??? ??? ?}
?? ??? ??? ?}}