• 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
    ",(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
    ",(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
  • 相关阅读:
    python之private variable
    python实例、类方法、静态方法
    python常用option
    access
    FD_CLOEXEC
    fork后父子进程文件描述问题
    split
    信号
    kill
    进程组&Session
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/8806984.html
Copyright © 2020-2023  润新知