📄 nflash.c
字号:
/*********************************************************************************************************
** KAIXIN Co.,Ltd.
**
**--------------文件信息-------------------------------------------------------------------------------
** 文件名: NFLASH.c
** 修改日期: 2007-8-8
** 版本: V1.0
** 描述: ISP61A1 设备端驱动程序 FLASH操作层
**
**------------------------------------------------------------------------------------------------------
** 创建: 安 宁
** 创建日期: 2007-8-8
** 版本: V1.0
** 描述: 原始版本
********************************************************************************************************/
#include "config.h"
#include "D13Config.h"
#include "D13CI.h"
#include "Chap_9.h"
#include "D13Driver.h"
//#include "SCSI.h"
#include "NFLASH.h"
INT8U addr[3] = {0,0,0};
uint16 addr0;
INT8U addrd[3] = {0,0,0};
uint8 databuffer[512];
uint8 *p = (uint8 *)0x7FE00000;
//p ;
unsigned int WriteResidueVal = 0;
unsigned int WriteResidueValcopy = 0;
unsigned int ReadResidueVal = 0;
extern INT32U offset,offsetr,offsetd,times1,times2,temp;
/*********************************************************************************************************
** 函数名称 :FLSCMD(unsigned char CMD)
** 函数功能 :发送FLASH操作命令
**********************************************************************************************************/
void FLSCMD(unsigned char CMD)
{
PINSEL3 = 0x00000005; // 设置P1管脚
FIO1MASK= 0x0007FFFF; // 屏蔽对网口的操作
FIO1DIR = 0xFFFFFFFF; // 定义为输出
FIO1PIN = 0x78000000;
FIO1PIN = 0xB0000000;
FIO1PIN = 0x90000000;
FIO1PIN = (0x90000000)|((0x000000FF &CMD)<<19); //SEND CMD
FIO1PIN = (0xB0000000)|((0x000000FF &CMD)<<19); //SEND CMD
FIO1PIN = 0x7FF80000;
FIO1MASK = 0x00000000;
}
/*********************************************************************************************************
** 函数名称 :FLSADD(unsigned int blockadd,unsigned char pageadd)
** 函数功能 :发送FLASH 块地址,页地址。
**********************************************************************************************************/
void FLSADD(INT8U addrh,INT8U addrl,INT8U byteaddr)
{
PINSEL3 = 0x00000005; // 设置P1管脚
FIO1MASK= 0x0007FFFF; // 屏蔽对网口的操作
FIO1DIR=0xFFFFFFFF; // 定义为输出
FIO1PIN=0xB8000000;
FIO1PIN=0x30000000;
FIO1PIN=0x70000000;
FIO1PIN=(0x50000000)|((0x000000FF &byteaddr)<<19);
FIO1PIN=(0x70000000)|((0x000000FF &byteaddr)<<19);
FIO1PIN=(0x50000000)|((addrl)<<19);
FIO1PIN=(0x70000000)|((addrl)<<19);
FIO1PIN=(0x50000000)|((addrh)<<19);
FIO1PIN=(0x70000000)|((addrh)<<19);
FIO1PIN=0x70000000;
FIO1MASK = 0x00000000;
}
/*********************************************************************************************************
** 函数名称 :FLSWRH(unsigned char CMD)
** 函数功能 :页写,连续写256字节
**********************************************************************************************************/
uint8 FlsStatus()
{
uint8 temp;
PINSEL3 = 0x00000005; // 设置P1 16~31管脚
FIO1MASK= 0x0007FFFF; // 屏蔽对网口的操作
FIO1DIR=0xF807FFFF;
FLSCMD(0x70);
FIO1PIN=0x38000000;
FIO1PIN=0x30000000;
FIO1PIN=0x20000000;
temp=(FIO1PIN&0x07F80000)>>19;
FIO1PIN=0x3FF80000;
return temp;
}
/*********************************************************************************************************
** 函数名称 :FLSWR(unsigned char CMD)
** 函数功能 :页写,连续写64字节
**********************************************************************************************************/
/*void FLSWR(void)
{
unsigned int i,j;//
PINSEL3 = 0x00000005; // 设置P1 16~31管脚
FIO1MASK= 0x0007FFFF; // 屏蔽对网口的操作
FIO1DIR = 0xFFFFFFFF; // 定义为输出
PINSEL1 = 0x00000000; // 设置P0 16~31管脚
FIO0MASK= 0xFF7FFFFF; // 屏蔽对特殊管脚的操作
FLSCMD(0x00);
FLSCMD(0x80);
FLSADD(addr[2],addr[1],addr[0]);
FIO1PIN=0x30000000;
//j = ((times2%16) - 1)*512;
j = (times2%16)*512;
//j = 0;
i = 0;
do
{
FIO1PIN=(0x10000000)|FIO1PIN;
//FIO1PIN=(0x10000000)|FIO1PIN;
FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[j+i])<<19));
FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[j+i])<<19));
FIO1PIN=((0x30000000)|((0x000000FF &ControlData.dataBuffer[j+i])<<19));
FIO1PIN=(0x30000000)|FIO1PIN;
i++;
}while(i<512);
FLSCMD(0x10);
while(!(FIO0PIN&0x00800000));
FLSCMD(0xff);
//j += 512 ;
//addr[0] += 64;
//if(addr[0]==0)
//{
addr[1]++;
if(addr[1] ==0)
{
addr[2]++;
}
// }
FIO1PIN=0x08000000;
FIO1MASK = 0x00000000;
FIO0MASK = 0x00000000;
}*/
/*void FLSWR(void)
{
unsigned int i;//,j
PINSEL3 = 0x00000005; // 设置P1 16~31管脚
FIO1MASK= 0x0007FFFF; // 屏蔽对网口的操作
FIO1DIR = 0xFFFFFFFF; // 定义为输出
PINSEL1 = 0x00000000; // 设置P0 16~31管脚
FIO0MASK= 0xFF7FFFFF; // 屏蔽对特殊管脚的操作
FLSCMD(0x00);
FLSCMD(0x80);
FLSADD(addr[2],addr[1],addr[0]);
FIO1PIN=0x30000000;
//j = ((times2%16) - 1)*512;
//j = (times2%16)*512;
//j = 0;
i = 0;
do
{
FIO1PIN=(0x10000000)|FIO1PIN;
//FIO1PIN=(0x10000000)|FIO1PIN;
FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[i])<<19));
FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[i])<<19));
FIO1PIN=((0x30000000)|((0x000000FF &ControlData.dataBuffer[i])<<19));
FIO1PIN=(0x30000000)|FIO1PIN;
i++;
}while(i<512);
FLSCMD(0x10);
while(!(FIO0PIN&0x00800000));
FLSCMD(0xff);
//j += 512 ;
//addr[0] += 64;
//if(addr[0]==0)
//{
addr[1]++;
if(addr[1] ==0)
{
addr[2]++;
}
// }
FIO1PIN=0x08000000;
FIO1MASK = 0x00000000;
FIO0MASK = 0x00000000;
}*/
/*void FLSWR(void)
{
unsigned int i;//,j
PINSEL3 = 0x00000005; // 设置P1 16~31管脚
FIO1MASK= 0x0007FFFF; // 屏蔽对网口的操作
FIO1DIR = 0xFFFFFFFF; // 定义为输出
PINSEL1 = 0x00000000; // 设置P0 16~31管脚
FIO0MASK= 0xFF7FFFFF; // 屏蔽对特殊管脚的操作
if(addr0<=255)
FLSCMD(0x00);
else
FLSCMD(0x01);
FLSCMD(0x80);
FLSADD(addr[2],addr[1],addr0%256);
FIO1PIN=0x30000000;
//j = ((times2%16) - 1)*512;
//j = (times2%16)*512;
//j = 0;
i = 0;
do
{
FIO1PIN=(0x10000000)|FIO1PIN;
//FIO1PIN=(0x10000000)|FIO1PIN;
FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[i])<<19));
FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[i])<<19));
FIO1PIN=((0x30000000)|((0x000000FF &ControlData.dataBuffer[i])<<19));
FIO1PIN=(0x30000000)|FIO1PIN;
i++;
}while(i<64);
FLSCMD(0x10);
while(!(FIO0PIN&0x00800000));
FLSCMD(0xff);
//j += 512 ;
addr0 += 64;
if(addr0==512)
{
addr0 = 0;
addr[1]++;
if(addr[1] ==0)
{
addr[2]++;
}
}
FIO1PIN=0x08000000;
FIO1MASK = 0x00000000;
FIO0MASK = 0x00000000;
}*/
void FLSWR(uint16 len,uint8 n)
{
unsigned int i,j;//
PINSEL3 = 0x00000005; // 设置P1 16~31管脚
FIO1MASK= 0x0007FFFF; // 屏蔽对网口的操作
FIO1DIR = 0xFFFFFFFF; // 定义为输出
PINSEL1 = 0x00000000; // 设置P0 16~31管脚
FIO0MASK= 0xFF7FFFFF; // 屏蔽对特殊管脚的操作
if(addr0<=255)
FLSCMD(0x00);
else
FLSCMD(0x01);
FLSCMD(0x80);
FLSADD(addr[2],addr[1],addr0%256);
FIO1PIN=0x30000000;
//j = ((times2%16) - 1)*512;
//j = (times2%16)*512;
//j = 0;
j = 512*n;
i = 0;
do
{
FIO1PIN=(0x10000000)|FIO1PIN;
//FIO1PIN=(0x10000000)|FIO1PIN;
FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[i+j])<<19));
FIO1PIN=((0x10000000)|((0x000000FF &ControlData.dataBuffer[i+j])<<19));
FIO1PIN=((0x30000000)|((0x000000FF &ControlData.dataBuffer[i+j])<<19));
FIO1PIN=(0x30000000)|FIO1PIN;
i++;
}while(i<len);
FLSCMD(0x10);
while(!(FIO0PIN&0x00800000));
FLSCMD(0xff);
//j += 512 ;
addr0 += len;
if(addr0==512)
{
addr0 = 0;
addr[1]++;
if(addr[1] ==0)
{
addr[2]++;
}
}
FIO1PIN=0x08000000;
FIO1MASK = 0x00000000;
FIO0MASK = 0x00000000;
}
void FLSWR1(INT8U addrhs,INT8U addrls,INT8U addrld)
{
unsigned int i,j;
j = addrld*512;
addr[2] = addrhs;
addr[1] = addrls;
PINSEL3 = 0x00000005; // 设置P1 16~31管脚
FIO1MASK= 0x0007FFFF; // 屏蔽对网口的操作
FIO1DIR = 0xFFFFFFFF; // 定义为输出
PINSEL1 = 0x00000000; // 设置P0 16~31管脚
FIO0MASK= 0xFF7FFFFF; // 屏蔽对特殊管脚的操作
FLSCMD(0x00);
FLSCMD(0x80);
FLSADD(addr[2],addr[1],addr[0]);
FIO1PIN=0x30000000;
//j = ((times2%16) - 1)*512;
//j = (times2%16)*512;
i=0;
do
{
FIO1PIN=(0x10000000)|FIO1PIN;
//FIO1PIN=(0x10000000)|FIO1PIN;
FIO1PIN=((0x10000000)|((0x000000FF &p[j+i])<<19));
FIO1PIN=((0x10000000)|((0x000000FF &p[j+i])<<19));
FIO1PIN=((0x30000000)|((0x000000FF &p[j+i])<<19));
FIO1PIN=(0x30000000)|FIO1PIN;
i++;
}while(i<512);
FLSCMD(0x10);
while(!(FIO0PIN&0x00800000));
FLSCMD(0xff);
//addr[0] += 64;
//if(addr[0]==0)
//{
//addr[1]++;
//if(addr[1] ==0)
// {
// addr[2]++;
// }
// }
FIO1PIN = 0x08000000;
FIO1MASK = 0x00000000;
FIO0MASK = 0x00000000;
}
/*********************************************************************************************************
** 函数名称 :FLSRDP(unsigned int blockadd)
** 函数功能 :页读,连续读64字节
**********************************************************************************************************/
void FLSRDP(void)
{
/* int i;
for( i = 0;i<512;i++)
{
Bulk_Task.dataBuffer[i]=i;
}*/
unsigned int i;
PINSEL3 = 0x00000005; // 设置P1 16~31管脚
FIO1MASK= 0x0007FFFF; // 屏蔽对网口的操作
PINSEL1 = 0x00000000; // 设置P0 16~31管脚
FIO0MASK= 0xFF7FFFFF; // 屏蔽对特殊管脚的操作
//FIO0DIR = !FLSRB; // 设置FLSRB输入
FLSCMD(0x00);
//FLSCMD(0x50);
FLSADD(addr[2],addr[1],addr[0]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -