我是新手,第一次接触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 MY
ti;
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++;
}
}
}
一周热门 更多>