STC12控制w25q64读写问题

2019-07-15 22:52发布

我是新手,第一次接触flash存储器件,刚刚手里有一块W25Q64,不知道该如何下手,在网上搜索了一些资料,自己又研究了几天,一知半解的写了一个程序,请大家帮忙改改,最好能详细说明一下,让我好好学习一下,这个程序是要按键1(key1),写入数据,不知道我的这个连写两个程序是不是对,按键2(key2)读出两个地址数据,并让LED等点亮。W25Q64中文数据说明
http://wenku.baidu.com/view/8ce445620b1c59eef8c7b4ce.html

************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************
#include<reg52.h>
#include<intrins.h>

#define uint unsigned int
#define uchar unsigned char
#define uint8 unsigned char
#define uint16 unsigned int
#define uint32 unsigned long

#define W25P_writeenable 0x06        //写使能
#define W25P_writedisable 0x04                 //写禁能
#define W25P_readstatusreg 0x05                 //读状态寄存器
#define W25P_writestatusreg 0x01                 //写状态寄存器
#define W25P_readdata 0x03                         //读数据
#define W25P_fastreaddata 0x0b                 //快读
#define W25P_pageprogram 0x02                 //页编程
#define W25P_sectorerase 0x20                 //扇区擦除
#define W25P_chiperase 0xc7                         //芯片擦除
#define W25P_powerdown 0xb9                         //掉电
#define W25P_releasepowerdown 0xab         //释放掉电
#define W25P_deviceID 0xab                         //器件ID
#define W25P_manufactdeviceID 0x90         //制造器件ID
#define W25P_jedecdeviceID 0x9f                 //JEDEC ID

sbit key1=P2^0;
sbit key2=P2^1;
sbit key3=P2^2;
sbit key4=P2^3;
sbit led1=P1^0;
sbit led2=P1^1;
sbit led3=P1^2;
sbit led4=P1^3;

sbit HOLD=P3^0;
sbit WP=P3^1;
sbit CS=P3^2;
sbit DI=P3^3;
sbit DO=P3^4;
sbit CLK=P3^5;

void IO_send_byte(uchar out);
uchar IO_get_byte();
void IO_wait_busy();
void IO_init();
uchar IO_read_statusreg();
void IO_write_statusreg(byte);
void IO_write_enable();
void IO_powerdown();
void IO_releasepowerdown();
uchar IO_read_ID1();
uint IO_read_ID2(uchar ID_Addr);
uchar IO_read_byte(uint32 DST_Addr);
void IO_read_nbyte(uint32 DST_Addr,uchar nbyte_128);
uchar IO_fastread_byte(uint32 Dst_Addr);
void IO_fastread_nbyte(uint32 Dst_Addr,uchar nbyte_128);
void IO_write_byte(uint32 Dst_Addr,uchar byte);
void IO_write_byte(uint32 Dst_Addr,uchar nbyte_128);
void IO_erase_chip();
void IO_erase_sector(uint32 Dst_Addr);
void verify(uchar byte,uchar cor_byte);
void IO_write_disable();
void trace(uchar *str,uchar len);
uint IO_read_ID3();
uint8 Rxtemp;
bit MYti;
uint8 tx_buff[16];
uint8 upper_128[16];
bit rx_ok;

#define nop() _nop_()



void delay(uchar tt)
{
        while(tt--);
}
void main()
{
        uint j;
        uchar t;
        uint32 dizhi;
        IO_init();

        for(;;)
        {
                if(key1==0)
                {
                        IO_read_ID1();

                        IO_write_enable();
                       
                        IO_erase_chip();
                       
                        IO_write_byte(0x000000,0x01);                //0x0000000地址写入0x01
                        IO_write_byte(0x000001,0x02);            //0x0000001地址写入0x02

                                                       
                }
                if(key2==0)
                {
                        dizhi=0x0000000;

                        for(t=0;t<2;t++)
                        {
                                j=IO_read_byte(dizhi);
                                dizhi++;
                                if(j==0x01)
                                        led1=0;
                                if(j==0x02)
                                        led2=0;
                        }
                }
        }
}
/* ********************************

***********************************


                                送出

***********************************

**********************************/
void IO_send_byte(uchar out)
{
        uchar i=0;
        CS=0;
        for(i=0;i<8;i++)
        {
                if((out&0x80)==0x80)
                        DI=1;
                else
                        DI=0;
                CLK=1;
                out=(out<<1);
                nop();
                nop();
                nop();
                nop();
                CLK=0;

        }
}
/* ********************************

***********************************


                                得到数据

***********************************

**********************************/
uchar IO_get_byte()
{
        uchar i=0,in=0,temp=0;
        CS=0;
        for(i=0;i<8;i++)
        {
                in=(in<<1);
                temp=DO;
                CLK=1;
                if(temp==1);
                in |=0x01;
                CLK=0;
        }
        return in;
}
/* ********************************

***********************************


                等待忙结束

***********************************

**********************************/
void IO_Wait_Busy()
{
        while(IO_read_statusreg()==0x03)
                IO_read_statusreg();

}
/* ********************************

***********************************


                SPI初始化

***********************************

**********************************/
void IO_init()
{
        CLK=0;
        WP=1;
        CS=1;
        IO_write_disable();  //写禁能
}
/* ********************************

***********************************


                读状态寄存器

***********************************

**********************************/
uchar IO_read_statusreg()
{
        uchar byte=0;
        CS=0;
        IO_send_byte(W25P_readstatusreg); //发送读状态寄存器命令 0x05
        byte=IO_get_byte();                                  //接收读状态寄存器数据值
        CS=1;
        return byte;
}
/* ********************************

***********************************


                写状态寄存器

***********************************

**********************************/
void IO_write_statusreg(byte)
{
        CS=0;
        IO_send_byte(W25P_writestatusreg);
        IO_send_byte(byte);
        CS=1;
}


/* ********************************

***********************************


                写使能

***********************************

**********************************/
void IO_write_enable()
{
        CS=0;
        IO_send_byte(W25P_writeenable);   //发送写使能命令 0x01
        CS=1;
}

/* ********************************

***********************************


                掉电

***********************************

**********************************/

void IO_powerdown()
{
        CS=0;
        IO_send_byte(W25P_powerdown);
        CS=1;
        delay(6);
}
/* ********************************

***********************************


                释放掉电

***********************************

**********************************/
void IO_releasepowerdown()
{
        CS=0;
        IO_send_byte(W25P_releasepowerdown);//发送释放掉电命令
        CS=1;
        delay(6);
}
/* ********************************

***********************************


                读取器件ID1

***********************************

**********************************/
uchar IO_read_ID1()
{
        uchar byte;
        CS=0;
        IO_send_byte(W25P_deviceID);
        IO_send_byte(0);                   //发送3个伪地址
        IO_send_byte(0);
        IO_send_byte(0);
        byte=IO_get_byte();
        CS=1;
        delay(4);
        return byte;
}
/* ********************************

***********************************


                读取制造器件ID2

***********************************

**********************************/
uint IO_read_ID2(uchar ID_Addr)
{
        uint IData16;
        CS=0;
        IO_send_byte(W25P_manufactdeviceID);
        IO_send_byte(0x00);                  
        IO_send_byte(0x00);
        IO_send_byte(ID_Addr);
        IData16=IO_get_byte()<<8;
        IData16|=IO_get_byte();
        CS=1;
       
        return IData16;
}
/* ********************************

***********************************


                  读JEDEC ID

***********************************

**********************************/
uint IO_read_ID3()
{
        uint IData16;
        CS=0;
        IO_send_byte(0x9f);
        IData16=IO_get_byte()<<8;
        IData16=IO_get_byte();
        tx_buff[2]=IO_get_byte;
        CS=1;
       
        return IData16;
}
/* ********************************

***********************************


                  读数据地址

***********************************

**********************************/
uchar IO_read_byte(uint32 Dst_Addr)
{
        uchar byte=0;
        CS=0;
        IO_send_byte(W25P_readdata);
        IO_send_byte((uchar)((Dst_Addr&0xffffff)>>16));
        IO_send_byte((uchar)((Dst_Addr&0xffff)>>8));
        IO_send_byte((uchar)(Dst_Addr&0xff));
        byte=IO_get_byte;
        CS=1;
        return byte;
}
/* ********************************

***********************************


                  读数据起始128个字节以内的内容

***********************************

**********************************/
void IO_read_nbyte(uint32 Dst_Addr,uchar nbytes_128)
{
        uchar i=0;
        CS=0;
        IO_send_byte(W25P_readdata);
        IO_send_byte((uchar)((Dst_Addr&0xffffff)>>16));
        IO_send_byte((uchar)((Dst_Addr&0xffff)>>8));
        IO_send_byte((uchar)(Dst_Addr&0xff));
        for(i=0;i<nbytes_128;i++)
        {
                upper_128=IO_get_byte();
        }
        CS=1;
}
/* ********************************

***********************************


                  快读数据

***********************************

**********************************/
uchar IO_fastread_byte(uint32 Dst_Addr)
{
        uchar byte=0;
        CS=0;
        IO_send_byte(W25P_fastreaddata);
        IO_send_byte((uchar)((Dst_Addr&0xffffff)>>16));
        IO_send_byte((uchar)((Dst_Addr&0xffff)>>8));
        IO_send_byte((uchar)(Dst_Addr&0xff));
        IO_send_byte(0xff);
        byte=IO_get_byte();    //发送8个虚拟字节
        CS=1;
        return byte;
}
/* ********************************

***********************************


                  快读数据起始128个字节以内的内容

***********************************

**********************************/
void IO_fastread_nbyte(uint32 Dst_Addr,uchar nbytes_128)
{
        uchar i=0;
        CS=0;
        IO_send_byte(W25P_fastreaddata);
        IO_send_byte((uchar)((Dst_Addr&0xffffff)>>16));
        IO_send_byte((uchar)((Dst_Addr&0xffff)>>8));
        IO_send_byte((uchar)(Dst_Addr&0xff));
        IO_send_byte(0xff);
        for(i=0;i<nbytes_128;i++)
        {
                upper_128=IO_get_byte();
        }
        CS=1;
}
/* ********************************

***********************************


                页编程

***********************************

**********************************/
void IO_write_byte(uint32 Dst_Addr,uchar byte)
{
        CS=0;
        IO_write_enable();
        IO_wait_busy();
        CS=0;
        IO_send_byte(W25P_pageprogram);
        IO_send_byte((uchar)((Dst_Addr&0xffffff)>>16));
        IO_send_byte((uchar)((Dst_Addr&0xffff)>>8));
        IO_send_byte((uchar)(Dst_Addr&0xff));
        IO_send_byte(byte);
        CS=1;
}

/* ********************************

***********************************


                页编程128字节内容

***********************************

**********************************/
void IO_write_nbyte(uint32 Dst_Addr,uchar nbyte_128)
{
        uchar byte,i;
        CS=0;
        IO_write_enable();
        CS=0;
        IO_send_byte(W25P_pageprogram);
        IO_send_byte((uchar)((Dst_Addr&0xffffff)>>16));
        IO_send_byte((uchar)((Dst_Addr&0xffff)>>8));
        IO_send_byte((uchar)(Dst_Addr&0xff));
        for(i=0;i<nbyte_128;i++)
        {
                byte=upper_128;
                IO_send_byte(byte);
        }
        CS=1;
}
/* ********************************

***********************************


                芯片擦除

***********************************

**********************************/
void IO_erase_chip()
{
        CS=0;
        IO_write_enable();
        CS=0;
        IO_wait_busy();
        CS=0;
        IO_send_byte(W25P_chiperase);
        CS=1;
}
/* ********************************

***********************************


                扇区擦除

***********************************

**********************************/
void IO_erase_sector(uint32 Dst_Addr)
{
        CS=0;
        IO_write_enable();
        CS=0;
        IO_send_byte(W25P_sectorerase); //擦除扇区
        IO_send_byte((uchar)((Dst_Addr & 0xFFFFFF)>>16));
        IO_send_byte((uchar)((Dst_Addr & 0xFFFF)>>8));
        IO_send_byte((uchar)(Dst_Addr & 0xFF));
        CS=1;
}
/* ********************************

***********************************


                判断

***********************************

**********************************/
void verify(uchar byte,uchar cor_byte)
{
        if(byte!=cor_byte)
        {
                while(1);
        }
}
/* ********************************

***********************************


                写禁能

***********************************

**********************************/
void IO_write_disable()
{
        CS=0;
        IO_send_byte(W25P_writedisable);
        CS=1;
}
/* ********************************

***********************************


                发送字符

***********************************

**********************************/
void myputchar(uchar c)
{
        ES=0;
        SBUF=c;
        while(TI==0);
        TI=0;
        ES=1;

}
/* ********************************

***********************************


                查找指针

***********************************

**********************************/
void trace(uchar *str,uchar len)
{
        uint i;
        {
                for(i=0;i<len;i++)
                {
                        myputchar(*str);
                        str++;
                }
        }
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
czxinxing
1楼-- · 2019-07-15 22:52
自己顶一下,程序有太多的问题,希望大家能认真帮忙分析一下!
czxinxing
2楼-- · 2019-07-15 23:57
没办法,只有自己在顶一下,谁让晚上人多呢
l71458072
3楼-- · 2019-07-16 01:01
 精彩回答 2  元偷偷看……
l71458072
4楼-- · 2019-07-16 02:56
QQ 380636367  详聊
牛明强
5楼-- · 2019-07-16 04:49
想了解一下。                       
shenming510
6楼-- · 2019-07-16 09:20
顶下,最近可能也要用STC驱动W25Q64

一周热门 更多>