zhange 发表于 2024-7-29 11:44:02

Read Data 03h

先去测试这两个先看看

zhange 发表于 2024-7-29 11:48:22

本帖最后由 zhange 于 2024-7-29 12:31 编辑

先来读id吧慢慢来

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

测试下   




===

上边指令 不对   


读取id 应该为0x9f

zhange 发表于 2024-7-29 11:59:13




失败了   全是00000

zhange 发表于 2024-7-29 12:47:23

先前指令不对   现在读出来了

zhange 发表于 2024-7-29 12:49:29

读id指令 貌似好几个   用这个可以读出来读取id 应该为0x9f


其他的我再试下{:4_188:}{:4_188:}{:4_188:}先吃饭

angmall 发表于 2024-7-29 13:28:01

可以试试这个。


#define u8unsigned char
#define u16 unsigned int
#define u32 unsigned long
#define xu8xdata 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;//数据比较数组
        u16 i;
       
        FMQ_OUT=1;   //允许蜂鸣器输出
        w25q32_SectorErase(0); //擦除存储器0扇区
       
        for(i=0;i<256;i++)buf=i;//初始化数组
        w25q32_writepage(0,buf); //将初始化的数组写入存储器第0页
       
        for(i=0;i<256;i++)buf=0;
      w25q32_readpage(0,buf);//重新读出写入存储器的数据

        for(i=0;i<256;i++) //比较数据只要有一个数据不对则报警
        {
          if(buf!=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;
{
        u16 i;
w25q32_setaddress(padr*256);
        for(i=0;i<256;i++)p=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);//buf;
        spi_cs =1;
        w25q32_busy();
}








zhange 发表于 2024-7-29 14:27:21

angmall 发表于 2024-7-29 13:28
可以试试这个。




{:2_25:}多谢老哥    我得自己研究   老是看例程 学完就忘

zhange 发表于 2024-7-29 14:34:15

Release Power-down / ID ABh Dummy Dummy Dummy (ID7-ID0)(2)


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

zhange 发表于 2024-7-29 14:45:50

晚上在研究 读写   下午有事{:4_168:}{:4_168:}{:4_168:}

zhange 发表于 2024-7-29 14:47:46

soma 发表于 2024-7-29 11:32
32Mb的就是4M做中文字库完全足够啊

奥我一直以为是32m字节那   原来是位
页: 1 [2] 3
查看完整版本: 练习下驱动FLASH储存模块/W25Q32