norflash驱动程序_第1页
norflash驱动程序_第2页
norflash驱动程序_第3页
norflash驱动程序_第4页
norflash驱动程序_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1. norflash.h文件/*Copyright (c)* Description: norflash驱动程序头文件*-* S3C2410 SST39VF1601 NorFlash* 器件特性:随机读写,按扇区、块、整片擦除,写数据前必须擦除数据地址所在的扇区。* 器件容量:1Mb * 16* = 2MB* = 512个扇区 * 2048字/扇区(1字=2字节)* = 32个块 * 16个扇区/块 * 2048字/扇区(1字=2字节)*/#ifndef _NORFLASH_H#define _NORFLASH_H#ifndef IN_NORFLASH #ifdef _cplusplus extern C #endif#define FLASH_ADDR 0x00000000 / FLASH的起始地址(分配为Bank0块,16位宽度)#define SECTOR_ADDRSIZE 2048 /每扇容量,以字为单位#define BLOCK_ADDRSIZE 32768 /每块容量,以字为单位/* Function name: GetAddr (宏函数)* Descriptions: 转换地址。将要发送给SST39VF1601的地址值进行转换,以便于S3C2410A输出。*由于SST39VF1601的A0是与S3C2410A的A1相连,所以addr要左移1位。* Input: addr SST39VF1601的内部地址值* Output: 返回转换出的地址* Created Date: 2012-12-13*-* Modified by:* Modified Date: *-*/#define GetAddr(addr) (volatile uint16 *)(FLASH_ADDR|(addr1)extern int WordProgram(uint32 Addr, uint16 Data);extern int WordProgramS(uint32 Addr, uint32 len, uint16 *str);extern uint16 WordRead(uint32 Addr);extern int ChipErase(void);extern int ChipEraseBySector(int s);extern int ChipEraseByBlock(int b); #ifdef _cplusplus #endif #endif / IN_NORFLASH#endif 2. norflash.c文件/*Copyright (c)*-File Info-* File Name: norflash.c* Last modified Date: 2011-12-13* Last Version: v1.0* Description: norflash驱动程序*-* S3C2410 SST39VF1601 NorFlash* 器件特性:随机读写,按扇区、块、整片擦除,写数据前必须擦除数据地址所在的扇区。* 器件容量:1Mb * 16* = 2MB* = 512个扇区 * 2048字/扇区(1字=2字节)* = 32个块 * 16个扇区/块 * 2048字/扇区(1字=2字节)*/#include config.h#include NORFLASH.h/* Function name: WordProgram* Descriptions: 半字(16位)数据编程。 * Input: Addr 编程地址(SST39VF1601内部地址) * Data 编程数据* Output: 返回TRUE表示操作成功,返回FALSE表示操作失败* Last modified Date: 2011-12-13*-* Modified by:* Modified Date: *-*/int WordProgram(uint32 Addr, uint16 Data) volatile uint16 *ip; uint16 temp1,temp2; ip = GetAddr(0x5555); / 转换地址0x5555 ip0 = 0xaaaa; / 第一个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip0 = 0x5555; / 第二个写周期,地址0x2aaa,数据0x55 ip = GetAddr(0x5555); ip0 = 0xa0a0; / 第三个写周期,地址0x5555,数据0xA0 ip = GetAddr(Addr); *ip = Data; / 第四个写周期,地址Addr,数据Data temp1 = *ip; / 预读处理 while(1) / 等待操作完成 (若编程操作没有完成,每次读操作DQ6会跳变) temp1 = *ip; temp2 = *ip; if(temp1 = temp2) if(temp1 != Data) return(FALSE); else return(TRUE); / end of if(temp1 = temp2). / end of while(1). return(TRUE);/* Function name: WordProgramS* Descriptions: 半字数组数据编程(写入)。* Input: Addr 编程地址(SST39VF1601内部地址)* len 编程数组长度* Data 编程数组地址* Output: 返回TRUE表示操作成功,返回FALSE表示操作失败* Last modified Date: 2011-12-13*-* Modified by:* Modified Date: *-*/int WordProgramS(uint32 Addr, uint32 len, uint16 *str) uint32 addr; uint32 length = Addr + len; uint16 data,i=0; int res; for(addr=Addr; addrlength; addr+) data = stri+; res = WordProgram(addr, data); if( !res ) return(FALSE); return(TRUE); /* Function name: WordRead* Descriptions: 读取指定地址(Flash内部的)上的半字(16位)数据。 * Input: Addr 编程地址(SST39VF1601内部地址) * Output: 返回值即是读出的数据* Last modified Date: 2011-12-13*-* Modified by:* Modified Date: *-*/uint16 WordRead(uint32 Addr) volatile uint16 *ip; ip = GetAddr(Addr); return(*ip);/* Function name: ChipErase* Descriptions: 芯片全片擦除。 * Input: 无* Output: 返回TRUE表示操作成功,返回FALSE表示操作失败* Last modified Date: 2011-12-13*-* Modified by:* Modified Date: *-*/int ChipErase(void) volatile uint16 *ip; uint16 temp1,temp2; ip = GetAddr(0x5555); ip0 = 0xaaaa; / 第一个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip0 = 0x5555; / 第二个写周期,地址0x2aaa,数据0x55 ip = GetAddr(0x5555); ip0 = 0x8080; / 第三个写周期,地址0x5555,数据0x80 ip = GetAddr(0x5555); ip0 = 0xaaaa; / 第四个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip0 = 0x5555; / 第五个写周期,地址0x2aaa,数据0x55 ip = GetAddr(0x5555); ip0 = 0x1010; / 第六个写周期,地址0x5555,数据0x10 temp1 = *ip; while(1) / 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变) temp1 = *ip; temp2 = *ip; if(temp1 = temp2) if(temp1 != 0xffff) return(FALSE); else return(TRUE); / end of if(temp1 = temp2). / end of while(1). return(TRUE);/* Function name: ChipEraseBySector* Descriptions: 芯片按扇区擦除。* Input: s 要删除扇区的扇区号(范围0-511,超范围芯片自动对512取余)* Output: 返回TRUE表示操作成功,返回FALSE表示操作失败* Last modified Date: 2011-12-13*-* Modified by:* Modified Date: */int ChipEraseBySector(int s) volatile uint16 *ip; uint16 temp1,temp2; ip = GetAddr(0x5555); ip0 = 0xaaaa; / 第一个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip0 = 0x5555; / 第二个写周期,地址0x2aaa,数据0x55 ip = GetAddr(0x5555); ip0 = 0x8080; / 第三个写周期,地址0x5555,数据0x80 ip = GetAddr(0x5555); ip0 = 0xaaaa; / 第四个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip0 = 0x5555; / 第五个写周期,地址0x2aaa,数据0x55 ip = GetAddr(s * 4096 * 8 ); ip0 = 0x3030; / 第六个写周期,地址s * 4096,数据0x30 temp1 = *ip; while(1) / 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变) temp1 = *ip; temp2 = *ip; if(temp1 = temp2) if(temp1 != 0xffff) return(FALSE); else return(TRUE); / end of if(temp1 = temp2). / end of while(1). return(TRUE); /* Function name: ChipEraseByBlock* Descriptions: 芯片按块擦除。* Input: b 要删除块的块号(范围0-31,超范围芯片自动对32取余)* Output: 返回TRUE表示操作成功,返回FALSE表示操作失败* Last modified Date: 2011-12-13*-* Modified by:* Modified Date: */int ChipEraseByBlock(int b) volatile uint16 *ip; uint16 temp1,temp2; ip = GetAddr(0x5555); ip0 = 0xaaaa; / 第一个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip0 = 0x5555; / 第二个写周期,地址0x2aaa,数据0x55 ip = GetAddr(0x5555); ip0 = 0x8080; / 第三个写周期,地址0x5555,数据0x80 ip = GetAddr(0x5555); ip0 = 0xaaaa; / 第四个写周期,地址0x5555,数据0xAA ip = GetAddr(0x2aaa); ip0 = 0x5555; / 第五个写周期,地址0x2aaa,数据0x55 ip = GetAddr(b * 32768); ip0 = 0x3030; / 第六个写周期,地址b * 32768,数据0x30 temp1 = *ip; while(1) / 等待操作完成 (若擦除操作没有完成,每次读操作DQ6会跳变) temp1 = *ip; temp2 = *ip; if(temp1 = temp2) if(temp1 != 0xffff) return(FALSE); else return(TRUE); / end of if(temp1 = temp2). / end of while(1). return(TRUE);3 mian.c/*Copyright (c)* *-File Info-* File Name: main.c* Last modified Date: 2011-12-13* Last Version: v1.0* Description: 测试norflash驱动程序(norflash.c/NORFLASH.h)*-* Modified by: xant* Modified date:* Version:* Description:*/#include config.h#include NORFLASH.h#define SLEN 100 /写入/读出数据的数组大小/* Function name: main* Hardware:* 随机读写,按扇区、块、整片擦除,写数据前必须擦除数据地址所在的扇区* SST39VF1601,2M ,512个扇区,每个扇区2048个word(2个字节),32个块,每块16个扇区* Result:* SST39VF1601 norflash 数据写入/读取/擦除测试结果* 1 按扇区写入/读取/擦除测试* 当扇区号未越界情况下,按扇区写入/读取/擦除均成功。 * 当扇区号越界情况下,芯片自动将扇区号对扇区数目取余(扇区号 = 扇区号 % 扇区数) * 2 按块写入/读取/擦除测试* 当块号未越界情况下,按块写入/读取/擦除均成功。* 当块号越界情况下,芯片自动将块号对块数目取余(块号 = 块号 % 块数)* Input: 无* Output: 系统返回值0* Created Date: 2011-12-9*-* Modified by:* Modified Date: *-*/int main(void) int secNum; /扇区号 范围:0511 int bloNum; /块号 范围:031 uint32 addrSec; /扇区起始地址,secNum * 2048 (word ,two byte); uint32 addrBlock; /块起始地址 uint32 i,k; uint16 wr_data; uint16 bufSLEN=1,2,3,4,9,6,7,8,9,99; /写入值数组 uint16 buftestSLEN; /读取值数组 char str20; /读取值字符数组 / I/O初始化 rGPACON = rGPACON & LED_RUN_MASK; rGPHCON = (rGPHCON & (0x0320) | (0x0120); rGPADAT = rGPADAT & LED_RUN_MASK; / 点亮RUN灯,表示正在操作Flash rGPHDAT = rGPHDAT | BEEP; /uart选择与初始化 UART_Select(0); UART_Init(); UART_SendStr(nn startaaaaaaaaaaa:rn); / 全片擦除操作 ChipErase(); DelayNS(1); /* 按扇区写入/读取/擦除测试*/ secNum = 513; /扇区测试修改参数 addrSec = secNum * SECTOR_ADDRSIZE; /-按扇区写入数据- WordProgramS( addrSec, SLEN, buf) ; /-按扇区读取数据,并通过串口输出到终端(扇区第一次检验)- for(i=0; iSLEN; i+) buftesti = 0; wr_data = WordRead(addrSec+); buftesti = wr_data; for(i=0;iSLEN;i+) sprintf(str,%d ,buftesti ); UART_SendStr( str ); /-循环读取各个扇区的数据,并通过串口输出到终端(扇区号超界情况检验) /-若扇区号超界,则:扇区号 = 扇区号 % 512- for( k=0; k512; k+) addrSec = k * SECTOR_ADDRSIZE; for(i=0; iSLEN; i+) buftesti = 0; wr_data = WordRead(addrSec+); buftesti = wr_data; /串口输出读结果 for(i=0;i100;i+) sprintf(str,%d ,buftesti ); UART_SendStr( str ); /-按扇区擦除数据- addrSec = secNum * SECTOR_ADDRSIZE; ChipEraseBySector(secNum); /-按扇区写入数据- WordProgramS( addrSec, SLEN, buf) ; /-按扇区读取数据,并通过串口输出到终端(扇区第一次检验)- for(i=0; iSLEN; i+) buftesti = 0; wr_data = WordRead(addrSec+); buftesti = wr_data; /串口输出读结果 for(i=0;i100;i+) sprintf(str,%d ,buftesti ); UART_SendStr( str ); /* * 按块写入/读取/擦除测试 */ bloNum = 33; /块测试修改参数 addrBlock = bloNum * BLOCK_ADDRSIZE; /-按块

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论