⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 data_flash.c

📁 ATMEL at45db161b系列Flash驱动程序,已经全部调试完毕,代码移值只需改IO口即可;
💻 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 + -