微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC12控制w25q64读写问题

STC12控制w25q64读写问题

时间:10-02 整理:3721RD 点击:
我是新手,第一次接触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++;
                }
        }
}

自己顶一下,程序有太多的问题,希望大家能认真帮忙分析一下!

没办法,只有自己在顶一下,谁让晚上人多呢

恩,哥们弄出来了没?

QQ 380636367  详聊

想了解一下。                       

顶下,最近可能也要用STC驱动W25Q64

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top