?? nflash.c
字號:
/***********************************************************
Module Name:
NFlash32.c
***********************************************************/
#include "reg52.h"
#include "d12config.h"
#include "D12CI.h"
#include "Chap_9.h"
#include "SCSI.h"
#include "NFLASH.h"
unsigned int idata WriteResidueVal = 0;
unsigned char idata Flash_Write_Sec = 0x00;
unsigned char idata Flash_Write_Col = 0x00;
unsigned char idata Flash_Write_addl = 0x00;
unsigned char idata Flash_Write_addh = 0x00;
unsigned long idata ReadResidueVal = 0;
unsigned char idata Flash_Read_Sec = 0x00;
unsigned char idata Flash_Read_Col = 0x00;
unsigned char idata Flash_Read_addl = 0x00;
unsigned char idata Flash_Read_addh = 0x00;
unsigned char idata Flash_Write_No = 0x00;
sbit fRB = P1^4;
sbit fRE = P1^5;
sbit CLE = P3^0;
sbit ALE = P3^1;
sbit fWE = P3^4;
sbit fWP = P3^5;
/********************************************************
Flash 底層讀寫操作
**********************************************************/
void fcommand(unsigned char cmd)
{
P2 = cmd;
CLE = 1;
fWE = 0;
fWE = 1;
CLE = 0;
}
void faddr(unsigned char addr)
{
P2 = addr;
ALE = 1;
fWE = 0;
fWE = 1;
ALE = 0;
}
void fwedata(unsigned char Data)
{
P2 = Data;
fWE = 0;
fWE = 1;
}
unsigned char fredata(void)
{
fRE = 0;
return P2;
fRE = 1;
}
/************************************************************
**函數功能:塊擦除函數
**函數輸入參數及說明:
addh:高地址
addl:低地址
**函數返回值:無
**在本函數以外定義的變量:fCOMMAND,fADD,fWPs,fWPc,fRB
**調用的函數說明:無
**修改人:胡琦宗
**修改日期:2005.12.9
**修改說明:創建
*************************************************************/
void flashErase(unsigned char addh,unsigned char addl)
{
unsigned char i = 0;
fWP = 1;//打開寫保護
fcommand(0x60);//塊擦除命令
faddr(addl);//低地址
faddr(addh);//高地址
fcommand(0xd0);//處理命令
while(!fRB);
fcommand(0x70);//讀狀態命令
i = fredata();//讀狀態值
fWP = 0;//寫保護
// printf("%x,%x erase is %x",addh,addl,i);//串口打印
}
/************************************************************
**函數功能:寫FLASH預處理函數
**函數輸入參數及說明:無
**函數返回值:無
**在本函數以外定義的變量:
**調用的函數說明:無
**修改人:胡琦宗
**修改日期:2005.12.9
**修改說明:創建
*************************************************************/
void flashWritecmd(void)
{
unsigned char idata Erase_addh,Erase_addl;
unsigned char idata Sour_addh,Sour_addl,Dest_addh,Dest_addl;
unsigned char idata Sour_two_addh,Sour_two_addl,Dest_two_addh,Dest_two_addl;
unsigned int idata Erase_Count = 0,i = 0;
unsigned int idata CopyBack_Count = 0;
unsigned int idata CopyBack_two_count = 0;
unsigned int idata WritePageNum = 0;
union{
unsigned char c[2];
unsigned int add;
}Start_add;
union{
unsigned char c[2];
unsigned int add;
}End_add;
/************說明*****************
對于FLASH的寫操作原理是,寫之前
必須擦除,FLASH寫是按頁寫,但是擦
除是按塊擦除,1塊 = 32頁,所以在
一塊內只有部分頁被寫入時就需要先
將塊內其他頁保存,代整塊擦除后一起
寫入,這里用0XFA,0X00作為頭塊緩沖,
0XFB,0X00作為最后塊緩沖,中間塊采
用直接擦除處理
**********************************/
flashErase(0xfa, 0x00);
Sour_addh = ControlData.dataBuffer[19];
Sour_addl = (ControlData.dataBuffer[20]/0x20) * 0x20;
Dest_addh = 0xfa;
Dest_addl = (ControlData.dataBuffer[20]/0x20) * 0x20;
CopyBack_Count = ControlData.dataBuffer[20]%0x20;
for(i=0;i<CopyBack_Count;i++){
flashCopyBLack(Sour_addh,Sour_addl,Dest_addh,Dest_addl);
Sour_addl ++;
Dest_addl ++;
}
Erase_addl = (ControlData.dataBuffer[20]/0x20) * 0x20;
Erase_addh = ControlData.dataBuffer[19];
WritePageNum = (ControlData.dataBuffer[22]<<8)+ControlData.dataBuffer[23];
Erase_Count = WritePageNum / 0x20;
if(WritePageNum % 0x20){
Erase_Count ++;
if((WritePageNum % 0x20) > (0x20 - (ControlData.dataBuffer[20] % 0x20)))
Erase_Count ++;
}else if(ControlData.dataBuffer[20] % 0x20){
Erase_Count ++;
}
Start_add.add = (ControlData.dataBuffer[19]<<8)+ControlData.dataBuffer[20];
End_add.add = Start_add.add + WritePageNum;
flashErase(0xfb, 0x00);
Sour_two_addh = End_add.c[1];
Sour_two_addl = End_add.c[0];
Dest_two_addh = 0xfb;
Dest_two_addl = End_add.c[0];
CopyBack_two_count = (Erase_Count * 0x20) - CopyBack_Count -WritePageNum;
for(i=0;i<CopyBack_two_count;i++){
flashCopyBLack(Sour_two_addh,Sour_two_addl,Dest_two_addh,Dest_two_addl);
Sour_two_addl ++;
Dest_two_addl ++;
}
for(i=0;i<Erase_Count;i++){
flashErase(Erase_addh, Erase_addl);
if(Erase_addl == 224){
Erase_addl = 0x00;
Erase_addh ++;
}else
Erase_addl += 0x20;
}
for(i=0;i<CopyBack_Count;i++){
Sour_addl --;
Dest_addl --;
flashCopyBLack(Dest_addh,Dest_addl,Sour_addh,Sour_addl);
}
for(i=0;i<CopyBack_two_count;i++){
Sour_two_addl --;
Dest_two_addl --;
flashCopyBLack(Dest_two_addh,Dest_two_addl,Sour_two_addh,Sour_two_addl);
}
Flash_Write_Sec= 0x00;
Flash_Write_Col= 0x00;
Flash_Write_addl= ControlData.dataBuffer[20];
Flash_Write_addh= ControlData.dataBuffer[19];
WriteResidueVal=(ControlData.dataBuffer[22]<<8)+ControlData.dataBuffer[23];
}
/************************************************************
**函數功能:寫FLASH函數
**函數輸入參數及說明:寫入數據
**函數返回值:無
**在本函數以外定義的變量:
**調用的函數說明:無
**修改人:胡琦宗
**修改日期:2005.12.9
**修改說明:創建
*************************************************************/
void flashWrite() //需修改***
{
unsigned int i;
if(WriteResidueVal > 0)
{
if(Flash_Write_No == 0)
{
fWP = 1;//打開寫保護
fcommand(0x00);//從FRIST部分開始
fcommand(0x80);//寫FLASH命令
faddr(0x00);//從0列開始
faddr(Flash_Write_addl);//頁地址低位
faddr(Flash_Write_addh);//頁地址高位
}
for(i=0;i<64;i++)//需修改***
{
fwedata(ControlData.dataBuffer[i]);//寫數據到FLASH指定頁里
}
Flash_Write_No += 64;
if(Flash_Write_No == 512)
{
fcommand(0x10);
while(!fRB);
fcommand(0x70);//讀狀態值命令
i = fredata;//讀狀態值
fWP = 0;//寫保護
Flash_Write_No = 0;
WriteResidueVal = WriteResidueVal - 1;
if(Flash_Write_addl== 255)
{
Flash_Write_addl= 0x00;
Flash_Write_addh++;
}else
Flash_Write_addl++;
}
}
}
/************************************************************
**函數功能:FLASH頁拷貝命令
**函數輸入參數及說明:
Source_addh:源地址高位
Source_addl:源地址低位
Destination_addh:目的地址高位
Destination_addl:目的地址低位
**函數返回值:無
**在本函數以外定義的變量:
**調用的函數說明:無
**修改人:胡琦宗
**修改日期:2005.12.9
**修改說明:創建
*************************************************************/
void flashCopyBLack(unsigned char Source_addh,unsigned char Source_addl,unsigned char Destination_addh,unsigned char Destination_addl)
{
unsigned char i;
fWP = 1;//打開寫保護
fcommand(0x00);//頁拷貝命令
/*源地址*/
faddr(0x00);
faddr(Source_addl);
faddr(Source_addh);
while(!fRB);
fcommand(0x8a);//頁拷貝命令
/*目的地址*/
faddr(0x00);
faddr(Destination_addl);
faddr(Destination_addh);
while(!fRB);
fcommand(0x70);//讀狀態命令
i = fredata();//讀狀態值
fWP = 0;//寫保護
}
/************************************************************
**函數功能:讀FLASH預處理函數
**函數輸入參數及說明:無
**函數返回值:無
**在本函數以外定義的變量:
**調用的函數說明:無
**修改人:胡琦宗
**修改日期:2005.12.9
**修改說明:創建
*************************************************************/
void flashReadcmd(void)
{
/****************說明************
對于FLASH的讀原理為:FLASH的讀
可以是隨機讀取,所以這里只要給
定讀數據的首地址和讀寫長度
********************************/
Flash_Read_Sec = 0x00;
Flash_Read_Col = 0x00;
Flash_Read_addl = ControlData.dataBuffer[20];
Flash_Read_addh = ControlData.dataBuffer[19];
ReadResidueVal = (ControlData.dataBuffer[22]<<8) + ControlData.dataBuffer[23];
ReadResidueVal = ReadResidueVal<<9;
// fcommand(0xff);
while(!fRB);
}
/************************************************************
**函數功能:讀FLASH函數
**函數輸入參數及說明:無
**函數返回值:無
**在本函數以外定義的變量:
**調用的函數說明:無
**修改人:胡琦宗
**修改日期:2005.12.9
**修改說明:創建
*************************************************************/
void flashRead(void)
{
unsigned char i;
unsigned char temp;
if(ReadResidueVal > 0)
{
ReadResidueVal -= 64;
temp = (unsigned char)(Flash_Read_Col + 64);
fcommand(Flash_Read_Sec);
faddr(Flash_Read_Col);
faddr(Flash_Read_addl);
faddr(Flash_Read_addh);
while(!fRB);
switch (Flash_Read_Sec)
{
case 0x00:
if(temp == 0)
{
Flash_Read_Sec = 0x01;
Flash_Read_Col = 0x00;
}else
{
Flash_Read_Col += 64;
}
break;
case 0x01:
if(temp == 0)
{
if(Flash_Read_addl == 255){
Flash_Read_addl = 0x00;
Flash_Read_addh ++;
}else
Flash_Read_addl ++;
Flash_Read_Sec = 0x00;
Flash_Read_Col = 0x00;
}else
{
Flash_Read_Col += 64;
}
break;
}
for(i=0;i<64;i++)
{
ControlData.dataBuffer[i] = fredata();
}
D12_WriteEndpoint(5,64,ControlData.dataBuffer);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -