📄 nflash32.c
字号:
/*++
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 + -