zoukankan      html  css  js  c++  java
  • SPI Flash(W25Q16DV) 基本操作

    读取厂家设备 ID

    发送 90H 指令,再发送 00h 的地址,然后接收即可。

    代码如下:

    void SPIFlashReadID(int *pMID, int *pDID)
    {
        SPIFlash_Set_CS(0); /* 选中SPI FLASH */
    
        SPISendByte(0x90);
    
        SPIFlashSendAddr(0);
    
        *pMID = SPIRecvByte();
        *pDID = SPIRecvByte();
    
        SPIFlash_Set_CS(1);
    }
    

    两个状态寄存器

    通过状态寄存器可以查询芯片此时是否忙碌、解除各种保护操作等。

    写状态寄存器

    /* 通过 BUSY 位得知芯片是否忙碌 */
    static void SPIFlashWaitWhenBusy(void)
    {
        while (SPIFlashReadStatusReg1() & 1);
    }
    
    /* 使能操作 */
    static void SPIFlashWriteEnable(int enable)
    {
        if (enable)
        {
            SPIFlash_Set_CS(0);
            SPISendByte(0x06);
            SPIFlash_Set_CS(1);
        }
        else
        {
            SPIFlash_Set_CS(0);
            SPISendByte(0x04);
            SPIFlash_Set_CS(1);
        }
    }
    
    /* 写状态寄存器 */
    static void SPIFlashWriteStatusReg(unsigned char reg1, unsigned char reg2)
    {    
        SPIFlashWriteEnable(1);  
        
        SPIFlash_Set_CS(0);
        SPISendByte(0x01);
        SPISendByte(reg1);
        SPISendByte(reg2);
        SPIFlash_Set_CS(1);
    
        SPIFlashWaitWhenBusy();
    }
    

    擦除操作

    /* erase 4K */
    void SPIFlashEraseSector(unsigned int addr)
    {
        SPIFlashWriteEnable(1);  
    
        SPIFlash_Set_CS(0);
        SPISendByte(0x20);
        SPIFlashSendAddr(addr);
        SPIFlash_Set_CS(1);
    
        SPIFlashWaitWhenBusy();
    }
    

    读写数据

    /* program */
    void SPIFlashProgram(unsigned int addr, unsigned char *buf, int len)
    {
        int i;
        
        SPIFlashWriteEnable(1);  
    
        SPIFlash_Set_CS(0);
        SPISendByte(0x02);
        SPIFlashSendAddr(addr);
    
        for (i = 0; i < len; i++)
            SPISendByte(buf[i]);
        
        SPIFlash_Set_CS(1);
    
        SPIFlashWaitWhenBusy();
        
    }
    
    /* read */
    void SPIFlashRead(unsigned int addr, unsigned char *buf, int len)
    {
        int i;
        
        SPIFlash_Set_CS(0);
        SPISendByte(0x03);
        SPIFlashSendAddr(addr);
        for (i = 0; i < len; i++)
            buf[i] = SPIRecvByte();
    
        SPIFlash_Set_CS(1);    
    }
    

    芯片的操作指令表

    下一篇文章写出 Flash 在 Linux 上的驱动程序。

  • 相关阅读:
    DockerFile构建镜像
    docker基本命令
    docker持久化
    JS 中 this 指向问题
    解决"/usr/local/bin/dockercompose: Permission denied"问题
    docker配置国内镜像
    docker网络
    国内常用镜像地址
    Visual Studio中快捷键收缩和展开代码段方法
    STM32中关于RCC时钟的理解
  • 原文地址:https://www.cnblogs.com/GyForever1004/p/8536919.html
Copyright © 2011-2022 走看看