#include <iom8v.h>
#include "mytype.h"
#include "flash.h"
/***************************************************************************************
读取一个字节
*****************************************************************************************/
uint8 Read_abyte(uint32 address)
{
uint8 i;
uint8 read_data;
uint8 command;
command=0x03;//读取数据命令。
while((Read_RDSR())&0x01);//等待空闲。
CS_1;
SCLK_1;
CS_0;
SCLK_0;
for(i=0;i<8;i++)//写入命令。
{
SCLK_0;
if(0x80&command)//高位优先。
SO_1;
else
SO_0;
SCLK_1;
command<<=1;
}
for(i=0;i<24;i++)//写入24位读取地址值。
{
SCLK_0;
if(0x00800000&address)
SO_1;
else
SO_0;
SCLK_1;
address<<=1;
}
SO_0;
for(i=0;i<8;i++)//读取数据值。
{
SCLK_0;
;;
SCLK_1;
read_data<<=1;
if(in_SI)
read_data++;
}
SCLK_0;
CS_1;
return(read_data);
}
/***************************************************************************************
写入一个字节
*****************************************************************************************/
void Write_adata(uint32 address,uint8 write_data)
{
uint8 i;
uint8 command;
while((Read_RDSR())&0x01);
WriteEN();
command=0x02;
CS_1;
SCLK_1;
CS_0;
SCLK_0;
for(i=0;i<8;i++)
{
SCLK_0;
if(0x80&command)
SO_1;
else
SO_0;
SCLK_1;
command<<=1;
}
for(i=0;i<24;i++)
{
SCLK_0;
if(0x00800000&address)
SO_1;
else
SO_0;
SCLK_1;
address<<=1;
}
for(i=0;i<8;i++)
{
SCLK_0;
if(0x80&write_data)
SO_1;
else
SO_0;
SCLK_1;
write_data<<=1;
}
SCLK_0;
CS_1;
}
/***************************************************************************************
写入写使能命令
*****************************************************************************************/
void WriteEN(void)
{
uint8 i;
uint8 command;
command=0x06;//使能命令。
CS_1;
SCLK_1;
CS_0;
for(i=0;i<8;i++)//写入命令。
{
SCLK_0;
if(0x80&command)
SO_1;
else
SO_0;
SCLK_1;
command<<=1;
}
SCLK_0;
CS_1;
}
/***************************************************************************************
写入写禁止命令
*****************************************************************************************/
void WriteDisable(void)
{
uint8 i;
uint8 command;
command=0x04;//写入禁止命令。
CS_1;
SCLK_1;
CS_0;
SCLK_0;
for(i=0;i<8;i++)//写入命令。
{
SCLK_0;
if(0x80&command)
SO_1;
else
SO_0;
SCLK_1;
command<<=1;
}
SCLK_0;
CS_1;
}
/***************************************************************************************
写入段擦除使能命令
*****************************************************************************************/
void Sector_Erase(uint32 address)
{
uint8 i;
uint8 command;
WriteEN();
while((Read_RDSR())&0x01);
command=0xd8;//段擦除命令。
CS_1;
SCLK_1;
CS_0;
SCLK_0;
for(i=0;i<8;i++)
{
SCLK_0;
if(0x80&command)
SO_1;
else
SO_0;
SCLK_1;
command<<=1;
}
for(i=0;i<24;i++)
{
SCLK_0;
if(0x00800000&address)
SO_1;
else
SO_0;
SCLK_1;
address<<=1;
}
SCLK_0;
CS_1;
}
/***************************************************************************************
写入片擦除使能命令
*****************************************************************************************/
void Bulk_Erase(void)
{
uint8 i;
uint8 command;
command=0xc7;//片擦除命令。
while((Read_RDSR())&0x01);
WriteEN();
CS_1;
SCLK_1;
CS_0;
for(i=0;i<8;i++)
{
SCLK_0;
if(0x80&command)
SO_1;
else
SO_0;
SCLK_1;
command<<=1;
}
SO_0;
SCLK_0;
CS_1;
}
/***************************************************************************************
延时X/100ms
*****************************************************************************************/
void DelayX100ms(uint32 x)
{
uint32 i;
while(x--)
{
i=1275;
while(i--);
}
}
/***************************************************************************************
读取状态寄存器。
*****************************************************************************************/
uint8 Read_RDSR(void)
{
uint8 i,j;
uint8 read_data;
uint8 command;
command=0x05;
j=3;
CS_1;
SCLK_1;
CS_0;
SCLK_0;
for(i=0;i<8;i++)
{
SCLK_0;
if(0x80&command)
SO_1;
else
SO_0;
SCLK_1;
command<<=1;
}
SO_0;
for(i=0;i<8;i++)
{
SCLK_0;
j=0;
SCLK_1;
read_data<<=1;
if(in_SI)
read_data++;
}
SCLK_0;
CS_1;
return(read_data);
}
/**************************************************************
写入一串字节,芯片最多支持写入256个字节。
****************************************************************/
void Write_string(uint8 *string,uint32 address,uint8 n)
{
uint8 i;
uint8 command;
while((Read_RDSR())&0x01);
WriteEN();
command=0x02;
CS_1;
SCLK_1;
CS_0;
SCLK_0;
for(i=0;i<8;i++)
{
SCLK_0;
if(0x80&command)
SO_1;
else
SO_0;
SCLK_1;
command<<=1;
}
for(i=0;i<24;i++)
{
SCLK_0;
if(0x00800000&address)
SO_1;
else
SO_0;
SCLK_1;
address<<=1;
}
while(n--)
{
for(i=0;i<8;i++)
{
SCLK_0;
if(0x80&(*string))
SO_1;
else
SO_0;
SCLK_1;
(*string)<<=1;
}
string++;
}
SCLK_0;
CS_1;
}
/**************************************************************
写保护
****************************************************************/
void Write_Protect()
{
uint8 i;
uint8 command;
uint8 write_data;
while((Read_RDSR())&0x01);
WriteEN();
command=0x01;
write_data=0x9c;
CS_1;
SCLK_1;
CS_0;
SCLK_0;
for(i=0;i<8;i++)
{
SCLK_0;
if(0x80&command)
SO_1;
else
SO_0;
SCLK_1;
command<<=1;
}
for(i=0;i<8;i++)
{
SCLK_0;
if(0x80&write_data)
SO_1;
else
SO_0;
SCLK_1;
write_data<<=1;
}
SCLK_0;
CS_1;
}
- 1
- 2
前往页