?? flash.c
字號:
/************************************************************************************
* Copyright (c) 2004,西安銘朗電子科技有限責任公司
* All rights reserved.
*
* 文件名稱: Flash.C
* 文件標識: none
* 適用器件: SST39VF040
*
* 摘 要: 本文件是外部Flash存儲器SST39VF040的操作函數庫
*
* 當前版本:1.1
* 作者:劉大偉
* 完成日期:2007年1月24日
*
* 歷史版本:1.0
* 作 者:盧 陽
* 完成日期:2004年11月14日
*
* 歷史版本:0.9
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/
/*****************************引用外部頭文件*****************************************/
#include "c8051f020.h"
#include "flash.h"
#include "delay.h"
#include <ABSACC.H>
/************************************************************************************/
/*************************************************************************************
* 函數名稱:Flash_ChipErase;
*
* 函數功能描述:Flash芯片整片擦除程序;
*
* 輸入參數:none;
*
* 返回數據:none;
*
* 注意: 操作數據與順序是針對39VF系列的固定操作,參考SST39VF512/010/020/040.PDF
* 系統選用39VF040,如有同系列型號變動,可修改頭文件,無須改動此程序;
************************************************************************************
void Flash_ChipErase (void)
{
BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01; //順序執行器件擦除步驟,p4口低N位是地址高N位 地址高2位是片選信號
CMD0_Addr = 0XAA;
BANK_ADDRHN = BANK_ADDRHN_CLR;
CMD1_Addr = 0X55;
BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01;
CMD0_Addr = 0X80;
BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01;
CMD0_Addr = 0XAA;
BANK_ADDRHN = BANK_ADDRHN_CLR;
CMD1_Addr = 0X55;
BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01;
CMD0_Addr = 0X10;
Delay_ms (50); //延時等待外部Flash擦除操作完畢
}
/***********************************************************************************
* 函數名稱:Flash_SectorErase;
*
* 函數功能描述:Flash芯片扇區擦除程序;
*
* 輸入參數:unsigned char類型扇區區號;
*
* 返回數據:none;
*
* 注意: 參數有效位位數與選用器件有關,系統中選用39VF040.
* 作數據與順序是針對39VF系列的固定操作,參考SST39VF512/010/020/040.PDF
* 如有同系列型號變動,可修改頭文件,無須改動此程序;
************************************************************************************
void Flash_SectorErase (unsigned char Sector)
{
unsigned char xdata *Addr_Bus; //定義外部指針
union //定義地址轉換
{
unsigned int Word;
unsigned char Conver[2];
}Conver ;
if (Sector<FLASH_SECTORS)
{
BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01; //順序執行器件擦除步驟,p4口低N位是地址高N位 地址高2位是片選信號
CMD0_Addr = 0XAA;
BANK_ADDRHN = BANK_ADDRHN_CLR;
CMD1_Addr = 0X55;
BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01;
CMD0_Addr = 0X80;
BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01;
CMD0_Addr = 0XAA;
BANK_ADDRHN = BANK_ADDRHN_CLR;
CMD1_Addr = 0X55;
Conver.Conver[1] = Sector; //扇區號賦給變量
Conver.Conver[1] = (Conver.Conver[1]<<Chip_Model) & 0X30+0XC0; //取扇區號低2位并加入片選信號
Addr_Bus = Conver.Word; //16位指針賦值
Conver.Conver[0] = Sector; //扇區號賦給變量
Conver.Conver[0] = (Conver.Conver[0]>>2) & BANK_ADDR; //取扇區號高N位
BANK_ADDRHN = BANK_ADDRHN_CLR | Conver.Conver[0]; //高N位地址輸出
*Addr_Bus = 0X30; //扇區擦除
}
Delay_ms (50); //延時等待外部Flash擦除操作完畢
}
/***********************************************************************************
* 函數名稱:Flash_ByteWR;
*
* 函數功能描述:Flash寫入字節程序;
*
* 輸入參數:unsigned long類型地址,unsigned char類型數據;
*
* 返回數據:none;
*
* 注意: 系統選用39VF040,如有同系列型號變動,可修改頭文件,無須改動此程序;
************************************************************************************
void Flash_ByteWR (unsigned long Address, unsigned char Dat)
{
unsigned char xdata *Addr_Bus; //定義外部指針
unsigned int Temp; //定義地址總線地址寄存變量
unsigned char Sec; //定義高N位地址寄存變量
BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01; //順序執行器件操作,請參考相關DATASHEET
CMD0_Addr = 0XAA;
BANK_ADDRHN = BANK_ADDRHN_CLR;
CMD1_Addr = 0X55;
BANK_ADDRHN = BANK_ADDRHN_CLR | 0x01;
CMD0_Addr = 0XA0;
Temp = Address | 0XC000; //加入片選信號
Sec = ((unsigned char)(Address>>14)) & BANK_ADDR;//取地址高N位
BANK_ADDRHN = BANK_ADDRHN_CLR | Sec; //高N位輸出
Addr_Bus = Temp;
*Addr_Bus = Dat; //數據寫入
Delay_us (14);
}
/***********************************************************************************
* 函數名稱:Flash_DataWR;
*
* 函數功能描述:Flash寫入多數據程序;
*
* 輸入參數:unsigned long類型地址,unsigned char類型數據起始指針,unsigned char類型數據長度;
*
* 返回數據:none;
*
* 注意: 字符串長度不超過256字節;
************************************************************************************
void Flash_DataWR (unsigned long Address, unsigned char *dat_sta, unsigned char Count)
{
while (Count--) //循環寫入
Flash_ByteWR (Address++,*dat_sta++); //更新細節寫入的地址和數據
}
/***********************************************************************************
* 函數名稱:Flash_ByteRD;
*
* 函數功能描述:Flash讀取字節函數程序;
*
* 輸入參數:unsigned long類型地址;
*
* 返回數據:unsigned char類型讀出數據;
*
* 注意: 系統選用39VF040,如有同系列型號變動,可修改頭文件,無須改動此程序;
************************************************************************************/
unsigned char Flash_ByteRD (unsigned long Address)
{
unsigned char xdata *Addr_Bus;
unsigned int Temp;
unsigned char Sec; //定義器件高位地址變量
Temp = Address | 0XC000; //14位低位地址組合2位片選信號
Sec = (Address>>14) & BANK_ADDR;//取出器件高位地址,舍棄無用位
BANK_ADDRHN = BANK_ADDRHN_CLR | Sec; //高位地址輸出
Addr_Bus = Temp; //給低位地址賦指針
return *Addr_Bus; //取數據
}
/***********************************************************************************
* 函數名稱:Flash_DataRD;
*
* 函數功能描述:Flash多數據讀取程序;
*
* 輸入參數:unsigned long類型地址,unsigned char類型數據存儲起始地址指針,unsigned char類型數據長度;
*
* 返回數據:none;
*
* 注意: 注意所給地址范圍,地址出錯將返回不正確的數據;
************************************************************************************/
void Flash_DataRD (unsigned long Address, unsigned char *Buf, unsigned char Count)
{
while (Count--)
*Buf++ = Flash_ByteRD (Address++);
}
/************************************************************************************
* 文件結束
************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -