移植FATFS的NANDFLASH驱动

移植FATFS的NANDFLASH驱动
移植FATFS的NANDFLASH驱动

STM32 EWARM开发过程简介之五--移植FATFS的NANDFLASH驱动

一,建立工程FATFS源码

1,在https://www.360docs.net/doc/0f10122026.html,/fsw/ff/00index_e.html上下载ff007c.zip,并把ff007c.zip里面的

src文件夹复制到D:\works\EK-STM3210E-UCOSII下,并改名为Fatfs;

2,在IDE工程中右击选择“Add Group”建立“FATFS”文件组,并在“FATFS”上右击选择“Add Files”添加D:\works\EK-STM3210E-UCOSII\Fatfs下的C文件;

3,把D:\works\EK-STM3210E-UCOSII\Fatfs文件夹目录添加到项目头文件搜索路径中,如:$PROJ_DIR$\..\..\Fatfs

二,移植NANDFLASH驱动接口

1,把stm32f10x_stdperiph_lib_v3.0.0\Project\Examples\FSMC\NAND下的fsmc_nand.c复制到D:\works\EK-STM3210E-UCOSII\Drivers下,并加入到工程的DRV文件组;

2,把stm32f10x_stdperiph_lib_v3.0.0\Project\Examples\FSMC\NAND下的fsmc_nand.h复制到D:\works\EK-STM3210E-UCOSII\Include下;

3,在fsmc_nand.c前添加上#include "stm32f10x_conf.h",并把系统中的"stm32f10x_conf.h"

文件的/* #include "stm32f10x_fsmc.h" */注释打开;

三,修改FATFS的配置文件

1,把D:\works\EK-STM3210E-UCOSII\Fatfs下的ff.h中的宏定义:

#define _USE_MKFS 0

#define _CODE_PAGE 932

#define _FS_RPATH 0

#define _MAX_SS 512

修改为:

#define _USE_MKFS 1

#define _CODE_PAGE 936

#define _MAX_SS 2048

#define _FS_RPATH 1

2,把D:\works\EK-STM3210E-UCOSII\Fatfs下的integer.h的宏定义:

typedef enum { FALSE = 0, TRUE } BOOL;

修改为:

typedef bool BOOL;//typedef enum { FALSE = 0, TRUE } BOOL;

四,修改FATFS的DISK/IO接口

1,把diskio.c复制后改名为nandio.c替换掉工程中的diskio.c,并添加到EWARM的工程中的“FATFS”文件组;

2,媒介初始化直接返回正常的0:

DSTATUS disk_initialize (BYTE drv)

{ return 0;}

3,媒介状态查询直接返回正常的0:

DSTATUS disk_status (BYTE drv)

{ return 0;}

4,取系统系统直接返回0(自己可以按格式修改为真实时间):

DWORD get_fattime (void)

{ return 0;}

5,媒介控制接口:

DRESULT disk_ioctl (BYTE drv,BYTE ctrl, void *buff)

{

DRESULT res = RES_OK;

uint32_t result;

if (drv){ return RES_PARERR;}

switch(ctrl)

{

case CTRL_SYNC:

break;

case GET_BLOCK_SIZE:

*(DWORD*)buff = NAND_BLOCK_SIZE;

break;

case GET_SECTOR_COUNT:

*(DWORD*)buff = (((NAND_MAX_ZONE/2) * NAND_ZONE_SIZE) * NAND_BLOCK_SIZE);

break;

case GET_SECTOR_SIZE:

*(WORD*)buff = NAND_PAGE_SIZE;

break;

default:

res = RES_PARERR;

break;

}

return res;

}

6,媒介多扇区读接口:

DRESULT disk_read (BYTE drv,BYTE *buff,DWORD sector,BYTE count)

{

uint32_t result;

if (drv || !count){ return RES_PARERR;}

result = FSMC_NAND_ReadSmallPage(buff, sector, count);

if(result & NAND_READY){ return RES_OK; }

else { return RES_ERROR; }

}

7,媒介多扇区写接口:

#if _READONLY == 0

DRESULT disk_write (BYTE drv,const BYTE *buff,DWORD sector,BYTE count) {

uint32_t result;

uint32_t BackupBlockAddr;

uint32_t WriteBlockAddr;

uint16_t IndexTmp = 0;

uint16_t OffsetPage;

/* NAND memory write page at block address*/

WriteBlockAddr = (sector/NAND_BLOCK_SIZE);

/* NAND memory backup block address*/

BackupBlockAddr = (WriteBlockAddr + (NAND_MAX_ZONE/2)*NAND_ZONE_SIZE);

OffsetPage = sector%NAND_BLOCK_SIZE;

if (drv || !count){ return RES_PARERR;}

/* Erase the NAND backup Block */

result = FSMC_NAND_EraseBlock(BackupBlockAddr*NAND_BLOCK_SIZE);

/* Backup the NAND Write Block to High zone*/

for (IndexTmp = 0; IndexTmp < NAND_BLOCK_SIZE; IndexTmp++ )

{

FSMC_NAND_MoveSmallPage (WriteBlockAddr*NAND_BLOCK_SIZE+IndexTmp,BackupBlockAddr*NAND_BLOCK_SIZE+IndexTmp);

}

/* Erase the NAND Write Block */

result = FSMC_NAND_EraseBlock(WriteBlockAddr*NAND_BLOCK_SIZE);

/*return write the block with modify*/

for (IndexTmp = 0; IndexTmp < NAND_BLOCK_SIZE; IndexTmp++ )

{

if((IndexTmp>=OffsetPage)&&(IndexTmp < (OffsetPage+count)))

{

FSMC_NAND_WriteSmallPage((uint8_t *)buff, WriteBlockAddr*NAND_BLOCK_SIZE+IndexTmp, 1);

buff = (uint8_t *)buff + NAND_PAGE_SIZE;

}

else

{

FSMC_NAND_MoveSmallPage (BackupBlockAddr*NAND_BLOCK_SIZE+IndexTmp,WriteBlockAddr*NAND_BLOCK_SIZE+IndexTmp);

}

}

if(result == NAND_READY){ return RES_OK;}

else { return RES_ERROR;}

}

#endif /* _READONLY */

五,调用接口及测试代码

1,调用接口,先初始化FSMC和NANDFLASH:

//NANDFLASH HY27UF081G2A-TPCB

#define NAND_HY_MakerID 0xAD

#define NAND_HY_DeviceID 0xF1

/* Configure the NAND FLASH */

void NAND_Configuration(void)

{

NAND_IDTypeDef NAND_ID;

/* Enable the FSMC Clock */

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

/* FSMC Initialization */

FSMC_NAND_Init();

/* NAND read ID command */

FSMC_NAND_ReadID(&NAND_ID);

/* Verify the NAND ID */

if((NAND_ID.Maker_ID == NAND_ST_MakerID) && (NAND_ID.Device_ID == NAND_ST_DeviceID))

{

printf("ST NANDFLASH");

}

else

if((NAND_ID.Maker_ID == NAND_HY_MakerID) && (NAND_ID.Device_ID == NAND_HY_DeviceID))

{

printf("HY27UF081G2A-TPCB");

}

printf(" ID = 0x%x%x%x%x \n\r",NAND_ID.Maker_ID,NAND_ID.Device_ID,NAND_ID.Third_ID,NAND_ID.Fourth_ID); }

2,然后对媒介格式化,创建读写文件:

void test_fatfs(void)

{

FATFS fs;

FIL fl;

FATFS *pfs;

DWORD clust;

unsigned int r,w,i;

FRESULT res;

// NF_CHKDSK(0,1024);

display_page(0,0);

// for mount

res=f_mount(0,&fs);

printf("f_mount=%x \n\r",res);

// for format

//res=f_mkfs(0,1,2048); //MUST Format for New NANDFLASH !!! //printf("f_mkfs=%x \n\r",res);

// for

pfs=&fs;

res = f_getfree("/", &clust, &pfs);

printf("f_getfree=%x \n\r",res);

printf("\n\r%lu MB total drive space."

"\n\r%lu MB available.\n\r",

(DWORD)(pfs->max_clust - 2) * pfs->csize /2/1024,

clust * pfs->csize /2/1024);

// for read

res=f_open(&fl,"/test2.dat",FA_OPEN_EXISTING | FA_READ);

printf("f_open=%x \n\r",res);

for(i=0;i<2;i++)

{

for(r = 0; r < NAND_PAGE_SIZE; r++)

{

RxBuffer[r]= 0xff;

}

res=f_read(&fl,RxBuffer,NAND_PAGE_SIZE,&r);

printf("f_read=%x \n\r",res);

if(res || r == 0)break;

for(r = 0; r < NAND_PAGE_SIZE; r++)

{

printf("D[%08x]=%02x ",(i*NAND_PAGE_SIZE+r),RxBuffer[r]);

if((r%8)==7)

{printf("\n\r");}

}

}

f_close(&fl);

// for write

res=f_open(&fl,"/test2.dat",FA_CREATE_ALWAYS | FA_WRITE); printf("f_open=%x \n\r",res);

for(i=0;i<2;i++)

{

for(w = 0; w < NAND_PAGE_SIZE; w++)

{

TxBuffer[w]=((w<<0)&0xff);

}

res=f_write(&fl,TxBuffer,NAND_PAGE_SIZE,&w);

printf("f_write=%x \n\r",res);

if(res || w

}

f_close(&fl);

// for umount

f_mount(0,NULL);

}

六,编写NANDFLASH接口

1,fsmc_nand.c文件:

/* Includes ------------------------------------------------------------------*/ #include "fsmc_nand.h"

#include "stm32f10x_conf.h"

/** @addtogroup StdPeriph_Examples

* @{

*/

/** @addtogroup FSMC_NAND

* @{

*/

/* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/

#define FSMC_Bank_NAND FSMC_Bank2_NAND

#define Bank_NAND_ADDR Bank2_NAND_ADDR

#define Bank2_NAND_ADDR ((uint32_t)0x70000000)

/* Private macro -------------------------------------------------------------*/

/* Private variables ---------------------------------------------------------*/

/* Private function prototypes -----------------------------------------------*/

/* Private functions ---------------------------------------------------------*/

/**

* @brief Configures the FSMC and GPIOs to interface with the NAND memory.

* This function must be called before any write/read operation

* on the NAND.

* @param None

* @retval : None

*/

void FSMC_NAND_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

FSMC_NANDInitTypeDef FSMC_NANDInitStructure;

FSMC_NAND_PCCARDTimingInitTypeDef p;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE);

/*-- GPIO Configuration ------------------------------------------------------*/

/* CLE, ALE, D0->D3, NOE, NWE and NCE2 NAND pin configuration */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15 |

GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |

GPIO_Pin_7;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOD, &GPIO_InitStructure);

/* D4->D7 NAND pin configuration */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10;

GPIO_Init(GPIOE, &GPIO_InitStructure);

/* NWAIT NAND pin configuration */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(GPIOD, &GPIO_InitStructure);

/* INT2 NAND pin configuration */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

GPIO_Init(GPIOG, &GPIO_InitStructure);

/*-- FSMC Configuration ------------------------------------------------------*/

p.FSMC_SetupTime = 0x1;

p.FSMC_WaitSetupTime = 0x3;

p.FSMC_HoldSetupTime = 0x2;

p.FSMC_HiZSetupTime = 0x1;

FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND;

FSMC_NANDInitStructure.FSMC_Waitfeature = FSMC_Waitfeature_Enable;

FSMC_NANDInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;

FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable;

FSMC_NANDInitStructure.FSMC_ECCPageSize = FSMC_ECCPageSize_512Bytes;

FSMC_NANDInitStructure.FSMC_TCLRSetupTime = 0x00;

FSMC_NANDInitStructure.FSMC_TARSetupTime = 0x00;

FSMC_NANDInitStructure.FSMC_CommonSpaceTimingStruct = &p;

FSMC_NANDInitStructure.FSMC_AttributeSpaceTimingStruct = &p;

FSMC_NANDInit(&FSMC_NANDInitStructure);

/* FSMC NAND Bank Cmd Test */

FSMC_NANDCmd(FSMC_Bank2_NAND, ENABLE);

}

/**

* @brief Reads NAND memory's ID.

* @param NAND_ID: pointer to a NAND_IDTypeDef structure which will hold * the Manufacturer and Device ID.

* @retval : None

*/

void FSMC_NAND_ReadID(NAND_IDTypeDef* NAND_ID)

{

uint32_t data = 0;

/* Send Command to the command area */

*(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_READID;

/* Send Address to the address area */

*(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = NAND_CMD_IDADDR;

/* Sequence to read ID from NAND flash */

data = *(__IO uint32_t *)(Bank_NAND_ADDR | DATA_AREA);

NAND_ID->Maker_ID = DATA_1st_CYCLE (data);

NAND_ID->Device_ID = DATA_2nd_CYCLE (data);

NAND_ID->Third_ID = DATA_3rd_CYCLE (data);

NAND_ID->Fourth_ID = DATA_4th_CYCLE (data);

}

/**

* @brief This routine is for move one 2048 Bytes Page size to an other 2048 Bytes Page.

* the copy-back program is permitted just between odd address pages or even address pages.

* @param SourcePageAddress: Source page address

* @param T argetPageAddress: T arget page address

* @retval : New status of the NAND operation. This parameter can be:

* - NAND_TIMEOUT_ERROR: when the previous operation generate

* a Timeout error

* - NAND_READY: when memory is ready for the next operation

* And the new status of the increment address operation. It can be:

* - NAND_VALID_ADDRESS: When the new address is valid address

* - NAND_INVALID_ADDRESS: When the new address is invalid address

*/

uint32_t FSMC_NAND_MoveSmallPage(uint32_t SourcePageAddress, uint32_t TargetPageAddress)

{

uint32_t status = NAND_READY ;

uint32_t data = 0xff;

/* Page write command and address */

*(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_MOVE0;

*(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(SourcePageAddress);

*(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(SourcePageAddress);

*(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(SourcePageAddress);

*(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_4th_CYCLE(SourcePageAddress);

*(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_MOVE1;

while( GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_6) == 0 );

*(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_MOVE2;

*(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_1st_CYCLE(TargetPageAddress);

*(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_2nd_CYCLE(TargetPageAddress);

*(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_3rd_CYCLE(TargetPageAddress);

*(__IO uint8_t *)(Bank_NAND_ADDR | ADDR_AREA) = ADDR_4th_CYCLE(TargetPageAddress);

*(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_MOVE3;

while( GPIO_ReadInputDataBit(GPIOG, GPIO_Pin_6) == 0 );

/* Check status for successful operation */

status = FSMC_NAND_GetStatus();

data = *(__IO uint8_t *)(Bank_NAND_ADDR | DATA_AREA);

if(!(data&0x1)) status = NAND_READY;

return (status);

}

/**

* @brief This routine is for writing one or several 2048 Bytes Page size.

* @param pBuffer: pointer on the Buffer containing data to be written

* @param PageAddress: First page address

* @param NumPageToWrite: Number of page to write

* @retval : New status of the NAND operation. This parameter can be:

* - NAND_TIMEOUT_ERROR: when the previous operation generate

* a Timeout error

* - NAND_READY: when memory is ready for the next operation

* And the new status of the increment address operation. It can be:

* - NAND_VALID_ADDRESS: When the new address is valid address

* - NAND_INVALID_ADDRESS: When the new address is invalid address

*/

uint32_t FSMC_NAND_WriteSmallPage(uint8_t *pBuffer, uint32_t PageAddress, uint32_t NumPageToWrite)

{

uint32_t index = 0x00, numpagewritten = 0x00,addressstatus = NAND_VALID_ADDRESS;

uint32_t status = NAND_READY, size = 0x00;

uint32_t data = 0xff;

while((NumPageToWrite != 0x00) && (addressstatus == NAND_VALID_ADDRESS) && (status == NAND_READY)) {

/* Page write command and address */

*(__IO uint8_t *)(Bank_NAND_ADDR | CMD_AREA) = NAND_CMD_WRITE0;

NandFlash简介

NandFlash简介 分类:Linux2013-03-06 14:34 2945人阅读评论(0) 收藏举报 Flash Memory中文名字叫闪存,是一种长寿命的非易失性(在断电情况下仍能保持所存储的数据信息)的存储器。 从名字中就可以看出,非易失性就是不容易丢失,数据存储在这类设备中,即使断电了,也不会丢失,这类设备,除了Flash,还有其他比较常见的入硬盘,ROM等,与此相对的,易失性就是断电了,数据就丢失了,比如大家常用的内存,不论是以前的SDRAM,DDR SDRAM,还是现在的DDR2,DDR3等,都是断电后,数据就没了。 FLASH的分类:功能特性分为两种:一种是NOR型闪存,以编码应用为主,其功能多与运算相关;另一种为NAND型闪存,主要功能是存储资料,如数码相机中所用的记忆卡。 NOR FLASH和NAND FLASH NOR和NAND是现在市场上两种主要的非易失闪存技术。Intel于1988年首先开发出NOR flash技术,彻底改变了原先由EPROM和EEPROM 一统天下的局面。紧接着,1989年,东芝公司发表了NAND flash结结,强调降低每比特的成本,更高的性能,并且象磁盘一样可以通过接口轻松升级。但是经过了十多年之后,仍然有相当多的硬件工程师分不清NOR和NAND闪存。 NOR的读速度比NAND稍快一些。 NAND的写入速度比NOR快很多。 NAND的4ms擦除速度远比NOR的5s快。 大多数写入操作需要先进行擦除操作。 NAND的擦除单元更小,相应的擦除电路更少 在NOR Flash中, 所有的存储区域都保证是完好的, 同时也拥有相同的耐久性。在硬模中专门制成了一个相当容量的扩展存储单元—他们被用来修补存储阵列中那些坏的部分,这也是为了保证生产出来的产品全部拥有完好的存储区域。为了增加产量和降低生产成本, NAND Flash 器件中存在一些随机bad block 。为了防止数据存储到这些坏的单元中, bad block 在IC烧录前必须先识别。在一些出版物中, 有人称bad block 为“bad block”, 也有人称bad block 为“invalid block”。其实他们拥有相同的含义, 指相同的东西。 从实际的应用上来说, NOR Flash与NAND Flash主要的区别在于接口。NOR Flash拥有完整的存取-映射访问接口, 它拥有专门的地址线和数据线, 类似与EPROM。然而在NAND Flash中没有专门的地址线。它发送指令,地址和数据都通过8/16位宽的总线(I/O接口)到内部的寄存器。 SLC/MLC基本原理

NAND Flash中文版资料

NAND Flash 存储器 和 使用ELNEC编程器烧录NAND Flash 技术应用文档 Summer 翻译整理 深圳市浦洛电子科技有限公司 August 2006

目录 一. 简介 ----------------------------------------------------------------------------------- 1 二. NAND Flash与NOR Flash的区别 -------------------------------------------- 1 三. NAND Flash存储器结构描叙 --------------------------------------------------- 4 四. 备用单元结构描叙 ---------------------------------------------------------------- 6 五. Skip Block method(跳过坏块方式) ------------------------------------------ 8 六. Reserved Block Area method(保留块区域方式)----------------------------- 9 七. Error Checking and Correction(错误检测和纠正)-------------------------- 10 八. 文件系统 ------------------------------------------------------------------------------10 九. 使用ELNEC系列编程器烧录NAND Flash -------------------------------- 10 十. Invalid Block Management drop-down menu -------------------------------- 12 十一. User Area Settings3 -------------------------------------------------------- 13 十二. Solid Area Settings --------------------------------------------------------- 15 十三. Quick Program Check-box ---------------------------------------------- 16 十四. Reserved Block Area Options --------------------------------------------17 十五. Spare Area Usage drop-down menu ------------------------------------18

linux下的fpga驱动

#ifndef _FPGA_H_ #define _FPGA_H_ #define INTMSK (0x4A000008) #define EINTMASK (0x560000A4) #define S3C2410_ENABLE_EINT8_23 (~(1<<5)) #define S3C2410_ENABLE_EINT18 (~(1<<18)) #undef PDEBUG /* undef it, just in case */ #define DEBUG //调试时添加此行程序,实际产品中需要注释掉 #ifdef DEBUG # define PDEBUG(fmt, args...) printk( KERN_WARNING "fpga: " fmt, ## args) #else # define PDEBUG(fmt, args...) /* not debugging: nothing */ #endif #define DEVICE_NAME "FPGA" #ifndef FPGA_NR_DEVS #define FPGA_NR_DEVS 1 /*设备数*/ #endif #define FPGAMEM_SIZE 1024/*FPGA每次产生中断可以读取到缓存的数据大小*/ #define FPGACMD_SIZE 3 /*FPGA每次产生中断可以读取到缓存的数据大小*/ #define FPGA_ADDR_START (0x08000000) //nGCS1地址 #define FPGA_ADDR_SIZE 0x30 //申请IO内存的大小 #define FPGA_ADDR_DATA 0x10 //FPGA数据寄存器偏移地址 #define FPGA_ADDR_CMD 0x14 //FPGA命令寄存器偏移地址 /* 定义幻数,定义一个字符,8位,用于检测是否是这类设备,ioctl-number.txt中给出了已经使用的幻数,定义的时候注意避免冲突*/ #define FPGA_IOC 'k' /* 定义命令,这里的命令都是unsigned int类型*/ #define FPGA_IOC_ALLON _IO(FPGA_IOC, 0) // #define FPGA_IOC_ALLDOWN _IO(FPGA_IOC, 1) // #define FPGA_IOC_SET _IOW(FPGA_IOC, 2, int) // #define FPGA_IOC_CLEAR _IOW(FPGA_IOC, 3, int)// #define FPGA_IOC_MAXNR 4 //定义命令的最大序列号

基于FPGA直流电动机驱动的设计

河南大学2014届本科毕业论文 论文题目 基于FPGA直流电动机驱动的设计 论文作者姓名:______________ 作者学号:___1003618004_______ 所在学院:民生学院 所学专业:_电子信息科学与技术_ 导师姓名职称:___ _______ 论文完成时间: 2014年04月24日 _ I

河南大学民生学院本科毕业论文 目录 摘要: ..................................................................................... 错误!未定义书签。 0 前言 (2) 1 绪论 (2) 1.1 课题的来源 (2) 1.2 课题研究的目的及意义 (3) 1.3 课题国内外研究现状 (4) 1.4 课题实质性展现 (4) 2直流电动机的概括 (4) 2.1 直流电动机的基本构成 (4) 2.2 直流电动机的工作原理 (5) 2.3 直流电动机的性能 (6) 3 直流电动机的控制及PWM(脉宽调制) (7) 3.1 控制器的控制电路 (7) 3.2 转子位置传感器 (8) 3.3 直流电动机的控制原理详解 (9) 3.4 直流电机转速控制与PWM脉宽调制 (11) 4 FPGA及其组成的控制器 (12) 4.1 FPGA芯片 (13) 4.2 VHDL硬件描述语言 (14) 4.3 运用FPGA来实现对直流电动机的控制 (15) 4.4 PWM(脉宽调制信号) (16) 4.5速度检测 (19) 5 结论 (20) 参考文献 (20) II

基于FPGA的直流电机驱动的设计 电子信息技术在如今的社会中已然达到迅猛发展阶段,国家也在大力加强电子商务领域的引导性投资,可见其在当今社会中的重要性。 电子技术的发展方向。可以说模拟电子技术是电子技术的根本,在调制解调,功率放大,信号放大、整流稳压等电路方面具有非常重要作用,移动通信等领域都不可或缺。电子技术的另外一个重要组成部分数字电子技术同等重要的,和模拟电子技术相对比,数字电子技术具有稳定性好,精度高,抗干扰性强的优势。也正是因为数字电子的这些优势使得它在一些领域的发展更胜于模拟电子,数字滤波器就是一个很好的证明。 数字电子技术目前也在向两个截然相反的方向发展,一是基于通用处理器的软件开发技术,如单片机、bps等技术,它们是在一个通用处理器的基础上结合少量的硬件电路设计来完成系统的硬件电路,而将主要精力集中在算法、数据处理等软件层次上的系统方法。另一个方向是基于CPLD/FPGA的可编程逻辑器件的系统开发,其特点是将算法、数据加工等工作全部融入系统的硬件设计当中,在“线与线的互联”当中完成对数据的加工。 单片机微处理器作为核心来实现直流电机的控制已然跟不上时代发展的需求。由此电机控制器也由模拟分立原件构成的电路向数模混合、全数字方向发展。此文章主要研究了FPGA芯片在直流电机控制器中的作用。文章详细的介绍了直流电机的类型、结构、工作原理、PWM调速原理和FPGA集成芯片。后对所需应用的硬件语言VHDL方面知识也进行了介绍。从而为论文的具体设计部分提供了理论基础。FPGA的电机控制中,最基本的作用有三:组合逻辑、计数器、状态机。 关键词: FPGA芯片;直流电机;硬件描述语言(VHDL);PWM;现场可编程门阵列 DC motor driven FPGA-based design Electronic information technology in today's society has already reached the rapid development stage, countries are vigorously strengthen the field of electronic commerce to guide investment, and its importance in today's society . Direction of development of electronic technology. It can be said analog electronics technology is the fundamental electronic technology, the modem, power amplification, signal amplification, rectification regulators and other aspects of the circuit has a very important role in areas such as mobile communications are indispensable. Another important part of the digital electronic technology as important as electronic technology, and the relative ratio of analog electronics, digital electronics technology has good stability, high accuracy, strong anti-interference advantages. It is also because of these advantages make it the development of digital electronics in some areas more than analog electronics, digital filter is a good proof. Digital electronic technology is also currently the two diametrically opposite 1

海力士NANDFlash选型

Q1’2011 DATABOOK Rev 0.1

NAND Flash –SLC / MLC / TLC AND Flash N NAND Flash SLC COMPONENT Product Tech Density Block Size Stack Vcc/Org Package Availability Remark HY27US08281A 90nm 128Mb 16KB Mono 3.3v/X8TSOP/USOP Now HY27US08561A 90nm 256Mb 16KB Mono 3.3v/X8TSOP/USOP/FBGA Now HY27US08121B 70nm 512Mb 16KB Mono 3.3v/X8TSOP/USOP/FBGA Now H27U518S2C 57nm 512Mb 16KB Mono 3.3v/X8TSOP Now HY27US081G1M 70nm 1Gb 16KB Mono 3.3v/X8USOP Now HY27UF081G2A 70nm 1Gb 128KB Mono 3.3v/X8TSOP/USOP/FBGA Now HY27US081G2A 70nm 1Gb 128KB Mono 1.8v/X8FBGA Now H27U1G8F2B 48nm 1Gb 128KB Mono 3.3v/X8TSOP,FBGA Now H27U1G8F2B 48nm 1Gb 128KB Mono 1.8v/X8FBGA Now H27U1G8F2CTR 32nm 1Gb 128KB Mono 1.8v/X8TSOP Q4 '11H27U1G8F2CFR 32nm 1Gb 128KB Mono 1.8v/X8FBGA Q4 '11HY27UF082G2B 57nm 2Gb 128KB Mono 3.3v/X8TSOP,FBGA, LGA Now H27U2G8F2C 41nm 2Gb 128KB Mono 3.3v/X8TSOP Now HY27UF084G2B 57nm 4Gb 128KB Mono 3.3v/X8TSOP Now H27U4G8F2D 41nm 4Gb 128KB Mono 3.3v/X8TSOP Now HY27UG088G5(D)B 57nm 8Gb 128KB DDP 3.3v/X8TSOP Now 2CE/Dual CH.H27U8G8G5D 41nm 8Gb 128KB Mono 3.3v/X8TSOP Now H27QBG8GDAIR-BCB 32nm 32Gb 512KB DDP 1.8v/x8VFBGA Now 2CE/Dual CH.H27QCG8HEAIR-BCB 32nm 64Gb 512KB QDP 1.8v/x8VFBGA Now 4CE/Dual CH.H27QDG8JEAJR-BCB 32nm 128Gb 512KB ODP 1.8v/x8 JFBGA Feb. '11 4CE/Dual CH.NAND Flash MLC COMPONENT Product Tech Density Block Size Stack Vcc/Org Package Availability Remark H27U8G8T2B 48nm 8Gb 512KB Mono 3.3v/X8TSOP Now H27UAG8T2M 48nm 16Gb 512KB(4KB Page)Mono 3.3v/X8TSOP/VLGA Now H27UAG8T2A 41nm 16Gb 512KB(4KB Page)Mono 3.3v/X8TSOP Now H27UBG8U5A 41nm 32Gb 512KB(4KB Page)DDP 3.3v/X8TSOP Now H27UBG8T2M 41nm 32Gb 512KB(4KB Page)Mono 3.3v/X8VLGA Now H27UBG8T2A 32nm 32Gb 2MB(8KB Page)SDP 3.3v/x8TSOP / VLGA Now H27UCG8VFA 41nm 64Gb 512KB(4KB Page)QDP 3.3v/X8TSOP Now H27UCG8UDM 41nm 64Gb 512KB(4KB Page)DDP 3.3v/X8VLGA Now Dual CH.H27UCG8U5(D)A 32nm 64Gb 2MB(8KB Page)DDP 3.3v/x8TSOP / VLGA Now Dual CH. LGA H27UCG8T2M 26nm 64Gb 2MB(8KB Page)SDP 3.3v/x8VLGA Now H27UDG8VEM 41nm 128Gb 512KB(4KB Page)QDP 3.3v/X8VLGA Now 4CE,Dual CH.H27UDG8V5(E)A 32nm 128Gb 2MB(8KB Page)QDP 3.3v/x8TSOP / VLGA Now 4CE,Dual CH.H27UEG8YEA 32nm 256Gb 2MB(8KB Page)ODP 3.3v/x8VLGA Now 4CE,Dual CH.H27UAG8T2B 32nm 16Gb 2MB(8KB Page)SDP 3.3v/x8TSOP Now H27UBG8T2B 26nm 32Gb 2MB(8KB Page)SDP 3.3v/x8TSOP Now Legacy H27UCG8U2B 26nm 64Gb 2MB(8KB Page)DDP 3.3v/x8TSOP Jan. '11Legacy H27UDG8V2B 26nm 128Gb 2MB(8KB Page)QDP 3.3v/x8FBGA-100Feb. '11HS(ONFi2.2)H27UEG8Y2B 26nm 256Gb 2MB(8KB Page) ODP 3.3v/x8 FBGA-100 Mar. '11 HS(ONFi2.2)NAND Flash TLC COMPONENT Product Tech Density Block Size Stack Vcc/Org Package Availability Remark H27UAG8M2M 41nm 16Gb 768KB (4KB page)SDP 3.3V/x8VLGA Now H27UBG8M2A 32nm 32Gb 1MB (4KB page) SDP 3.3V/x8 VLGA Now

NOR-FLASH驱动文档(SST39VF1601)

NOR-FLASH驱动文档(SST39VF1601)2012-03-30 00:57:33 NOR-FLASH是最早出现的Flash Memory,目前仍是多数供应商支持的技术架 构.NOR-FLASH在擦除和编程操作较少而直接执行代码的场合,尤其是纯代码存储的应用中广泛使用,但是由于NOR-FLASH只支持块擦除,其擦除和编程速度较慢,而块尺寸又较大,导致擦除和编程操作所花费的时间很长,所以在纯数据存储和文件存储的应用中显得力不从心. NOR-FLASH的特点是: 1. 程序和数据可存放在同一芯片上,FLASH芯片拥有独立的数据总线和地址总线,能快速随 机读取,并且允许系统直接从Flash中读取代码执行,而无需先将代码下载至RAM中再执行; 2. 可以单字节或单字读取,但不能单字节擦除,必须以部分或块为单位或对整片执行擦除操 作,在执行写操作之前,必需先根据需要对部分,块或整片进行擦除,然后才能写入数据。 以SST系列NOR-FLASH芯片为例介绍FLASH的使用方法及驱动. 首先,在驱动的头文件中,要根据芯片的具体情况和项目的要求作如下定义: 1. 定义操作的单位,如 typedef unsigned char BYTE; // BYTE is 8-bit in length typedef unsigned short int WORD; // WORD is 16-bit in length typedef unsigned long int Uint32; // Uint32 is 32-bit in length 在这里地址多是32位的,芯片写操作的最小数据单位为WORD,定义为16位,芯片读操作的最小数据单位是BYTE,定义为8位. 2. 因为芯片分为16位和32位的,所以对芯片的命令操作也分为16位操作和32位操作(命令 操作在介绍具体的读写过程中将详细介绍). #ifdef GE01 /*宏NorFlash_32Bit,若定义了为32位NorFlash,否则为16位NorFlash*/ #define NorFlash_32Bit #endif 3. 根据芯片的情况,定义部分(段)和块的大小. #define SECTOR_SIZE 2048 // Must be 2048 words for 39VF160X #define BLOCK_SIZE 32768 // Must be 32K words for 39VF160X

NandFlash的基础知识

NAND FLASH的基础知识 NAND Flash 的数据是以bit 的方式保存在memory cell,一般来说,一个cell 中只能存储一个bit。这些cell 以8 个或者16 个为单位,连成bit line,形成所谓的byte(x8)/word(x16),这就是NAND Device 的位宽。这些Line 会再组成Page,(Nand Flash 有多种结构,我使用的Nand Flash 是K9F1208,下面内容针对三星的K9F1208U0M),每页528Byte,每32 个page 形成一个Block, Sizeof(block)=16kByte = 32 page = 32 * 528 byte Numberof(block)=64Mbyte/16kbyte=4096 1page=528byte=512byte(Main Area)+16byte(Spare Area) Nand flash 以页为单位读写数据,而以块为单位擦除数据。按照这样的组织方式可以形成所谓的三类地址: --Block Address -- Page Address --Column Address 对于NAND Flash 来讲,地址和命令只能在I/O[7:0]上传递,数据宽度是8 位。 512byte需要9bit来表示,对于528byte系列的NAND,这512byte被分成1st half和2nd half,各自的访问由地址指针命令来选择,A[7:0]就是所谓的column address。32 个page 需要5bit 来表示,占用A[13:9],即该page 在块内的相对地址。Block的地址是由A14 以上的bit 来表示,例如512Mbit的NAND,共4096block,因此,需要12 个bit 来表示,即A[25:14],如果是1Gbit 的528byte/page的NAND Flash,则block address用A[26:24]表示。而page address就是blcok address|page address in block NAND Flash 的地址表示为:Block Address|Page Address in block|halfpage pointer|Column Address 地址传送顺序是Column Address,Page Address,Block Address。由于地址只能在I/O[7:0]上传递,因此,必须采用移位的方式进行。例如,对于512Mbit x8 的NAND flash,地址范围是0~0x3FF_FFFF,只要是这个范围内的数值表示的地址都是有效的。以NAND_ADDR 为例: ◆第1 步是传递column address,就是NAND_ADDR[7:0],不需移位即可传递到I/O[7:0] 上,而halfpage pointer 即bit8 是由操作指令决定的,即指令决定在哪个halfpage 上进行读写。而真正的bit8 的值是don't care 的。 ◆第2 步就是将NAND_ADDR 右移9 位,将NAND_ADDR[16:9]传到I/O[7:0]上 ◆第3 步将NAND_ADDR[24:17]放到I/O 上 ◆第4 步需要将NAND_ADDR[25]放到I/O 上因此,整个地址传递过程需要4 步才能 完成,即4-step addressing。 如果NAND Flash 的容量是256Mbit 以下,那么,block adress 最高位只到bit24,因此寻址只需要3 步。下面,就x16 的NAND flash 器件稍微进行一下说明。由于一个page 的main area 的容量为256word,仍相当于512byte。但是,这个时候没有所谓的1st halfpage 和2nd halfpage 之分了,所以,bit8就变得没有意义了,也就是这个时候bit8 完全不用管,地址传递仍然和x8 器件相同。除了,这一点之外,x16 的NAND使用方法和x8 的使用方法完全相同。 正如硬盘的盘片被分为磁道,每个磁道又分为若干扇区,一块nand flash也分为若干block,每个block分为如干page。一般而言,block、page之间的关系随着芯片的不同而不同,典型的分配是这样的

浅谈NorFlash的原理及其应用

浅谈NorFlash的原理及其应用 NOR Flash NOR Flash是现在市场上两种主要的非易失闪存技术之一。Intel 于1988年首先开发出NOR Flash 技术,彻底改变了原先由EPROM(Erasable Programmable Read-Only-Memory电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)一统天下的局面。紧接着,1989年,东芝公司发表了NAND Flash 结构,强调降低每比特的成本,有更高的性能,并且像磁盘一样可以通过接口轻松升级。NOR Flash 的特点是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。NOR 的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响到它的性能。NAND的结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于Flash的管理需要特殊的系统接口。性能比较 flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何flash 器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。执行擦除时块尺寸的不同进一步拉大了NOR和NAND之间的性能差距,统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行。这样,当选择存储解决方案时,设计师必须权衡以下的各项因素。 l 、NOR的读速度比NAND稍快一些。 2、NAND的写入速度比NOR快很多。 3 、NAND的4ms擦除速度远比NOR的5s快。 4 、大多数写入操作需要先进行擦除操作。 5 、NAND的擦除单元更小,相应的擦除电路更少。此外,NAND 的实际应用方式要比NOR复杂的多。NOR可以直接使用,并可在上面直接运行代码;而NAND需要I/O接口,因此使用时需要驱动程序。不过当今流行的操作系统对NAND结构的Flash都有支持。此外,Linux内核也提供了对NAND结构的Flash的支持。详解 NOR

Nand Flash存储结构及控制方法

Nand Flash存储结构及控制方法(K9F1G08) 2011-02-26 15:05:59| 分类:默认分类 | 标签: mini2440nandflash k9f1g08 |字号订阅 一、NAND Flash介绍和NAND Flash控制器的使用 NAND Flash在嵌入式系统中的作用,相当于PC上的硬盘 常见的Flash有NOR Flash和NAND Flash,NOR Flash上进行读取的效率非常高,但是擦除和写操作的效率很低,容量一般比较小;NAND Flash进行擦除和写操作的效率更高,并且容量更大。一般NOR Flash用于存储程序,NAND Flash 用于存储数据。 1)NAND Flash的物理结构 笔者用的开发板上NAND Flash型号是K9F1G08,大小为128M,下图为它的封装和外部引脚 I/O0-I/O7 数据输入/输出 CLE 命令锁存使能 ALE 地址锁存使能 CE 芯片使能 RE 读使能 WE 写使能 WP 写保护 R/B 就绪/忙输出信号 Vcc 电源 Vss 地 N.C 不接 K9F1G08功能结构图如下

K9F1G08内部结构有下面一些功能部件 ①X-Buffers Latches & Decoders:用于行地址 ②Y-Buffers Latches & Decoders:用于列地址 ③Command Register:用于命令字 ④Control Logic & High Voltage Generator:控制逻辑及产生Flash所需高压 ⑤Nand Flash Array:存储部件 ⑥Data Register & S/A:数据寄存器,读、写页时,数据存放此寄存器 ⑦Y-Gating ⑧I/O Buffers & Latches ⑨Global Buffers ⑩Output Driver

总结NAND FLASH控制器的操作

NAND FLASH相对于NOR FLASH而言,其容量大,价格低廉,读写速度都比较快,因而得到广泛应用。NOR FLASH的特点是XIP,可直接执行应用程序, 1~4MB时应用具有很高的成本效益。但是其写入和擦除的速度很低直接影响了其性能。 NAND FLASH不能直接执行程序,用于存储数据。在嵌入式ARM应用中,存储在其中的数据通常是读取到SDROM中执行。因为NAND FLASH主要接口包括 几个I/O口,对其中的数据都是串行访问,无法实现随机访问,故而没有执行程序。 NAND FLASH接口电路是通过NAND FLAH控制器与ARM处理器相接的,许多ARM处理器都提供NAND FLASH控制器,为使用NAND FLASH带来巨大方便。 K9F2G08U0B是三星公司的一款NAND FLASH产品。 K9F2G08U0B包含8个I/O,Vss、Vcc、以及控制端口(CLE、ALE、CE、RE、WE、WP、R/B)。其存储结构分块。 共2K 块 每块大小16 页 每页大小2K + 64BYTE 即容量=块数×页数×每页大小=2K×16×(2K + 64BYTE)=256M BYTE + 8M BYTE NAND FLASH控制器提供了OM[1:0]、NCON、GPG13、GPG14、GPG15共5个信号来选择NAND FLASH启动。 OM[1:0]=0b00时,选择从NAND FLASH启动。 NCON:NAND FLASH类型选择信号。 GPG13:NAND FLASH页容量选择信号。 GPG14:NAND FLASH地址周期选择信号。 GPG15:NAND FLASH接口线宽选择。0:8bit总线宽度;1:16bit总线宽度。 访问NAND FLASH 1)发生命令:读、写、还是擦除 2)发生地址:选择哪一页进行上述操作 3)发生数据:需要检测NAND FLASH内部忙状态 NAND FLASH支持的命令: #define CMD_READ1 0x00 //页读命令周期1 #define CMD_READ2 0x30 //页读命令周期2 #define CMD_READID 0x90 //读ID 命令 #define CMD_WRITE1 0x80 //页写命令周期1 #define CMD_WRITE2 0x10 //页写命令周期2 #define CMD_ERASE1 0x60 //块擦除命令周期1 #define CMD_ERASE2 0xd0 //块擦除命令周期2 #define CMD_STATUS 0x70 //读状态命令 #define CMD_RESET 0xff //复位 #define CMD_RANDOMREAD1 0x05 //随意读命令周期1

Xilinx FPGA PCIE Linux驱动程序

// (c) Copyright 2009 聳2009 Xilinx, Inc. All rights reserved. // // This file contains confidential and proprietary information // of Xilinx, Inc. and is protected under U.S. and // international copyright and other intellectual property // laws. // // DISCLAIMER // This disclaimer is not a license and does not grant any // rights to the materials distributed herewith. Except as // otherwise provided in a valid license issued to you by // Xilinx, and to the maximum extent permitted by applicable // law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND // WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES // AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING // BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- // INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and // (2) Xilinx shall not be liable (whether in contract or tort, // including negligence, or under any other theory of // liability) for any loss or damage of any kind or nature // related to, arising under or in connection with these // materials, including for any direct, or any indirect, // special, incidental, or consequential loss or damage // (including loss of data, profits, goodwill, or any type of // loss or damage suffered as a result of any action brought // by a third party) even if such damage or loss was // reasonably foreseeable or Xilinx had been advised of the // possibility of the same. // // CRITICAL APPLICATIONS // Xilinx products are not designed or intended to be fail- // safe, or for use in any application requiring fail-safe // performance, such as life-support or safety devices or // systems, Class III medical devices, nuclear facilities, // applications related to the deployment of airbags, or any // other applications that could lead to death, personal // injury, or severe property or environmental damage // (individually and collectively, "Critical // Applications"). Customer assumes the sole risk and // liability of any use of Xilinx products in Critical // Applications, subject only to applicable laws and // regulations governing limitations on product liability. // // THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS // PART OF THIS FILE AT ALL TIMES. //-------------------------------------------------------------------------------- //-- Filename: xbmd.c //-- //-- Description: XBMD device driver. //-- //-- XBMD is an example Red Hat device driver which exercises XBMD design //-- Device driver has been tested on Red Hat Fedora FC9 2.6.15. //--------------------------------------------------------------------------------

NANDFLASH 常见问题汇总

NAND flash常见问题汇总 掉程序(这里专指使用NAND flash的主板掉程序),这是一个让工程师浑身发毛的问题,特别是用着用着程序就没有了,往往这个时候很多工程师都无法下手,问题出现的时候你可能根本不在旁边,无法看到问题现象,而且通过测量信号也很难发现问题的原因,这个时候很多工程师可能会采用更换主板器件的方式,用排除法来定位问题,基本上换一个NAND flash就可以解决问题了。这个时候很多工程师可能就会表示NAND flash有问题,需要换厂商,换品牌。但其实还可以更加深入的去了解问题的原因,这里我总结一下我遇到过得NAND flash掉程序的情况及原因。 1.电源电压不稳导致的NAND flash程序错误 很多时候,产品在客户手中出现了问题,工程师把产品拿回来,重新烧录程序产品可以上电启动,反复测试并不会出现掉程序的情况。如果这种产品是带有电池的产品,就可以考虑一下是否在客户实际使用中是用电池的情况,当电池的电量比较低,或者在极端情况下,程序对于电池电量的检测阈值较低,这个时候主控就有可能刚刚可以启动,但是很快电量不够,NAND flash内的程序乱掉,从而无法正常启动。 解决方法可以在程序中加入或者提高电池电量检测的阈值,保证所有芯片在这个阈值上均可以正常工作。 2.DRAM工作状态不正常导致的NAND flash程序错误 主控, DRAM和NAND flash基本构成了一个产品的最小系统。当系统中的任何一环出现问题,整个系统就可能出现问题。但是当DRAM出现问题时,有可能反映出来的是NAND flash 出错,掉程序或者查明NAND flash坏块过多。对于这种情况,处理起来就会复杂一些。如果直接重新烧录程序,系统又能正常工作,则说明之前存储在NAND flash中的程序确实乱了,但是NAND flash的功能正常,特别是SLC规格的1bit ECC 的NAND flash,出错概率非常小。因为对于NAND flash来说,只有当写数据或者擦除数据时,数据可能产生坏块,当程序只是读取的状态时,由于不涉及电荷的改变,所以NAND flash一般不会出现问题。但从程序的调试端口读到NAND flash坏块很多时,看是否有更深入的调试工具,例如JTAG等调试工具,可以深入调试NAND flash的情况。有些时候,因为一些程序误操作,导致将原本good block的标志位标记成了bad block。用过JTAG调试工具可以修改标志位,并且重新打标,重新烧录一遍程序,有可能主板又能重新启动了。 3.坏块管理未做好 因为NAND flash都面临着可能出现坏块的问题,所以必须应该对于坏块进行管理,在规格书中可以看到,坏块产生的三种情况,在编程的时候,在擦出的时候,在读取的时候。对于这几种情况下,程序应该怎么操作,规格书中也有流程图来说明,在读取和擦除中,如果出现失败情况,就需要重新坏一个块进行目标块的转移,并且对于当前块进行标识,在坏块表中进行更新。通过对于坏块表的维护,达到程序避免写入坏块中的情况。在读取程序时,也需要对于ECC进行校验,保证读取的程度是真实可靠的。但是很多工程师可能由于对于坏块管理做的不够仔细,导致产品在实际使用中,会出现掉程序的问题。工程师也应该从程序方面着手,分析一下程序对于坏块部分管理是否完善。 从上面三种类型只是部分说明了关于掉程序这个问题的一些原因。特别是对于1bit ECC 的SLC NAND flash大部分适用,工程师们可以进行参考。

相关文档
最新文档