找回密码
 立即注册
楼主: zhange

练习下驱动FLASH储存模块/W25Q32

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:235
  • 最近打卡:2025-05-03 08:35:47

61

主题

818

回帖

1498

积分

金牌会员

积分
1498
发表于 2024-7-29 11:44:02 | 显示全部楼层
Read Data 03h

先去测试这两个先看看
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:235
  • 最近打卡:2025-05-03 08:35:47

61

主题

818

回帖

1498

积分

金牌会员

积分
1498
发表于 2024-7-29 11:48:22 | 显示全部楼层
本帖最后由 zhange 于 2024-7-29 12:31 编辑

先来读id吧  慢慢来

0xab   是读取id指令  发送后 芯片会返回3个字节的id数据  

测试下   




===

上边指令 不对   


读取id 应该为0x9f
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:235
  • 最近打卡:2025-05-03 08:35:47

61

主题

818

回帖

1498

积分

金牌会员

积分
1498
发表于 2024-7-29 11:59:13 | 显示全部楼层
截图202407291158593632.jpg


失败了   全是00000
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:235
  • 最近打卡:2025-05-03 08:35:47

61

主题

818

回帖

1498

积分

金牌会员

积分
1498
发表于 2024-7-29 12:47:23 | 显示全部楼层
先前指令不对   现在读出来了

截图202407291247194698.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:235
  • 最近打卡:2025-05-03 08:35:47

61

主题

818

回帖

1498

积分

金牌会员

积分
1498
发表于 2024-7-29 12:49:29 | 显示全部楼层
读id指令 貌似好几个   用这个可以读出来  读取id 应该为0x9f


其他的我再试下  先吃饭
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:523
  • 最近打卡:2025-05-03 00:05:21

10

主题

1159

回帖

5125

积分

论坛元老

积分
5125
发表于 2024-7-29 13:28:01 | 显示全部楼层
可以试试这个。


#define u8  unsigned char
#define u16 unsigned int
#define u32 unsigned long
#define xu8  xdata unsigned char
#define xu16 xdata unsigned int
#define xu32 xdata unsigned long
       
#include "STC8H.h"


sbit spi_cs  =P2^5;
sbit spi_sck =P3^7;
sbit spi_mosi=P3^5;
sbit spi_miso=P3^6;
sbit FMQ_OUT=P3^3; //定义蜂鸣器输出使能io

u8 spi_rwbyte(u8 dat);
void delay_ms(u8 n);
void w25q32_readpage(u32 padr,u8 *p);
void w25q32_writepage(u32 padr,u8 *p);
void w25q32_SectorErase(u32 sadr);


/******************************************************************
- 函数名称:main()
- 功能说明:主程序
- 参数说明:无

- 返回说明:无
- 备注说明:使用51单片机,晶体频率:22.1184MHZ-1T模式
******************************************************************/
void main()
{
        xu8 buf[256];  //数据比较数组
        u16 i;
       
        FMQ_OUT=1;     //允许蜂鸣器输出
        w25q32_SectorErase(0); //擦除存储器0扇区
       
        for(i=0;i<256;i++)buf[i]=i;  //初始化数组
        w25q32_writepage(0,buf); //将初始化的数组写入存储器第0页
       
        for(i=0;i<256;i++)buf[i]=0;
        w25q32_readpage(0,buf);  //重新读出写入存储器的数据

        for(i=0;i<256;i++) //比较数据只要有一个数据不对则报警
        {
          if(buf[i]!=i)FMQ_OUT =0;
        }
       
        while(1)
        {
        }
}

/******************************************************************
- 函数名称:delay_ms(u8 n)
- 功能说明:ms延时函数
- 参数说明:延时值,单位ms

- 返回说明:无
- 备注说明:使用51单片机,外部晶体频率:22.1184MHZ-1T模式
******************************************************************/
void delay_ms(u8 n)  
{
  u8 a,b,c;
  while(n--)
        {
          for(c=5;c>0;c--)
            for(b=68;b>0;b--)
              for(a=31;a>0;a--);
        }
}
/******************************************************************
- 函数名称:u8 spi_rwbyte(u8 dat)
- 功能说明:spi软件模拟读写函数
- 参数说明:要发送的数据

- 返回说明:读取的数据
- 备注说明:使用51单片机,晶体频率:22.1184MHZ-1T模式
******************************************************************/
u8 spi_rwbyte(u8 dat)
{
  u8 i,tmp=0;
        for(i=0x80;i!=0;i>>=1)
        {
          spi_sck =0;
                spi_mosi =(dat&i)?1:0;
                spi_sck =1;
                if(spi_miso)tmp|=i;
        }
       
        return tmp;
}

/******************************************************************
- 函数名称:w25q32_wen()
- 功能说明:存储器写使能
- 参数说明:无

- 返回说明:无
- 备注说明:使用51单片机,晶体频率:22.1184MHZ-1T模式
******************************************************************/
void w25q32_wen()
{
  spi_cs =0;
        spi_rwbyte(0x06);
        spi_cs =1;
}

/******************************************************************
- 函数名称:w25q32_busy()
- 功能说明:存储器写判忙
- 参数说明:无

- 返回说明:无
- 备注说明:使用51单片机,晶体频率:22.1184MHZ-1T模式
******************************************************************/
void w25q32_busy()
{
        u8 sr;
        do
        {
                spi_cs =0;
          spi_rwbyte(0x05);//rsr
          sr =spi_rwbyte(0xff);
                spi_cs =1;
        }while(sr&0x01);
}

/******************************************************************
- 函数名称:w25q32_SectorErase(u32 sadr)
- 功能说明:存储器删除擦除
- 参数说明:当前要擦除的扇区

- 返回说明:无
- 备注说明:使用51单片机,晶体频率:22.1184MHZ-1T模式
******************************************************************/
void w25q32_SectorErase(u32 sadr)//0,1,n=(0~4095)(4096+2096)
{
  w25q32_wen();  //0 = (0x00)0000 0000  -> 0001 0000
        sadr *=4096;
        spi_cs =0;
        spi_rwbyte(0x20);
        spi_rwbyte(sadr>>16); // 0x00123456
        spi_rwbyte(sadr>>8);
        spi_rwbyte(sadr);
        spi_cs =1;
        w25q32_busy();
}

/******************************************************************
- 函数名称:w25q32_ChipErase()
- 功能说明:存储器整片擦除
- 参数说明:无

- 返回说明:无
- 备注说明:使用51单片机,晶体频率:22.1184MHZ-1T模式
******************************************************************/
void w25q32_ChipErase()
{
  w25q32_wen();
        spi_cs =0;
        spi_rwbyte(0x60);
        spi_cs =1;
        w25q32_busy();
}

/******************************************************************
- 函数名称:w25q32_setaddress(u32 adr)
- 功能说明:设置存储器内存地址
- 参数说明:当前要设置的字节地址

- 返回说明:无
- 备注说明:使用51单片机,晶体频率:22.1184MHZ-1T模式
******************************************************************/
void w25q32_setaddress(u32 adr)
{
  spi_cs =0;
        spi_rwbyte(0x03);
        spi_rwbyte(adr>>16);
        spi_rwbyte(adr>>8);
        spi_rwbyte(adr);
}

/******************************************************************
- 函数名称:w25q32_readpage(u32 padr,u8 *p)
- 功能说明:存储器读一页数据
- 参数说明:padr页地址,p数据缓冲区指针

- 返回说明:无
- 备注说明:使用51单片机,晶体频率:22.1184MHZ-1T模式
******************************************************************/
void w25q32_readpage(u32 padr,u8 *p)//buf[256];
{
        u16 i;
  w25q32_setaddress(padr*256);
        for(i=0;i<256;i++)p[i]=spi_rwbyte(0xff);
        spi_cs =1;
}

/******************************************************************
- 函数名称:w25q32_writepage(u32 padr,u8 *p)
- 功能说明:存储器写一页数据
- 参数说明:padr页地址,p数据缓冲区指针

- 返回说明:无
- 备注说明:使用51单片机,晶体频率:22.1184MHZ-1T模式
******************************************************************/
void w25q32_writepage(u32 padr,u8 *p)//0,1,2,n
{
        u16 i;
  w25q32_wen();
        padr *=256;
        spi_cs =0;
        spi_rwbyte(0x02);
        spi_rwbyte(padr>>16);
        spi_rwbyte(padr>>8);
        spi_rwbyte(padr);
       
        for(i=0;i<256;i++)spi_rwbyte(p[i]);//buf[256];
        spi_cs =1;
        w25q32_busy();
}








回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:235
  • 最近打卡:2025-05-03 08:35:47

61

主题

818

回帖

1498

积分

金牌会员

积分
1498
发表于 2024-7-29 14:27:21 | 显示全部楼层
angm*** 发表于 2024-7-29 13:28
可以试试这个。

  多谢老哥    我得自己研究   老是看例程 学完就忘
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:235
  • 最近打卡:2025-05-03 08:35:47

61

主题

818

回帖

1498

积分

金牌会员

积分
1498
发表于 2024-7-29 14:34:15 | 显示全部楼层
Release Power-down / ID ABh Dummy Dummy Dummy (ID7-ID0)(2)


这个ab指令 读出来是 0x15   不知道干嘛的   翻译出来是释放断电???  谁研究过??
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:235
  • 最近打卡:2025-05-03 08:35:47

61

主题

818

回帖

1498

积分

金牌会员

积分
1498
发表于 2024-7-29 14:45:50 | 显示全部楼层
晚上在研究 读写   下午有事
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:235
  • 最近打卡:2025-05-03 08:35:47

61

主题

818

回帖

1498

积分

金牌会员

积分
1498
发表于 2024-7-29 14:47:46 | 显示全部楼层
so*** 发表于 2024-7-29 11:32
32Mb的就是4M做中文字库完全足够啊

奥  我一直以为是32m字节那     原来是位  
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 13:02 , Processed in 0.245295 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表