📄 data_flash.c
字号:
#include "data_flash.h"
#include "hal.h"
#include "pub_func.h"
unsigned short I2CTemp1;
unsigned char ErrIndication=0;
unsigned char I2CTemp0;
void _data_flash_clocks(unsigned char cnt)
{
DATA_FLASH_SI_OUT&=~(DATA_FLASH_SI);
do{
DATA_FLASH_SCL_OUT&=~(DATA_FLASH_SCL);
DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
}while(--cnt);
}
void _data_flash_write_byte(unsigned char wrbyte)
{
unsigned char BitCounter=8;
do{
DATA_FLASH_SCL_OUT&=~(DATA_FLASH_SCL);
if(wrbyte&0x80) DATA_FLASH_SI_OUT|=DATA_FLASH_SI;
else DATA_FLASH_SI_OUT&=~(DATA_FLASH_SI);
DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
wrbyte<<=1;
}while(--BitCounter);
}
unsigned char _data_flash_read_byte(void)
{
unsigned char rdbyte=0,BitCounter=8;
do{
DATA_FLASH_SCL_OUT&=~(DATA_FLASH_SCL);
rdbyte<<=1;
DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
if(DATA_FLASH_SO_IN&DATA_FLASH_SO) rdbyte++;
}while(--BitCounter);
return(rdbyte);
}
unsigned char _data_flash_read_status(void)
{
unsigned char sta;
// enable
DATA_FLASH_CS_OUT&=~(DATA_FLASH_CS);
// cmd
_data_flash_write_byte(DF_READ_STATUS1);
sta=_data_flash_read_byte();
// disable
DATA_FLASH_CS_OUT|=DATA_FLASH_CS;
DATA_FLASH_SI_OUT|=DATA_FLASH_SI;
DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
_clr_wdt();
return sta;
}
void _data_flash_read_buffer1(unsigned char *data,unsigned char len)
{
unsigned char i;
// enable
DATA_FLASH_CS_OUT&=~(DATA_FLASH_CS);
_data_flash_write_byte(DF_READ_BUFFER1);
_data_flash_clocks(8);
_data_flash_write_byte((unsigned char)(I2CTemp1&0x01));
_data_flash_write_byte((unsigned char)I2CTemp0);
for(i=0;i<len;i++)
{
*(data+i)=_data_flash_read_byte();
}
// disable
DATA_FLASH_CS_OUT|=DATA_FLASH_CS;
DATA_FLASH_SI_OUT|=DATA_FLASH_SI;
DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
}
void _data_flash_write_buffer1(unsigned char *data,unsigned char len)
{
unsigned char i;
// enable
DATA_FLASH_CS_OUT&=~(DATA_FLASH_CS);
_data_flash_write_byte(DF_WRITE_BUFFER1);
_data_flash_clocks(16);
_data_flash_write_byte((unsigned char)I2CTemp0);
for(i=0;i<len;i++)
{
_data_flash_write_byte(*(data+i));
}
// disable
DATA_FLASH_CS_OUT|=DATA_FLASH_CS;
DATA_FLASH_SI_OUT|=DATA_FLASH_SI;
DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
}
void _data_flash_read(unsigned long addr,unsigned char *data,unsigned char len)
{
unsigned char i;
unsigned long temp;
ErrIndication=0;
I2CTemp1=0;
I2CTemp0=0;
temp=addr;
for(;temp>=0x100;temp-=0x100)
{
I2CTemp1++;
}
I2CTemp1<<=1;
I2CTemp0=temp;
_disable_interrupt();
// enable
DATA_FLASH_CS_OUT&=~(DATA_FLASH_CS);
// cmd
_data_flash_write_byte(DF_ARRAY_READ);
// slave address
_data_flash_write_byte((unsigned char)(I2CTemp1>>8));
_data_flash_write_byte((unsigned char)I2CTemp1);
_data_flash_write_byte((unsigned char)I2CTemp0);
_data_flash_write_byte(0);
_data_flash_write_byte(0);
_data_flash_write_byte(0);
_data_flash_write_byte(0);
for(i=0;i<len;i++)
{
*(data+i)=_data_flash_read_byte();
if(++temp>=0x100)
{
_data_flash_clocks(64);
temp=0;
}
}
// disable
DATA_FLASH_CS_OUT|=DATA_FLASH_CS;
_enable_interrupt();
DATA_FLASH_SI_OUT|=DATA_FLASH_SI;
DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
_clr_wdt();
}
void _data_flash_write(unsigned long addr,unsigned char *data,unsigned char len)
{
unsigned long temp;
unsigned char len1,flg=0,waittime;
#ifdef TEST_COURSES
//LcdLightOn(1);
#endif
ErrIndication=0;
I2CTemp1=0;
I2CTemp0=0;
temp=addr;
for(;temp>=0x100;temp-=0x100)
{
I2CTemp1++;
}
if(temp+len>=0x100)
{
len1=0x100-temp;
flg=1;
}
else
{
len1=len;
}
DF_WRITE_STA:
I2CTemp1<<=1;
I2CTemp0=temp;
_disable_interrupt();
// Transfer main memory page to buffer1
// enable
DATA_FLASH_CS_OUT&=~(DATA_FLASH_CS);
_data_flash_write_byte(DF_MAIN_TO_BUFFER1);
_data_flash_write_byte((unsigned char)(I2CTemp1>>8));
_data_flash_write_byte((unsigned char)I2CTemp1);
_data_flash_clocks(8);
// disable
DATA_FLASH_CS_OUT|=DATA_FLASH_CS;
DATA_FLASH_SI_OUT|=DATA_FLASH_SI;
DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
waittime=0;
while(_data_flash_read_status()!=0xA4)
{
if(waittime++>100)
break;
}
_data_flash_write_buffer1(data,len1);
waittime=0;
while(_data_flash_read_status()!=0xA4)
{
if(waittime++>100)
break;
}
// enable
DATA_FLASH_WP_OUT|=DATA_FLASH_WP;
_NOP();
_NOP();
DATA_FLASH_CS_OUT&=~(DATA_FLASH_CS);
_data_flash_write_byte(DF_WMM_WBIE_BUF1);
// slave address
_data_flash_write_byte((unsigned char)(I2CTemp1>>8));
_data_flash_write_byte((unsigned char)I2CTemp1);
_data_flash_write_byte(I2CTemp0);
DATA_FLASH_CS_OUT|=DATA_FLASH_CS;
// disable
waittime=0;
while(_data_flash_read_status()!=0xA4)
{
if(waittime++>100)
break;
}
DATA_FLASH_CS_OUT|=DATA_FLASH_CS;
DATA_FLASH_WP_OUT&=~(DATA_FLASH_WP);
_enable_interrupt();
DATA_FLASH_SI_OUT|=DATA_FLASH_SI;
DATA_FLASH_SCL_OUT|=DATA_FLASH_SCL;
if(flg)
{
data+=len1;
len1=len-len1;
temp=0;
I2CTemp1>>=1;
I2CTemp1++;
flg=0;
goto DF_WRITE_STA;
}
}
unsigned char _load_data(unsigned long addr,unsigned char *data,unsigned char len)
{
unsigned char ii,temp=0,rdata[30];
if(len>29)
{
return ERROR;
}
//_data_flash_read(addr,data,len);
//_data_flash_read(addr+len,&sum,1);
_data_flash_read(addr,rdata,len+1);
for(ii=0;ii<len;ii++)
{
temp+=rdata[ii];
data[ii]=rdata[ii];
}
if(rdata[len]==temp)
{
return OK;
}
else
{
return ERROR;
}
}
unsigned char _save_data(unsigned long addr,unsigned char *data,unsigned char len)
{
unsigned char jj=0,ii,temp=0,rdata[30],wdata[30];
if(len>29)
{
return ERROR;
}
for(ii=0;ii<len;ii++)
{
temp+=data[ii];
wdata[ii]=data[ii];
}
wdata[len]=temp;
StartToSave:
_data_flash_write(addr,wdata,len+1);
//_data_flash_write(addr+len,(unsigned char *)&temp,1);
_data_flash_read(addr,rdata,len+1);
for(ii=0;ii<len+1;ii++)
{
if(wdata[ii]!=rdata[ii])
{
goto ReStartToSave;
}
}
return OK;
ReStartToSave:
if(jj++<3)
{
goto StartToSave;
}
else
{
return ERROR;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -