?? nflash32.c.bak
字號:
/*++
Module Name:
NFlash32.c
Abstract:
Header file related to D12 module
Environment:
ICCAVR 6.29
Revision History:
04/23/2004 chenchi created
--*/
/******************************************************************/
#include "io8515v.h"
#include "d12.h"
#include "scsi.h"
#include "nflash32.h"
unsigned int WriteResidueVal = 0;
unsigned char Flash_Write_Sec = 0x00;
unsigned char Flash_Write_Col = 0x00;
unsigned char Flash_Write_addl = 0x00;
unsigned char Flash_Write_addh = 0x00;
unsigned long ReadResidueVal = 0;
unsigned char Flash_Read_Sec = 0x00;
unsigned char Flash_Read_Col = 0x00;
unsigned char Flash_Read_addl = 0x00;
unsigned char Flash_Read_addh = 0x00;
/************************************************************
**工程名稱:U盤固件程序開發
**編譯器類型及版本:ICCAVR 6.26C
**日期:2004.4.30
**創建人:陳馳
**所屬單位:湖南大學計算機與通信學院
**芯片類型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
**時鐘頻率:8MHZ
**函數功能:塊擦除函數
**函數輸入參數及說明:
addh:高地址
addl:低地址
**函數返回值:無
**在本函數以外定義的變量:fCOMMAND,fADD,fWPs,fWPc,fRB
**調用的函數說明:無
**修改人:陳馳
**修改日期:2004.4.30
**修改說明:創建
*************************************************************/
void flashErase(unsigned char addh,unsigned char addl)
{
unsigned char i=0;
fWPs;//打開寫保護
fCOMMAND = 0x60;//塊擦除命令
fADD = addl;//低地址
fADD = addh;//高地址
fCOMMAND = 0xd0;//處理命令
asm("nop \n nop");
while(!fRB);
fCOMMAND = 0x70;//讀狀態命令
i = fDATA;//讀狀態值
csram;
fWPc;//寫保護
printf("%x,%x erase is %x",addh,addl,i);//串口打印
}
/************************************************************
**工程名稱:U盤固件程序開發
**編譯器類型及版本:ICCAVR 6.26C
**日期:2004.4.30
**創建人:陳馳
**所屬單位:湖南大學計算機與通信學院
**芯片類型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
**時鐘頻率:8MHZ
**函數功能:寫FLASH預處理函數
**函數輸入參數及說明:無
**函數返回值:無
**在本函數以外定義的變量:
**調用的函數說明:無
**修改人:陳馳
**修改日期:2004.4.30
**修改說明:創建
*************************************************************/
void flashWritecmd(void)
{
unsigned char Erase_addh,Erase_addl;
unsigned char Sour_addh,Sour_addl,Dest_addh,Dest_addl;
unsigned char Sour_two_addh,Sour_two_addl,Dest_two_addh,Dest_two_addl;
unsigned int Erase_Count = 0,i = 0;
unsigned int CopyBack_Count = 0;
unsigned int CopyBack_two_count = 0;
unsigned int 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 = XmtBuff.b[19];
Sour_addl = (XmtBuff.b[20]/0x20) * 0x20;
Dest_addh = 0xfa;
Dest_addl = (XmtBuff.b[20]/0x20) * 0x20;
CopyBack_Count = XmtBuff.b[20]%0x20;
for(i=0;i<CopyBack_Count;i++){
flashCopyBLack(Sour_addh,Sour_addl,Dest_addh,Dest_addl);
Sour_addl ++;
Dest_addl ++;
}
Erase_addl = (XmtBuff.b[20]/0x20) * 0x20;
Erase_addh = XmtBuff.b[19];
WritePageNum = (XmtBuff.b[22]<<8)+XmtBuff.b[23];
Erase_Count = WritePageNum / 0x20;
if(WritePageNum % 0x20){
Erase_Count ++;
if((WritePageNum % 0x20) > (0x20 - (XmtBuff.b[20] % 0x20)))
Erase_Count ++;
}else if(XmtBuff.b[20] % 0x20){
Erase_Count ++;
}
Start_add.add = (XmtBuff.b[19]<<8)+XmtBuff.b[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= XmtBuff.b[20];
Flash_Write_addh= XmtBuff.b[19];
WriteResidueVal=(XmtBuff.b[22]<<8)+XmtBuff.b[23];
}
/************************************************************
**工程名稱:U盤固件程序開發
**編譯器類型及版本:ICCAVR 6.26C
**日期:2004.4.30
**創建人:陳馳
**所屬單位:湖南大學計算機與通信學院
**芯片類型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
**時鐘頻率:8MHZ
**函數功能:寫FLASH函數
**函數輸入參數及說明:寫入數據
**函數返回值:無
**在本函數以外定義的變量:
**調用的函數說明:無
**修改人:陳馳
**修改日期:2004.4.30
**修改說明:創建
*************************************************************/
void flashWrite(unsigned char * PageBuff)
{
unsigned int i;
if(WriteResidueVal > 0)
{
fWPs;//打開寫保護
fCOMMAND = 0x00;//從FRIST部分開始
fCOMMAND = 0x80;//寫FLASH命令
fADD = 0x00;//從0列開始
fADD = Flash_Write_addl;//頁地址低位
fADD = Flash_Write_addh;//頁地址高位
for(i=0;i<512;i++)
{
fDATA = PageBuff[i];//寫數據到FLASH指定頁里
}
fCOMMAND = 0x10;
asm("nop \n nop");
while(!fRB);
fCOMMAND = 0x70;//讀狀態值命令
i = fDATA;//讀狀態值
D12_COMMAND = 0xf2;//清端點緩沖區
csram;
fWPc;//寫保護
WriteResidueVal = WriteResidueVal - 1;
if(Flash_Write_addl== 255){
Flash_Write_addl= 0x00;
Flash_Write_addh++;
}else
Flash_Write_addl++;
}
}
/************************************************************
**工程名稱:U盤固件程序開發
**編譯器類型及版本:ICCAVR 6.26C
**日期:2004.4.30
**創建人:陳馳
**所屬單位:湖南大學計算機與通信學院
**芯片類型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
**時鐘頻率:8MHZ
**函數功能:FLASH頁拷貝命令
**函數輸入參數及說明:
Source_addh:源地址高位
Source_addl:源地址低位
Destination_addh:目的地址高位
Destination_addl:目的地址低位
**函數返回值:無
**在本函數以外定義的變量:
**調用的函數說明:無
**修改人:陳馳
**修改日期:2004.4.30
**修改說明:創建
*************************************************************/
void flashCopyBLack(unsigned char Source_addh,unsigned char Source_addl,unsigned char Destination_addh,unsigned char Destination_addl)
{
unsigned char i;
fWPs;//打開寫保護
fCOMMAND = 0x00;//頁拷貝命令
/*源地址*/
fADD = 0x00;
fADD = Source_addl;
fADD = Source_addh;
asm("nop \n nop");
while(!fRB);
fCOMMAND = 0x8a;//頁拷貝命令
/*目的地址*/
fADD = 0x00;
fADD = Destination_addl;
fADD = Destination_addh;
asm("nop \n nop");
while(!fRB);
fCOMMAND = 0x70;//讀狀態命令
i = fDATA;//讀狀態值
csram;
fWPc;//寫保護
}
/************************************************************
**工程名稱:U盤固件程序開發
**編譯器類型及版本:ICCAVR 6.26C
**日期:2004.4.30
**創建人:陳馳
**所屬單位:湖南大學計算機與通信學院
**芯片類型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
**時鐘頻率:8MHZ
**函數功能:讀FLASH預處理函數
**函數輸入參數及說明:無
**函數返回值:無
**在本函數以外定義的變量:
**調用的函數說明:無
**修改人:陳馳
**修改日期:2004.4.30
**修改說明:創建
*************************************************************/
void flashReadcmd(void)
{
/****************說明************
對于FLASH的讀原理為:FLASH的讀
可以是隨機讀取,所以這里只要給
定讀數據的首地址和讀寫長度
********************************/
Flash_Read_Sec = 0x00;
Flash_Read_Col = 0x00;
Flash_Read_addl = XmtBuff.b[20];
Flash_Read_addh = XmtBuff.b[19];
ReadResidueVal = (XmtBuff.b[22]<<8) + XmtBuff.b[23];
ReadResidueVal = 512 * ReadResidueVal;
fCOMMAND = 0xff;
asm("nop \n nop");
while(!fRB);
}
/************************************************************
**工程名稱:U盤固件程序開發
**編譯器類型及版本:ICCAVR 6.26C
**日期:2004.4.30
**創建人:陳馳
**所屬單位:湖南大學計算機與通信學院
**芯片類型:AT90S8515,PDIUSUD12,K9F5608U0A-YCB0
**時鐘頻率:8MHZ
**函數功能:讀FLASH函數
**函數輸入參數及說明:無
**函數返回值:無
**在本函數以外定義的變量:
**調用的函數說明:無
**修改人:陳馳
**修改日期:2004.4.30
**修改說明:創建
*************************************************************/
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;
fADD = Flash_Read_Col;
fADD = Flash_Read_addl;
fADD = Flash_Read_addh;
asm("nop \n nop");
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;
}
D12_COMMAND = 0x05;//選擇端點(指針指向0位置)
cwait;
D12_COMMAND = 0xf0;//寫緩沖區
cwait;
/****************************
緩沖區數據結構:
字節1:保留,可為任意值
字節2:數據字節的數目/長度
字節3:數據字節1
字節4:數據字節2
*****************************/
D12_DATA = 0x00;//字節1
cwait;
D12_DATA = 64;//字節2
csram;
for(i=0;i<64;i++)
{
D12_DATA = fDATA;//讀數據
cwait;
}
D12_COMMAND = 0xfa;//設置緩沖區有效(滿標志)
csram;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -