


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本文原创于观海听涛,原作者版权所有,转载请注明出处。近几天开发项目需要用到 STM32驱动NAND FLASH,但由于开发板例程以及 固件库是用于小页(512B,我要用到的FLASH为1G bit的大页(2K,多走了两天弯 路。以下笔记将说明如何将默认固件库修改为大页模式以驱动大容量NAND,并作驱动。本文硬件:控制器:STM32F103ZET6,存储器:HY27UF081G2A首先说一下NOR与NAND存储器的区别,此类区别网上有很多,在此仅大致说明:1、Nor读取速度比NAND稍快2、Na nd写入速度比Nor快很多3、NAND擦除速度(4ms远快于Nor(5s4、Nor带有SRAM接口,
2、有足够的地址引脚来寻址,可以很轻松的挂接到CPU 地址和数据总线上,对CPU要求低5、NAND用八个(或十六个引脚串行读取数据,数据总线地址总线复用,通常需 要CPU支持驱动,且较为复杂& Nor主要占据1-16M容量市场,并且可以片内执行,适合代码存储7、NAND占据8-128M及以上市场,通常用来作数据存储8、NAND便宜一些9、NAND寿命比Nor长10、NAND会产生坏块,需要做坏块处理和ECC更详细区别请继续百度,以上内容部分摘自神舟三号开发板手册F面是NAND的存储结构:由此图可看出NAND存储结构为立体式正如硬盘的盘片被分为磁道,每个磁道又分为若干扇区,一块nand fl
3、ash也分为 若干block,每个block分为如干pageo 般而言,block、page之间的关系随着芯片 的不同而不同。需要注意的是 对于flash的读写都是以一个page开始的,但是在读写之前必须 进行flash的擦写,而擦写则是以一个block为单位的。我们这次使用的HY27UF081G2A其PDF介绍:Memory Cell Array=(2K+64 Bytes x 64 Pages x 1,024 Blocks由此可见该NAND每页2K,共64页,1024块。其中:每页中的2K为主容量 Data Field, 64bit为额外容量Spare Field。Spare Field用于
4、存贮检验码和其他信息用 的,并不能存放实际的数据。由此可算出系统总容量为2K*64*1024=134217728个byte,即1Gbit。NAND闪存颗粒硬件接口 :由此图可见,此颗粒为八位总线,地址数据复用,芯片为SOP48封装。软件驱动:(此部分写的是伪码,仅用于解释含义,可用代码参见附件主程序:1. #define BUFFER_SIZE 0x2000 /此部分定义缓冲区大小,即一次写入的数据2. #defi ne NAND_HY_MakerlD 0xAD /NAND 厂商号3. #define NAND_HY_DevicelD 0xF1 /NAND 器件号4. /*配置与 SRAM 连
5、接的 FSMC BANK2 NAND*/5. NANDn it(;6. /* 读取 Na nd Flash ID 并打印 */7. NAND_ReadlD(&N AND_ID;复制代码Tips:NAND器件的ID包含四部分:1st Man ufacturer Code2nd Device Identifier3rd Internal chip number, cell Type, Number of Simultaneously Programmed pages.4th Page size, spare size, Block size, Orga ni zati on1. if(NA
6、ND_ID.Maker_ID = NAND_HY_MakerlD && (NAND_ID.Device_ID=NAND_HY_DeviceID / 判断器件符合2. 3. /*设置NAND FLASH的写地址*/4. WriteReadAddr.Zo ne = 0x00;5. WriteReadAddr.Block = 0x00;6. WriteReadAddr.Page = 0x05;7. /*擦除待写入数据的块*/8. status = NAND_EraseBlock(WriteReadAddr; /写入前必须擦出9. /*将写Nand Flash的数据BUFFER填充为从
7、0x25开始的连续递增的一串数 据*/10. Fill_Buffer(TxBuffer, BUFFER_SIZE , 0x25; / 填充数据以测试11. /*将数据写入到 Nand Flash中。WriteReadAddr:读写的起始地址*/12. status = NAND_WriteSmallPage(TxBuffer, WriteReadAddr, PageNumber; /主 要写入函数,此部分默认为小页需要修改13. /*从Nand Flash中读回刚写入的数据。riteReadAddr:读写的起始地址*/14. status = NAND_ReadSmallPage (RxBuf
8、fer, WriteReadAddr, PageNumber;读 取主要函数,也需要修改15.15. /*判断读回的数据与写入的数据是否一致*/16. for(j = 0; j < BUFFER_SIZE; j+17. 18. if(TxBufferj != RxBufferj19. 20. WriteReadStatus+;21. 22. 24.23. if (WriteReadStatus = 024. 25. prin tf("nr Na nd Flash 读写访问成功"26. GPIO_ResetBits(GPIO_LED, DS2_PIN;27. 28. e
9、lse29. 30. prin tf("nr Na nd Flash 读写访问失败"31. prin tf("Ox%x",WriteReadStatus;34.32. GPIO_ResetBits(GPIO_LED, DS3_PIN;36.33. 34. 35. else36. 37. printf("nr 没有检测到 Nand Flash的 ID"38. GPIO_ResetBits(GPIO_LED, DS4_PIN;39. 复制代码fsmc_ nan d.c文件:1. void NAND_I nit(void2. 3. GPIO
10、n itTypeDef GPIOn itStructure;4. FSMC_NAND_PCCARDTimi ngln itTypeDef p;5. FSMC_NANDI ni tTypeDef FSMC_NANDI nitStructure;6.6. /*FSMC总线使用的GPIO组时钟使能*/7. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE |8. RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE;10.9. /*FSMC CLE, ALE, D0-
11、>D3, NOE, NWE and NCE2 初始化,推挽复用输出 */10. GPIO_lnitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_14 | GPIO_Pin_15 |11. GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |12. GPIO_Pin_7;13. GPIOni tStructure.GPIO_Speed = GPIO_Speed_5OMH z;14. GPIOn itStructure.GPIO_Mode = GPIO_Mode_AF_PP
12、;15. GPIOn it(GPIOD, & GPI Oni tStructure;16. /*FSMC数据线FSMC_D4:7初始化,推挽复用输出*/17. GPIOni tStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_1O;18. GPI Oni t(GPIOE, & GPIOn itStructure;19. /*FSMC NWAIT初始化,输入上拉*/20. GPIOn itStructure.GPIO_Pin = GPIO_Pin_6;21. GPIOni tStructure
13、.GPIO_Speed = GPIO_Speed_5OMH z;22. GPIOni tStructure.GPIO_Mode = GPIO_Mode_IPU;23. GPIOn it(GPIOD, & GPI Oni tStructure;24. /*FSMC INT2初始化,输入上拉*/25. GPIOn itStructure.GPIO_Pin = GPIO_Pin_6;26. GPIOn it(GPIOG, & GPI Oni tStructure;27. /*FSMC总线存储器参数配置*/28. p.FSMC_SetupTime = 0x1; /建立时间29. p.F
14、SMC_WaitSetupTime = 0x3; 等待时间30. p.FSMC_HoldSetupTime = 0x2; 保持时间31. p.FSMC_HiZSetupTime = 0x1; 高阻建立时间32. FSMC_NANDInitStructure.FSMC_Bank = FSMC_Bank2_NAND; / 使用FSMC BANK233. FSMC_NANDI nitStructure.FSMC_Waitfeature = FSMC_Waitfeature_E nable;使能FSMC的等待功能34. FSMC_NAND In itStructure.FSMC_MemoryDataW
15、idth =FSMC_MemoryDataWidth_8b; /NAND Flash 的数据宽度为 8位35. FSMC_NANDInitStructure.FSMC_ECC = FSMC_ECC_Enable; /使能 ECC 特 性36. FSMC_NANDI nitStructure.FSMC_ECCPageSize =FSMC_ECCPageSize_2048Bytes; /ECCK大小 204837. FSMC_NANDI nitStructure.FSMC_TCLRSetupTime = 0x00;38. FSMC_NANDI ni tStructure.FSMC_TARSetup
16、Time = 0x00;39. FSMC_NAND In itStructure.FSMC_Commo nSpaceTimi ngStruct = &p;40. FSMC_NANDI ni tStructure.FSMC_AttributeSpaceTimi ngStruct = &p;41. FSMC_NAND In it(&FSMC_NANDI nitStructure;42. /*!使能 FSMC BANK2 */43. FSMC_NANDCmd(FSMC_Ba nk2_NAND, ENABLE;44. 复制代码1. void NAND_ReadID(NAND_I
17、DTypeDef* NAND_ID2. 3. uin t32_t data = 0;4. /*!< Send Comma nd to the comma nd area */5. *(_IO ui nt8_t *(Ba nk_NAND_ADDR | CMD_AREA = 0x90;6. *(_IO ui nt8_t *(Ba nk_NAND_ADDR | ADDR_AREA = 0x00;7. /*!< Sequenee to read ID from NAND flash */8. data = *(_IO uin t32_t *(Ba nk_NAND_ADDR | DATA_A
18、REA;9. NAND_ID->Maker_ID = ADDR_1st_CYCLE (data;/ 四个周期读取四个 ID10. NAND_ID->Deviee_ID = ADDR_2 nd_CYCLE (data;11. NAND_ID->Third_ID = ADDR_3rd_CYCLE (data;12. NAND_ID->Fourth_ID = ADDR_4th_CYCLE (data;13. 复制代码1. uin t32_t NAND_WriteSmallPage(ui nt8_t *pBuffer, NAND_ADDRESS Address, uin t32
19、_t NumPageToWrite2. /传入参数:写入数据,写入初始地址,要写几页3. uin t32_t in dex = 0x00, nu mpagewritte n = 0x00, addressstatus = NAND_VALID_ADDRESS;4. uin t32_t status = NAND_READY, size = 0x00;5. while(NumPageToWrite != 0x00 && (addressstatus = NAND_VALID_ADDRESS && (status = NAND_READY6. 7. /*!<
20、Page write comma nd and address */8. *(_IO ui nt8_t *(Ba nk_NAND_ADDR | CMD_AREA = NAND_CMD_AREA_A;9. *(_IO ui nt8_t *(Ba nk_NAND_ADDR | CMD_AREA = NAND_CMD_WRITE0;10. *(_IO ui nt8_t *(Ba nk_NAND_ADDR | ADDR_AREA = 0x00;11. *(_IO ui nt8_t *(Ba nk_NAND_ADDR | ADDR_AREA = 0x00;/ 添加此句12. *(_IO ui nt8_t
21、 *(Ba nk_NAND_ADDR | ADDR_AREA = ADDR_1st_CYCLE(ROW_ADDRESS;13. *(_IO ui nt8_t *(Ba nk_NAND_ADDR | ADDR_AREA =ADDR_2 nd_CYCLE(ROW_ADDRESS;14. / *(_IO uin t8_t *(Ba nk_NAND_ADDR | ADDR_AREA = ADDR_3rd_CYCLE(ROW_ADDRESS; 原版有此句15. /*!< Calculate the size */16. size = NAND_PAGE_SIZE + (NAND_PAGE_SIZE
22、 * numpagewritten; 统计 写入数目17. /*!< Write data */18. for(; in dex < size; in dex+20. *(_IO uint8_t *(Ba nk_NAND_ADDR | DATA_AREA = pBufferi ndex;21. 22.23. *(_IO ui nt8_t *(Ba nk_NAND_ADDR | CMD_AREA =NAND_CMD_WRITE_TRUE1;24. /*!< Check status for successful operati on */25. status = NAND_Ge
23、tStatus(;26.26. if(status = NAND_READY27. 28. nu mpagewritte n+;29. NumPageToWrite-;30. /*!< Calculate Next small page Address */31. addressstatus = NAND_AddressI ncreme nt(&Address;32. 33. 35.34. retur n (status | addressstatus;复制代码读取函数同理修改1. uin t32_t NAND_EraseBlock(NAND_ADDRESS Address2. 3. *(_IO ui nt8_t *(Ba nk_NAND_ADDR | CMD_AREA = NAND_CMD_ERASEO;4
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 油气管道培训
- 石油行业员工培训
- 辽夏金元的统治
- 护士急诊急救培训
- 地球的历史练习2024-2025学年高中地理人教版(2019)必修一
- 绵阳信息技术试题及答案
- 5g无线技术及部署试题及答案
- 建设银行2025西双版纳傣族自治州金融科技岗笔试题及答案
- 农业银行2025玉溪市秋招结构化面试经典题及参考答案
- 邮储银行2025资阳市秋招笔试综合模拟题库及答案
- 2025年消防执业资格考试题库(专业技能提升题)-实操技能模拟试题
- 风力发电系统安全性研究-深度研究
- 大学新生专业思想教育
- 三叉神经鞘瘤护理查房
- 课件围术期下肢深静脉血栓的预防与护理
- 母婴护理服务方案
- 教育数字化背景下高校国际中文智慧教学模式探究
- 2024年“民用无人机及多旋翼无人机”驾驶员操控员技能与理论知识考试题库含答案
- 2025年临床医师定期考核必考复习题库及答案(900题)
- 意义未明的单克隆免疫球蛋白病病因介绍
- 粮食安全政策
评论
0/150
提交评论