51單片機開發板(W25Q16學習)


教程資料

鏈接:https://pan.baidu.com/s/142JRSPisQO2Cu6VZ2Y5YrQ 密碼:eom0

今天測試開發板的W25Q16(16Mbit--Flash)寫一篇文章備忘一下

先說一下容量的單位

計算機存儲單位一般用B,KB、MB、GB、TB、PB、EB、ZB、YB、BB來表示,它們之間的關系是:    

位 bit (比特)(Binary Digits):存放一位二進制數,即 0 或 1,最小的存儲單位。    字節 byte:8個二進制位為一個字節(B),最常用的單位。

 

1KB(Kilobyte 千字節) = 2^10 B = 1024 B;    

1MB(Megabyte 兆字節) = 2^10 KB = 1024 KB = 2^20 B;    

1GB(Gigabyte 吉字節) = 2^10 MB = 1024 MB = 2^30 B;    

1TB(Trillionbyte 太字節) = 2^10 GB = 1024 GB = 2^40 B;  

 1PB(Petabyte 拍字節) = 2^10 TB = 1024 TB = 2^50 B;    

1EB(Exabyte 艾字節) = 2^10 PB = 1024 PB = 2^60 B;    

1ZB(Zettabyte 澤字節) = 2^10 EB = 1024 EB = 2^70 B;    

1YB(YottaByte 堯字節) = 2^10 ZB = 1024 ZB = 2^80 B;    

1BB(Brontobyte ) = 2^10 YB = 1024 YB = 2^90 B;    

1NB(NonaByte ) = 2^10 BB = 1024 BB = 2^100 B;    

1DB(DoggaByte) = 2^10 NB = 1024 NB = 2^110 B

 

所以16Mbit = 16*1024KB= 16384KB

16384KB = 16384*1024 bit = 16777216 bit

1字節=8位(bit)

也就是說W25Q16最多可以存儲16777216 /8 = 2097152個字節的數據

可以先看一下數據手冊

https://wenku.baidu.com/view/7b361c5cba1aa8114531d936.html

http://www.51hei.com/bbs/dpj-41029-1.html

 

芯片呢對2097152個字節進行了分配

每256個字節自己作為一頁   所以就有  2097152/ 256 = 8192頁

然后呢又對8192頁進行了分配    

每16頁作為一個扇區     所以就有  8192/ 16 = 512個扇區

還有就是 讓每 256頁作為一個塊

所以 就有 8192 / 256 = 32 個塊

 

每次寫數據之前需要先擦除

芯片規定最小擦除的單位是扇區,所以最小需要擦除16頁,也就是16*256 = 4096個字節,也可以說最小擦除的空間是4KB, 4096 / 1024 = 4KB

當然也可以使用塊擦除,那么每次擦除一個塊,也就是256頁  ,就是  256*256 = 65536個字節..  就是64KB   65536 / 1024 = 64KB

最后呢還有一個全片擦除指令,就是說寫一個指令就可以擦除整個空間

看資料上還有

 

 這個..............不確定...也可以擦除128頁???還是說W25Q80是可以擦除128頁....最后寫程序試一試就知道了....

然后呢就是一些指令...測試完所有的功能再寫

 附上自己的程序,,,,,,史上最簡單

/**
* @brief  SPI函數
* @param  value--發送的數據
* @param  None
* @param  None
* @retval None
* @example 
**/
unsigned char SPIWriteRead(unsigned char value)
{
    unsigned char i=0,temp=0;
    SPI_CLK = 0;//進入之前其實是高電平
    if(SPI_MISO)temp|=0x80;//接收數據
    for(i=0;i<8;i++)
    {
        SPI_MOSI=value&(0x80>>i);//准備數據
        SPI_CLK=1;
        SPI_CLK = 0;
        if(i<7)if(SPI_MISO)temp|=0x80>>(i+1);//接收數據
    }
    return temp;
}

測試

        SPI_CS=0;
        SPIWriteRead(W25X_PowerON_ID);
        SPIWriteRead(0xff);
        SPIWriteRead(0xff);
        SPIWriteRead(0xff);
        aa=SPIWriteRead(0xff);
        SPI_CS=1;
        
        printf("%X\r\n",(int)aa);
        
        DelayMs(1000);
        
        
        SPI_CS=0;
        SPIWriteRead(W25X_JEDEC_ID);
        aa=SPIWriteRead(0xff);
        bb=SPIWriteRead(0xff);
        cc=SPIWriteRead(0xff);
        SPI_CS=1;
        
        DelayMs(1000);
        
        
        printf("%X%X%X\r\n",(int)aa,(int)bb,(int)cc);
        DelayMs(1000);

 

#ifndef W25QXX_H_
#define W25QXX_H_

#ifndef W25QXX_C_
#define W25QXX_C_ extern
#else
#define W25QXX_C_
#endif

//以自己買的型號為准
#define  FLASH_ID              0xC84015   //GD25Q16CSIG  DeviceID 0x14
// #define  FLASH_ID              0xEF3015   //W25X16
// #define  FLASH_ID              0xEF4015     //W25Q16
// #define  FLASH_ID              0XEF4018   //W25Q128
// #define  FLASH_ID              0XEF4017   //W25Q64

#define W25X_ReadStatus       0x05      //讀狀態寄存器
#define W25X_WriteStatus      0x01      //寫狀態寄存器
#define W25X_ReadDATA8        0x03      //普讀_數據
#define W25X_FastRead         0x0B      //快讀_數據
#define W25X_DualOutput       0x3B      //快讀_雙輸出
#define W25X_Writepage        0x02      //寫_數據_0~255個字節
#define W25X_S_Erase          0x20      //扇區擦除4KB
#define W25X_B_Erase          0xD8      //塊區擦除64KB
#define W25X_C_Erase          0xC7      //整片格式化
#define W25X_PowerDown        0xB9      //待機
#define W25X_PowerON_ID       0xAB      //開機或是讀ID
#define W25X_JEDEC_ID         0x9F      //十六位的JEDEC_ID
#define W25X_WriteEnable      0x06      //寫允許
#define W25X_WriteDisable     0x04      //寫禁止


sbit SPI_CS    = P1^0;    // 片選
sbit SPI_MISO  = P1^1;    // 數據輸入引腳 
sbit SPI_MOSI  = P1^2;    // 數據輸出引腳  
sbit SPI_CLK   = P1^3;    // 時鍾

#endif

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM