|
如题,程序如下:
#include "define.h"
#include "w25x80add.h"
/*
W25x80,8M-bit
共16个扇区,每扇区64Kbyte
每扇区有256页,每页256byte
*/
//#include <stdio.h>
//#include <string.h>
#define W25X_CS P2OUT_bit.P7
#define W25X_CLK P3OUT_bit.P3
//#define W25X_SI P3OUT_bit.P1
//#define W25X_SO P3IN_bit.P1
#define W25X_SO P3IN_bit.P2
#define W25X_SI P3OUT_bit.P1
#define W25X_WP P3OUT_bit.P0
#define WREN 0x06
#define WRDIS 0x04
#define RDSR 0x05
#define WRSR 0x01
#define READ 0x03
#define FARD 0x0b
#define PGPM 0x02
#define STES4K 0x20
#define BKES32K 0x52
#define BKES64K 0xd8
#define CPES 0xc7
#define W25X_DeviceID 0xAB
#define W25X_ManufactDeviceID 0x90
#define W25X_JedecDeviceID 0x9F
/*--------------------------------------------------
w25x80延时 n*300us
IN:i,延时系数
OUT:NONE
____________________________________________________*/
void w25_wait(u16 i)
{
for(;i>0;i--)
delay_us(300);
}
/*------------------------------------------------*/
//w25X80初始化
void w25_init(void)
{
//IO初始化
P2SEL_bit.P7=0;//CS
P2DIR_bit.P7=1;
P3SEL_bit.P0=0;//WP
P3SEL_bit.P1=0;//SI,输出
P3SEL_bit.P2=0;//SO,输入
P3SEL_bit.P3=0;//SCLK
P3DIR_bit.P0=1;//wp
P3DIR_bit.P1=1;//si
P3DIR_bit.P3=1;//sclk
P3DIR_bit.P2=0;//so
W25X_WP=1;//低电平有效
W25X_CLK=0;//软件模拟MODE0,CLK平时低电平
W25X_CS=1;
}
void w25_wrbyte(unsigned char sbyte)
{
unsigned char i;
//W25X_CLK=0;
//W25X_CS=1;
W25X_CLK=0;
W25X_CS=0;
//P3DIR_bit.P2=1;
for(i=0;i<8;i++)
{
W25X_CLK=0;
if((sbyte&0x80)==0x80)
W25X_SI=1;//din=1;
else
W25X_SI=0;//din=0;
sbyte<<=1;
//delay_us(2);
W25X_CLK=1;
}
W25X_CS=1;
W25X_CLK=0;
}
/*-----------------------------------------------
_________________________________________________________*/
unsigned char w25_rdbyte(void)
{
unsigned char i=0,temp=0;
W25X_CLK=0;
W25X_CS=0;
//P3DIR_bit.P2=0;
for(i=0;i<8;i++)
{
temp<<=1;
W25X_CLK=0;
if(W25X_SO!=0)//if(dio!=0)
temp|=0x01;
//else
//temp&=~0x01;
W25X_CLK=1;
}
W25X_CS=1;
W25X_CLK=0;
return temp;
}
/*----------------------------------------------------
//描 述:写允许函数
//功 能:在写入状态或者擦除或者数据时必须进行写允许操作
//形 参:无
//返 回:无
__________________________________________________________*/
void w25_enable(void)
{
W25X_CLK=0;
W25X_CS=0;
w25_wrbyte(WREN);
W25X_CS=1;
W25X_CLK=0;
}
/*----------------------------------------------------
//描 述:写禁止函数
//功 能:禁止写操作
//形 参:无
//返 回:无
__________________________________________________________*/
void w25_disable(void)
{
W25X_CLK=0;
W25X_CS=0;
w25_wrbyte(WRDIS);
W25X_CS=1;
W25X_CLK=0;
}
/*----------------------------------------------------
//描 述:读ID1函数
//功 能:读取ID1值
//形 参:无
//返 回:byte (字节数据)
__________________________________________________________*/
u8 w25_rdid1(void)
{
u8 byte;
W25X_CS=0;
w25_wrbyte(W25X_DeviceID);
w25_wrbyte(0);
w25_wrbyte(0);
w25_wrbyte(0);
byte=w25_rdbyte();
W25X_CS=1;
delay_us(2);
return byte;
}
/*----------------------------------------------------
//描 述:读ID2函数
//功 能:读取ID2值
//形 参:ID_Addr (字节数据)
//返 回:IData16 (16位)
__________________________________________________________*/
u16 w25_rdid2(u8 ID_Addr)
{
u16 dd;
W25X_CS=0;
w25_wrbyte(W25X_ManufactDeviceID);
w25_wrbyte(0);
w25_wrbyte(0);
w25_wrbyte(ID_Addr);
dd=w25_rdbyte();
dd |= w25_rdbyte();
W25X_CS=1;
return dd;
}
/*----------------------------------------------------
//描 述:读ID3函数
//功 能:读取ID3值
//形 参:无
//返 回:IData16 (16位)
__________________________________________________________*/
u16 w25_rdid3(void)
{
u16 dd;
W25X_CS=0;
w25_wrbyte(W25X_JedecDeviceID);
dd=w25_rdbyte();
dd |= w25_rdbyte();
w25_rdbyte();
W25X_CS=1;
return dd;
}
/*----------------------------------------------------------
读取寄存器的值
IN:NONE
OUT:u8 byte
_______________________________________________________________*/
unsigned char w25_rdsr(void)
{
unsigned char pbyte;
W25X_CLK=1;
W25X_CS=0;
w25_wrbyte(RDSR);
pbyte=w25_rdbyte();
W25X_CS=1;
W25X_CLK=1;
return pbyte;
}
/*----------------------------------------------------------
//描 述:写状态寄存器函数(可设置写保护状态)
//功 能:写状态到flash状态寄存器里 ( 需要时间15ms)
//形 参:byte (字节数据)
//返 回:无
_______________________________________________________________*/
void w25_wrsr(u8 byte)
{
W25X_CLK=1;
W25X_CS=0;
w25_wrbyte(WRSR);
w25_wrbyte(byte);
W25X_CS=1;
W25X_CLK=1;
}
void w25_busy(void)
{
while (w25_rdsr() == 0x03)
w25_rdsr(); // waste time until not busy WEL & Busy bit all be 1 (0x03)
}
/*-----------------------------------------------------------
//描 述:读flash中某个地址的数据字节
//功 能:读取指定地址上的数据
//形 参:waddr (24位的地址)
//返 回:byte (字节数据)
________________________________________________________________*/
u8 w25_RD(unsigned long waddr)
{
unsigned char byte;
W25X_CS=0;
w25_wrbyte(READ);
w25_wrbyte((u8)((waddr & 0xFFFFFF) >> 16));
w25_wrbyte((u8)((waddr & 0xFFFF) >> 8));
w25_wrbyte((u8)(waddr & 0xFF));
byte=w25_rdbyte();
W25X_CS=1;
return byte;
}
/*-----------------------------------------------------------
//描 述:读flash多字节数据的函数
//功 能:读取指定地址上的数据 (读取的数据以字节的形式放在缓存数组tx_buff[i]中)
//形 参:waddr (24位的地址) , nBytes_128 (字节个数)
//返 回:无
________________________________________________________________*/
void w25_RDS(unsigned long waddr,u8 * w25buf,u16 len)
{
unsigned long i;
W25X_CS=0;
w25_wrbyte(READ);
w25_wrbyte((u8)((waddr & 0xFFFFFF) >> 16));
w25_wrbyte((u8)((waddr & 0xFFFF) >> 8));
w25_wrbyte((u8)(waddr & 0xFF));
for(i=0;i<len;i++)
*(w25buf+i)=w25_rdbyte();
W25X_CS=1;
}
/*-----------------------------------------------------------
//描 述:快速读flash数据的函数
//功 能:快速读取指定地址上的数据
//形 参:Dst_Addr (24位的地址)
//返 回:byte
________________________________________________________________*/
u8 w25_FRD(unsigned long waddr)
{
u8 byte;
W25X_CLK=1;
W25X_CS=0;
w25_wrbyte(FARD);
w25_wrbyte((u8)((waddr & 0xFFFFFF) >> 16));
w25_wrbyte((u8)((waddr & 0xFFFF) >> 8));
w25_wrbyte((u8)(waddr & 0xFF));
w25_wrbyte(0xFF);
byte=w25_rdbyte();
W25X_CS=1;
return byte;
}
/*-----------------------------------------------------------
//描 述:快速读flash多字节数据的函数
//功 能:快速读取指定地址上的数据 (读取的数据以字节的形式放在缓存数组tx_buff[i]中)
//形 参:Dst_Addr (24位的地址) , nBytes_128 (字节个数)
//返 回:无
________________________________________________________________*/
void w25_FRDS(unsigned long waddr,u8 * w25buf,u16 len)
{
unsigned long i;
W25X_CS=0;
w25_wrbyte(FARD);
w25_wrbyte((u8)((waddr & 0xFFFFFF) >> 16));
w25_wrbyte((u8)((waddr & 0xFFFF) >> 8));
w25_wrbyte((u8)(waddr & 0xFF));
w25_wrbyte(0xFF);
for(i=0;i<len;i++)
*(w25buf+i)=w25_rdbyte();
W25X_CS=1;
}
/*-----------------------------------------------------------
//描 述:写flash数据的函数 (以一个字节的形式)
//功 能:写入数据到指定地址上
//形 参:Dst_Addr (24位的地址) ,byte (数据)
//返 回:无
________________________________________________________________*/
void w25_WR(unsigned long waddr,u8 byte)
{
w25_enable();
w25_busy();
W25X_CS=0;
w25_wrbyte(PGPM);
w25_wrbyte((u8)((waddr & 0xFFFFFF) >> 16));
w25_wrbyte((u8)((waddr & 0xFFFF) >> 8));
w25_wrbyte((u8)(waddr & 0xFF));
w25_wrbyte(byte);
W25X_CS=1;
}
/*-----------------------------------------------------------
//描 述:写多个字节flash数据的函数 (以多字节的形式)(这之前要先把数据存到upper_128[i]缓存数组中 )
//功 能:写入多个字节数据到指定地址上
//形 参:Dst_Addr (24位的地址) ,nBytes_128 (字节个数)
//返 回:无
________________________________________________________________*/
void w25_WRS(unsigned long waddr,u8 *w25buf,u16 len)
{
u8 i;
W25X_CS=0;
w25_enable();
W25X_CS=0;
w25_wrbyte(PGPM);
w25_wrbyte((u8)((waddr & 0xFFFFFF) >> 16));
w25_wrbyte((u8)((waddr & 0xFFFF) >> 8));
w25_wrbyte((u8)(waddr & 0xFF));
for(i=0;i<len;i++)
w25_wrbyte(*(w25buf+i));
W25X_CS=1;
}
/*----------------------------------------------------------
//描 述:flash扇区擦除函数(w25x32扇区擦除需要150ms~300ms)
//功 能:擦除页,每页4k (如果该页被保护,擦除无效)
//形 参:Dst_Addr (24位的地址) (此地址可为此页中的任何地址)
//返 回:无
_________________________________________________________________*/
void w25_erase4k(unsigned long waddr)
{
W25X_CS=0;
w25_enable();
W25X_CS=0;
w25_wrbyte(STES4K);
w25_wrbyte((u8)((waddr & 0xFFFFFF) >> 16));
w25_wrbyte((u8)((waddr & 0xFFFF) >> 8));
w25_wrbyte((u8)waddr & 0xFF);
W25X_CS=1;
W25X_CLK=1;
w25_busy();
}
/*----------------------------------------------------------
//描 述:flash块区擦除函数(w25x32块区擦除需要0.8s~2s)
//功 能:擦除块区,每块64k (如果该块被保护,擦除无效)
//形 参:Dst_Addr (24位的地址)
//返 回:无
_________________________________________________________________*/
void w25_erase64k(unsigned long waddr)
{
W25X_CLK=1;
W25X_CS=0;
w25_enable();
W25X_CS=0;
w25_wrbyte(BKES64K);
w25_wrbyte((u8)((waddr & 0xFFFFFF) >> 16));
w25_wrbyte((u8)((waddr & 0xFFFF) >> 8));
w25_wrbyte((u8)waddr & 0xFF);
W25X_CS=1;
W25X_CLK=1;
w25_busy();
}
/*------------------------------------------------
//描 述:flash芯片擦除函数(w25x32擦除整个芯片需要40s~80s)
//功 能:擦除整个芯片 (如果写保护状态,擦除无效)
//形 参:无
//返 回:无
_________________________________________________________________*/
void w25_erase(void)
{
W25X_CLK=1;
W25X_CS=0;
w25_enable();
W25X_CS=0;
w25_busy();
W25X_CS=0;
w25_wrbyte(CPES);
W25X_CS=1;
W25X_CLK=1;
w25_busy();
}
电路见附图
,求指点....
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
|