📄 flash.c
字号:
#include<intrins.h>
#include "C8051f.h"
unsigned char bdata SPI_DUMP;
sbit SPI_D7 = SPI_DUMP^7;
sbit SPI_D0 = SPI_DUMP^0;
void SPI_Init (void)
{
SPI0CFG = 0x07; // data sampled on 1st SCK rising edge
// 8-bit data words
SPI0CFG |= 0xC0; //CKPOL =1;
SPI0CN = 0x03; // Master mode; SPI enabled; flags
// cleared
SPI0CKR = SYSCLK/2/8000000-1; // SPI clock <= 8MHz (limited by
// EEPROM spec.)
}
void SPI_Write(unsigned char dat)
{
unsigned char temp;
SPI_DUMP = dat;
for(temp = 0; temp<8; temp++)
{
SSI = SPI_D7;
SSCK = 1;
SPI_DUMP = SPI_DUMP << 1;
SSCK = 0;
}
}
unsigned char SPI_Read()
{
unsigned char temp;
for(temp = 0; temp<8; temp++)
{
SSCK = 1;
SPI_DUMP = SPI_DUMP << 1;
SPI_D0 = SSO;
SSCK = 0;
}
return(SPI_DUMP);
}
unsigned char SA_RDSR() //读状态寄存器
{
unsigned char temp;
EA = 0;
SCS = 0;
SPI_Write(0x05);
temp = SPI_Read();
temp = SPI_Read();
SCS = 1;
EA = 1;
return(temp);
}
void SA_WREN()//允许写
{
do
{
if((SA_RDSR()&0x01) == 0)
break;
}while(1);
EA = 0;
SCS = 0;
SPI_Write(0x06);
SCS = 1;
EA = 1;
}
void SA_WRDI() //禁止写
{
do
{
if((SA_RDSR()&0x01) == 0)
break;
}while(1);
EA = 0;
SCS = 0;
SPI_Write(0x04);
SCS = 1;
EA = 1;
}
void SA_WRSR(unsigned char da)//写状态寄存器
{
do
{
if((SA_RDSR()&0x01)==0)
break;
}while(1);
EA = 0;
SCS = 0;
SPI_Write(0x01);
SPI_Write(da);
SCS = 1;
EA = 1;
}
void SA_Read(unsigned long addr,unsigned char *ptr,unsigned int size)//
{
unsigned char addr_hh;
unsigned char addr_h;
unsigned char addr_l;
unsigned int si;
addr_l = addr&0x0000ff;
addr_h = (addr&0x00ff00) >> 8;
addr_hh = (addr&0xff0000) >> 16;
do
{
if((SA_RDSR()&0x01) == 0)
break;
}while(1);
EA = 0;
SCS = 0;
SPI_Write(0x03);
SPI_Write(addr_hh);
SPI_Write(addr_h);
SPI_Write(addr_l);
for(si = 0; si<size; si++)
{
ptr[si] = SPI_Read();
}
SCS = 1;
EA = 1;
}
unsigned char SA_ReadB(unsigned long addr) //读一个字节
{
unsigned char addr_hh;
unsigned char addr_h;
unsigned char addr_l;
unsigned char temp;
addr_l = addr&0x0000ff;
addr_h = (addr&0x00ff00) >> 8;
addr_hh = (addr&0xff0000) >> 16;
do
{
if((SA_RDSR()&0x01) == 0)
break;
}while(1);
EA = 0;
SCS = 0;
SPI_Write(0x03);
SPI_Write(addr_hh);
SPI_Write(addr_h);
SPI_Write(addr_l);
temp = SPI_Read();
SCS = 1;
EA = 1;
return(temp);
}
void SA_PP(unsigned long addr,unsigned char *ptr,unsigned int len)//页写
{
unsigned char addr_hh;
unsigned char addr_h;
unsigned char addr_l;
unsigned int si;
addr_l = addr&0x0000ff;
addr_h = (addr&0x00ff00) >> 8;
addr_hh = (addr&0xff0000) >> 16;
do
{
if((SA_RDSR()&0x01) == 0)
{
break;
}
}while(1);
SA_WREN();
EA = 0;
SCS = 0;
SPI_Write(0x02);
SPI_Write(addr_hh);
SPI_Write(addr_h);
SPI_Write(addr_l);
for(si = 0; si < len; si++)
{
SPI_Write(ptr[si]);
}
SCS = 1;
_nop_();
_nop_();
EA = 1;
do
{
if((SA_RDSR()&0x01) == 0x01)
{
_nop_();
_nop_();
}
else
{
break;
}
}while(1);
}
void SA_PE(unsigned long addr) //页擦除
{
unsigned char addr_hh;
unsigned char addr_h;
unsigned char addr_l;
addr_l = addr&0x0000ff;
addr_h = (addr&0x00ff00) >> 8;
addr_hh = (addr&0xff0000) >> 16;
do
{
if((SA_RDSR()&0x01) == 0)
{
break;
}
}while(1);
SA_WREN();
EA = 0;
SCS = 0;
SPI_Write(0x81);
SPI_Write(addr_hh);
SPI_Write(addr_h);
SPI_Write(addr_l);
SCS = 1;
EA = 1;
}
SA_Write(unsigned long addr,unsigned char dat)//写一个字节
{
unsigned char addr_l;
unsigned long num;
unsigned char ptr[256];
addr_l = addr&0x0000ff;
num = addr >> 8;
// num=(addr/256)*256;//>>8;
// addr_l=(unsigned char)(addr-num);
SA_Read(num,&ptr[0],256);
ptr[addr_l] = dat;
SA_PE(num);
SA_PP(num,&ptr[0],256);//页写
}
void SA_SE(unsigned long addr) //扇区擦除
{
unsigned char addr_hh;
unsigned char addr_h;
unsigned char addr_l;
addr_l = addr&0x0000ff;
addr_h = (addr&0x00ff00) >> 8;
addr_hh = (addr&0xff0000) >> 16;
do
{
if((SA_RDSR()&0x01) == 0)
break;
}while(1);
SA_WREN();
EA = 0;
SCS = 0;
SPI_Write(0xd8);
SPI_Write(addr_hh);
SPI_Write(addr_h);
SPI_Write(addr_l);
SCS = 1;
EA = 1;
}
// bulk erase
void SA_BE()
{
do
{
if((SA_RDSR()&0x01) == 0) break;
}while(1);
SA_WREN();
EA = 0;
SCS = 0;
SPI_Write(0xc7);
SCS = 1;
EA = 1;
}
//software protection
void SA_SP()
{
do
{
if((SA_RDSR()&0x01) == 0)
break;
}while(1);
EA = 0;
SCS = 0;
SPI_Write(0xb9);
SCS = 1;
EA = 1;
}
// release from software protect and read ID
unsigned char SA_RSP()
{
unsigned char temp;
do
{
if((SA_RDSR()&0x01) == 0)
break;
}while(1);
EA = 0;
SCS = 0;
SPI_Write(0xab);
SPI_Write(0x00);
SPI_Write(0x00);
SPI_Write(0x00);
temp = SPI_Read();
SCS = 1;
EA = 1;
return(temp);
}
void SA_Init()
{
unsigned char temp;
SSCK = 0;
SSI = 1;
SSO = 1;
SCS = 1;
SA_WRSR(0x03);//0x03
SA_WREN();
temp = SA_RSP();
temp = SA_RDSR();
temp = SA_RDSR();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -