📄 flash.c
字号:
#include "c8051f020.h"
#include <intrins.h>
//#include "delay.h"
sbit CS_ROM=P3^0 ;
void UART0_SendByte(unsigned char value);
extern unsigned char xdata x[0x07fff];
//*********************** M25P16程序模块 **********************//
unsigned char transdata(unsigned char dat) //向25P16传输数据
{
unsigned char value;
CS_ROM=0; //开片选
SPIF=0; //清SPI 中断标志
SPI0DAT=dat; //送数
while(!SPIF); //等待发送完毕
SPIF=0;
value=SPI0DAT; //读数
_nop_();
return(value);
}
//读器件ID(202015H)
/*void R_ROM_ID(void)
{
unsigned char temp;
unsigned char id1,id2,id3;
CS_ROM=1;
_nop_();
CS_ROM=0;
temp=transdata(0x9f); //读器件ID命令
id1=transdata(0xff);
id2=transdata(0xff);
id3=transdata(0xff);
//UART0_SendByte(id1);
//UART0_SendByte(id2);
//UART0_SendByte(id3);
CS_ROM=1;
}
*/
unsigned char R_ROM_SATUS(void)
{
unsigned char value;
CS_ROM=1;
value=transdata(0x05);
value=transdata(0xff);
//UART0_SendByte(value);
CS_ROM=1;
return(value);
}
//写状态寄存器子程序
//protect_bits:0 表示不保护任何段; 1 表示保护31段; 2 表示保护30-31段
// 3 表示保护28-31段; 4 表示保护24-31段;5 表示保护16-31段
// 6、7 表示保护所有段
void WRSR(unsigned char protect_bits)
{
unsigned char temp,protect;
protect=protect_bits<<2;
while(R_ROM_SATUS()&0x01); //等待WIP复位
temp=transdata(0x06); //写FLASH ROM 命令
while(!(R_ROM_SATUS()&0x02)); //等待WEL置位
temp=transdata(0x01); //写状态寄存器命令代码
temp=transdata(protect); //送出参数
CS_ROM=1;
while(R_ROM_SATUS()&0x01); //等待WIP复位
}
//块檫除子程序,FLASH ROM 全部檫除
void FLASH_BE(void)
{
unsigned char temp;
while(R_ROM_SATUS()&0x01); //等待WIP复位
WRSR(0x00); //写状态寄存器,去写保护
temp=transdata(0x06); //写FLASH ROM 命令
while(!(R_ROM_SATUS()&0x02)); //等待WEL置位
temp=transdata(0xc7); //块檫除命令
CS_ROM=1;
while(R_ROM_SATUS()&0x01); //等待WIP复位
}
//段檫除子程序
//addr=000000H -- 1FFFFFH
void FLASH_SE(unsigned char addr3,unsigned char addr2,unsigned char addr1)
{
unsigned char temp;
while(R_ROM_SATUS()&0x01); //等待WIP复位
temp=transdata(0x06); //写FLASH ROM 命令
while(!(R_ROM_SATUS()&0x02)); //等待WEL置位
temp=transdata(0xd8); //段檫除命令
temp=transdata(addr3); //送24位地址 unsigned 逻辑移, signed 算术移
temp=transdata(addr2);
temp=transdata(addr1);
CS_ROM=1;
while(R_ROM_SATUS()&0x01); //等待WIP复位
}
//页写子程序
//addr:写入首地址
//pw:待写数据地址指针
//num:待写数据个数
void Flash_W (unsigned char addr3,unsigned char addr2,unsigned char addr1,unsigned char dat)
{
//unsigned int i;
unsigned char temp;
while(R_ROM_SATUS()&0x01); //等待WIP复位
temp=transdata(0x06); //写FLASH ROM 命令
while(!(R_ROM_SATUS()&0x02)); //等待WEL置位
temp=transdata(0x02); //页写命令
temp=transdata(addr3); //送24位地址 unsigned 逻辑移, signed 算术移
temp=transdata(addr2);
temp=transdata(addr1);
temp=transdata(dat);//数据
/*for(i=0;i<num;i++)
{
temp=transdata(*pw);
pw++;
}*/
CS_ROM=1;
while(R_ROM_SATUS()&0x01); //等待WIP复位
}
//读FLASH程序
//addr3~1:待读数据区首地址
unsigned char Flash_R(unsigned char addr3,unsigned char addr2,unsigned char addr1)
{
//unsigned int i;
unsigned char temp;
unsigned char dat;
while(R_ROM_SATUS()&0x01); //等待WIP复位
temp=transdata(0x03); //页读命令
temp=transdata(addr3); //送24位地址 unsigned 逻辑移, signed 算术移
temp=transdata(addr2);
temp=transdata(addr1);
dat=transdata(0x00);
/*for(i=0;i<num;i++)
{
*pr=transdata(0x00);
pr++;
}*/
CS_ROM=1;
return dat;
}
//C命令读FLASH程序
void Read_Flash_Data_To_PC (unsigned int addr3,unsigned int addr2,unsigned int addr1,unsigned char Num_Length)
{
unsigned int i;
unsigned char dat;
for(i=0;i<=Num_Length;i++)
{
dat=Flash_R( addr3, addr2, addr1);
UART0_SendByte(dat);
addr1++;
if(addr1>255)
{
addr1=0x00;
addr2++;
if(addr2>255)
{
addr1=0x00;
addr2=0x00;
addr3++;
}
}
}
}
//S命令存时间初值与起始地址
void Flash_Write_address (unsigned char hour,unsigned minute,unsigned char apm,unsigned int addr3,unsigned int addr2,unsigned int addr1,unsigned char port)
{
unsigned int h,m,l;
h=addr3;
m=addr2;
l=addr1;
Flash_W (addr3,addr2,addr1,0xFF);//0位
addr1++;
Flash_W (addr3,addr2,addr1,hour);//1位
addr1++;
Flash_W (addr3,addr2,addr1,minute);//2位
addr1++;
Flash_W (addr3,addr2,addr1,apm);//3位
addr1++;
Flash_W (addr3,addr2,addr1,port);//4位
addr1++;
Flash_W (addr3,addr2,addr1,h);//5位
addr1++;
Flash_W (addr3,addr2,addr1,m);//6位
addr1++;
Flash_W (addr3,addr2,addr1,l);//7位
}
//Rom存储
/*void ROM_Write_address(unsigned int address,unsigned char hour,unsigned minute,unsigned char apm,unsigned int addr3,unsigned int addr2,unsigned int addr1,unsigned char port )
{
unsigned int add;
add=address;
x[add]=0xFF;//0
add++;
x[add]=hour;//1
add++;
x[add]= minute;//2
add++;
x[add]= apm;//3
add++;
x[add]= port;//4
add++;
x[add]= addr3;//5
add++;
x[add]= addr2;//6
add++;
x[add]= addr1;//7
add++;
x[add]= 0x00;//8 上次值
add++;
x[add]= 0x00;//9 当前值
}*/
void Read_Data_T0_Flash (unsigned char addr3,unsigned char addr2,unsigned char addr1,unsigned int ad,unsigned int num)
{
unsigned char temp;
unsigned int i,add;
add=ad;
while(R_ROM_SATUS()&0x01); //等待WIP复位
temp=transdata(0x06); //写FLASH ROM 命令
while(!(R_ROM_SATUS()&0x02)); //等待WEL置位
temp=transdata(0x02); //页写命令
temp=transdata(addr3); //送24位地址 unsigned 逻辑移, signed 算术移
temp=transdata(addr2);
temp=transdata(addr1);
for(i=0,add=ad;i<num,add<ad+num;i++,add++)
{
temp=transdata(x[add]);
}
CS_ROM=1;
while(R_ROM_SATUS()&0x01); //等待WIP复位
}
unsigned char Fast_Read(unsigned char addr3,unsigned char addr2,unsigned char addr1,unsigned long int end_address)
{
unsigned long int i,num,address;
unsigned char temp;
unsigned char dat;
unsigned char first;
first=0x00;
address=addr3*65536+addr2*256+addr1;
num=end_address-address;
while(R_ROM_SATUS()&0x01); //等待WIP复位
temp=transdata(0x0B); //fast read 读命令
temp=transdata(addr3); //送24位地址 unsigned 逻辑移, signed 算术移
temp=transdata(addr2);
temp=transdata(addr1);
for(i=0;i<=num;i++)
{
dat=transdata(0x00);
switch (first)
{
case 0x00: first=0x01;break;
case 0x01: if(dat==0xFF) i=num; UART0_SendByte(dat);
//UART0_SendByte(datt);
default : break;
}
}
CS_ROM=1;
return dat;
}
//*********************** M25P16程序模块结束 **********************//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -