📄 data_flash.c
字号:
#include "includes.h"
unsigned char data_flash_model_flag = 0;
void DFClock( 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 DataflashWriteByte( 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 DataflashReadByte(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 );
}
const unsigned char _df_cmd_mode[] =
{
DF_ENTER_SLEEP,
DF_ENTER_ACTIVE
};
void data_flash_enter_mode(unsigned char sel)
{
DATA_FLASH_CS_OUT &=~ ( DATA_FLASH_CS );
DataflashWriteByte( _df_cmd_mode[sel] );
DATA_FLASH_CS_OUT |= ( DATA_FLASH_CS );
Delay(200);
}
unsigned char data_flash_status_read( unsigned char sta_sel )
{
unsigned char sta,times = 0;
do{
DATA_FLASH_CS_OUT &=~ ( DATA_FLASH_CS );
DataflashWriteByte( sta_sel );
sta = DataflashReadByte();
DATA_FLASH_CS_OUT |= DATA_FLASH_CS;
DATA_FLASH_SI_OUT |= DATA_FLASH_SI;
DATA_FLASH_SCL_OUT |= DATA_FLASH_SCL;
_clr_wdt();
if( sta & 0x80 )
{
AlarmCtlWord1 &=~ ALARM_OF_DATA_FLASH;
if( ( sta & DATA_FLASH_MODEL_16 ) == DATA_FLASH_MODEL_16 )
{
data_flash_model_flag &=~ DATA_FLASH_MODEL_ERR;
return OK;
}
}
}while( times++ < 100 );
AlarmCtlWord1 |= ALARM_OF_DATA_FLASH;
data_flash_model_flag |= DATA_FLASH_MODEL_ERR;
return ERROR;
}
const unsigned char _df_cmd_rbuff[]=
{
DF_READ_BUFFER1,
DF_READ_BUFFER2
};
void data_flash_buffer_read( unsigned char buff, unsigned short addr, unsigned char *data, unsigned short len )
{
DATA_FLASH_CS_OUT &=~ ( DATA_FLASH_CS );
DataflashWriteByte( _df_cmd_rbuff[buff] );
DFClock(8);
DataflashWriteByte( ( unsigned char )( addr >> 8 ) );
DataflashWriteByte( ( unsigned char )addr );
DFClock(8);
do{
*data = DataflashReadByte();
data++;
}while( --len );
DATA_FLASH_CS_OUT |= DATA_FLASH_CS;
DATA_FLASH_SI_OUT |= DATA_FLASH_SI;
DATA_FLASH_SCL_OUT |= DATA_FLASH_SCL;
}
const unsigned char _df_cmd_wbuff[]=
{
DF_WRITE_BUFFER1,
DF_WRITE_BUFFER2
};
const unsigned char _df_cmd_sta[]=
{
DF_READ_STATUS1,
DF_READ_STATUS2
};
void data_flash_buffer_write( unsigned char sel, unsigned short addr, unsigned char *data, unsigned short len )
{
DATA_FLASH_CS_OUT &=~ ( DATA_FLASH_CS );
DataflashWriteByte(_df_cmd_wbuff[sel]);
DFClock(8);
DataflashWriteByte( ( unsigned char )( addr >> 8 ) );
DataflashWriteByte( ( unsigned char )addr );
do{
DataflashWriteByte( *data );
data++;
}while( --len );
DATA_FLASH_CS_OUT |= DATA_FLASH_CS;
DATA_FLASH_SI_OUT |= DATA_FLASH_SI;
DATA_FLASH_SCL_OUT |= DATA_FLASH_SCL;
data_flash_status_read( _df_cmd_sta[sel] );
}
const unsigned char _df_cmd_mtb[]=
{
DF_MAIN_TO_BUFFER1,
DF_MAIN_TO_BUFFER2
};
unsigned char data_flash_main_to_buffer( unsigned char sel, unsigned short page )
{
data_flash_enter_mode( DF_ACTIVE );
page <<= 2;
DATA_FLASH_CS_OUT &=~ ( DATA_FLASH_CS );
DataflashWriteByte( _df_cmd_mtb[sel] );
DataflashWriteByte( (unsigned char)( page >> 8 ) );
DataflashWriteByte( (unsigned char)page );
DFClock(8);
DATA_FLASH_CS_OUT |= DATA_FLASH_CS;
DATA_FLASH_SI_OUT |= DATA_FLASH_SI;
DATA_FLASH_SCL_OUT |= DATA_FLASH_SCL;
return( data_flash_status_read(_df_cmd_sta[sel] ) );
}
const unsigned char _df_cmd_btm[]=
{
DF_WMM_WBIE_BUF1,
DF_WMM_WBIE_BUF2
};
unsigned char data_flash_buffer_to_main_prog( unsigned long * cnt, unsigned char sel, unsigned short page )
{
unsigned char times = 0;
(*cnt)++;
data_flash_buffer_write( sel, DF_PAGE_LEN, ( unsigned char * )cnt, 4 );
page <<= 2;
do{
DATA_FLASH_WP_OUT |= DATA_FLASH_WP;
_NOP();
_NOP();
DATA_FLASH_CS_OUT &=~ ( DATA_FLASH_CS );
DataflashWriteByte(_df_cmd_btm[sel]);
DataflashWriteByte( ( unsigned char )( page >> 8 ) );
DataflashWriteByte( ( unsigned char )page );
DFClock(8);
DATA_FLASH_CS_OUT |= DATA_FLASH_CS;
Delay(1000);
if( data_flash_status_read( _df_cmd_sta[sel] ) == OK )
{
DATA_FLASH_WP_OUT &=~ DATA_FLASH_WP;
return OK;
}
}while( ++times < 3 );
DATA_FLASH_WP_OUT &=~ DATA_FLASH_WP;
return ERROR;
}
const unsigned short _df_sector_page_sta[]=
{
8,256,512,512*2,512*3,512*4,512*5,512*6,512*7,512*8,
};
const unsigned short _df_sector_page_cnt[]=
{
8,248,256,512,512,512,512,512,512,512,
};
void data_flash_buffer_to_main( unsigned char sel, unsigned short page )
{
unsigned long data_flash_sector_wr_cnt;
unsigned long sub_cnt;
unsigned char data_flash_sector_item;
unsigned short rfrshpt;
for( data_flash_sector_item = 0; data_flash_sector_item < DATA_FLASH_SECTOR_CNT; data_flash_sector_item++ )
{
if( page < _df_sector_page_sta[data_flash_sector_item] )
{
data_flash_sector_wr_cnt = 0;
_fram_read( ADDR_OF_DF_CNT_START + data_flash_sector_item * DF_CNT_REC_SIZE, (unsigned char *)&data_flash_sector_wr_cnt, SECTOR_WRT_CNT_SIZE );
goto DATA_FLASH_BUFFER_TO_MAIN_STA;
}
}
return;
DATA_FLASH_BUFFER_TO_MAIN_STA:
data_flash_buffer_to_main_prog( &data_flash_sector_wr_cnt, sel, page );
_fram_read( ( ADDR_OF_DF_CNT_START + data_flash_sector_item * DF_CNT_REC_SIZE + OFFSET_SECTOR_RFRSH_PT), (unsigned char *)&rfrshpt, SECTOR_RFRSH_PT_SIZE );
data_flash_main_to_buffer1( _df_sector_page_sta[data_flash_sector_item-1] + rfrshpt );
data_flash_buffer1_read( DF_PAGE_LEN, (unsigned char*)(&sub_cnt), 4 );
if( ( unsigned long )( data_flash_sector_wr_cnt - sub_cnt ) >= DATA_FLASH_REFRESH_CNT )
{
data_flash_buffer1_write( DF_PAGE_LEN, ( unsigned char* )( &data_flash_sector_wr_cnt ), 4 );
data_flash_buffer1_to_main( _df_sector_page_sta[data_flash_sector_item-1] + rfrshpt );
}
data_flash_enter_mode( DF_SLEEP );
rfrshpt++;
rfrshpt = rfrshpt % _df_sector_page_cnt[data_flash_sector_item];
_fram_write( ADDR_OF_DF_CNT_START + data_flash_sector_item * DF_CNT_REC_SIZE, (unsigned char *)&data_flash_sector_wr_cnt, SECTOR_WRT_CNT_SIZE );
_fram_write( ADDR_OF_DF_CNT_START + data_flash_sector_item * DF_CNT_REC_SIZE + OFFSET_SECTOR_RFRSH_PT, (unsigned char *)&rfrshpt, SECTOR_RFRSH_PT_SIZE );
}
void data_flash_clear_buffer( unsigned char sel, unsigned char sta, unsigned short len )
{
unsigned short i = 0;
DATA_FLASH_CS_OUT &=~ ( DATA_FLASH_CS );
DataflashWriteByte( _df_cmd_wbuff[sel] );
DFClock(16);
DataflashWriteByte(sta);
do{
DataflashWriteByte(0);
}while( i++ < len );
DATA_FLASH_CS_OUT |= DATA_FLASH_CS;
DATA_FLASH_SI_OUT |= DATA_FLASH_SI;
DATA_FLASH_SCL_OUT |= DATA_FLASH_SCL;
data_flash_status_read( _df_cmd_sta[sel] );
}
void data_flash_clear_pages( unsigned long addr, unsigned char sta, unsigned short len, unsigned char pages )
{
unsigned char i;
addr /= DF_PAGE_LEN;
for( i = 0; i < pages; i++ )
{
if( !IsPowerOn() ) break;
data_flash_main_to_buffer1(addr);
data_flash_clear_buffer(0,sta,len);
data_flash_buffer1_to_main(addr);
addr++;
}
}
void data_flash_read_by_buff1( unsigned long addr, unsigned char *data, unsigned short len )
{
unsigned short ofst = addr % DF_PAGE_LEN;
unsigned short page = addr / DF_PAGE_LEN;
if( data_flash_main_to_buffer1(page) == OK )
{
data_flash_buffer1_read( ofst, data, len );
}
data_flash_enter_mode( DF_SLEEP );
}
void data_flash_write_by_buff1( unsigned long addr, unsigned char *data, unsigned short len )
{
unsigned short ofst = addr % DF_PAGE_LEN;
unsigned short usPage = addr / DF_PAGE_LEN;
if( data_flash_main_to_buffer1(usPage) == OK )
{
data_flash_buffer1_write( ofst, data, len );
data_flash_buffer1_to_main( usPage );
}
data_flash_enter_mode( DF_SLEEP );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -