【保姆级教程】“Flash闪存”介绍 及 “SD NAND Flash”产品的测试含例程

文章目录

  • 一、"FLASH闪存"是什么?
    • [1. 简介](#1. 简介)
    • [2. 特点](#2. 特点)
        • [2.1 性能](#2.1 性能)
        • [2.2 可靠性](#2.2 可靠性)
        • [2.3 耐用性](#2.3 耐用性)
        • [2.4 易于使用](#2.4 易于使用)
    • [3. 未来发展](#3. 未来发展)
  • [二、SD NAND Flash](#二、SD NAND Flash)
    • [1. 概述](#1. 概述)
    • [2. 特点](#2. 特点)
    • [3. 引脚分配](#3. 引脚分配)
    • [4. 数据传输模式](#4. 数据传输模式)
    • [5. SD NAND寄存器](#5. SD NAND寄存器)
    • [6. 通电图](#6. 通电图)
    • [7. 参考设计](#7. 参考设计)
  • 三、STM32测试例程
    • [1. 初始化](#1. 初始化)
    • [2. 单数据块测试](#2. 单数据块测试)
    • [3. 多数据块测试](#3. 多数据块测试)
    • [4. 状态缓冲](#4. 状态缓冲)

本篇除了对flash闪存进行简单介绍外,另给读者推荐一种我本人也在用的小容量闪存。

自带ECC校验,坏块管理,均衡读写,垃圾回收的SD NAND

Flash(贴片式TF卡),尺寸小巧,简单易用,兼容性强,稳定可靠,标准SDIO接口,兼容SPI,兼容拔插式TF卡/SD卡,可替代普通TF卡/SD卡,尺寸最小是6mmx8mm,读取速度高大20MB/S写入速度高达10MB/S,适合大部分的应用场景,并且标准的SD

2.0协议使得用户可以直接移植标准驱动代码,省去了驱动代码编程环节。

该 SD NAND Flash 产品由"深圳市雷龙发展有限公司"提供,获取更多学习资料可移步"雷龙发展"

下面我也将以该公司下的"二代 CSNP32GCR01-AOW"为例展开介绍

一、"FLASH闪存"是什么?

1. 简介

Flash是近些年应用最广、速度最快的只读存储器,原理是从 EEPROM 基础上改进发展来的,特点是擦除和编程速度快,因此得名为闪速(或闪烁)存储器,简称闪存。

NOR Flash 和 NAND Flash 是现在市场上两种主要的闪存技术。Intel于1988年首先开发出 NOR Flash 技术,彻底改变了原先由 EPROM 和 EEPROM 一统天下的局面。紧接着,1989年,东芝公司发表了 NAND Flash 结构,后者的单元电路尺寸几乎只是 NOR 器件的一半,可以在给定的芯片尺寸内提供更高的容量,也就相应地降低了价格。

NOR Flash 的特点是以字节为单位随机存取。这样,应用程序可以直接在 Flash中执行,不必再把程序代码预先读到 RAM 中。NOR Flash的接口一般以SPI为主,与通常的扩展存储器一样,可以直接连接到处理器的外围总线上。

NAND Flash应该是目前最热门的存储芯片了。因为我们生活中经常使用的电子产品都会涉及到它。比如你买手机,肯定会考虑64GB,还是256GB?买笔记本是买256GB,还是512GB容量的硬盘呢?(目前电脑大部分采用了基于 NAND Flash 产品的固态硬盘)。

NAND Flash 主要分为SLC,MLC,TLC,3D TLC ,3DQLC等,随时科技的发展和大众的需求,单位面积内的存储容量越来越大。SLC是指单个存储单元中,能容纳1bit 代表2种状态,0或者1. MLC 则是指单个存储单元中,能容纳2bit,代表4种状态 ,00,01,10,11。 TLC 则是指单个存储单元中,能容纳3bit,代表8种状态,000,001,010,011,100,101,110,111。最开始整个存储单元是2D展开的,也就是平面的,随着需要在单位空间内容纳更多的信息,就开始类似盖楼房一样,在3D也就是立体的方面来发展了。

2. 特点

2.1 性能

flash闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何flash器件的写入操作只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为1。

由于擦除NOR器件时是以64~128KB的块进行的,执行一个写入/擦除操作的时间为5s,与此相反,擦除NAND器件是以8~32KB的块进行的,执行相同的操作最多只需要4ms。

执行擦除时块尺寸的不同进一步拉大了NOR和NADN之间的性能差距,统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行。这样,当选择存储解决方案时,设计师必须权衡以下的各项因素。

● NOR的读速度比NAND稍快一些。

● NAND的写入速度比NOR快很多。

● NAND的4ms擦除速度远比NOR的5s快。

● 大多数写入操作需要先进行擦除操作。

● NAND的擦除单元更小,相应的擦除电路更少。

2.2 可靠性

采用flash介质时一个需要重点考虑的问题是可靠性。对于需要扩展MTBF的系统来说,Flash是非常合适的存储方案。可以从寿命(耐用性)、位交换和坏块处理三个方面来比较NOR和NAND的可靠性。

2.3 耐用性

在NAND闪存中每个块的最大擦写次数是一百万次,而NOR的擦写次数是十万次。NAND存储器除了具有10比1的块擦除周期优势,典型的NAND块尺寸要比NOR器件小8倍,每个NAND存储器块在给定的时间内的删除次数要少一些。

2.4 易于使用

可以非常直接地使用基于NOR的闪存,可以像其他存储器那样连接,并可以在上面直接运行代码。

由于需要I/O接口,NAND要复杂得多。各种NAND器件的存取方法因厂家而异。

在使用NAND器件时,必须先写入驱动程序,才能继续执行其他操作。向NAND器件写入信息需要相当的技巧,因为设计师绝不能向坏块写入,这就意味着在NAND器件上自始至终都必须进行虚拟映射。创世的SD NAND就内置了坏块管理和ECC校验等功能,方便工程师更好的使用NAND FLASH。

如果在产品中选择nor flash 还是NAND FLASH,更多的时候是从容量角度来考量,如果存储的内容大于128Mbit 就选择NAND Flash ,小于128Mbit就选择 Nor flash。Nor flash受限于自己的工艺,大于128Mbit的容量,价格就会比128MB SLC NANDFLASH的价格还要贵。

3. 未来发展

当前,NAND flash正在从 2D 发展到 3D。对于 2D NAND flash,如果在同一区域实现更多的单元数量,形成更小的工作区和栅级,便能增大存储容量。直至 2010 年初,2D NAND flash中的扩展一直是这项技术的主要焦点所在;然而,由于内部结构的限制,且储存数据会随时间推移而丢失导致使用寿命缩短,2D的技术已无法再实现扩展。

因此,3D NAND flash逐渐取而代之,成为业界关注焦点,现在所有 NAND 制造商都在开发和制造 3D NAND flash产品。

在 3D NAND flash 的结构中,存储容量会随着三维叠层中堆叠层数的增加而变大,类似盖楼房,一层一层叠加上去。3D NAND flash 使用了堆叠多层氮氧化物的方法,形成一个被称为"塞子"的垂直深孔,在其中形成一个由氧化物-氮化物-氧化物制成的存储设备。通过这种方法,仅需少量工艺即可同时形成大量单元。在 3D NAND flash 中,电流通过位于圆柱单元中心的多晶硅通道,便能根据存储在氮化硅中的电荷类型实现存储编程和擦除信息。虽然2D NAND flash 技术发展的目标是实现形成较小的单元, 3D NAND flash 的核心技术却是实现更多层数的三维堆叠。

二、SD NAND Flash

这里我以贴片式TF卡"CSNP32GCR01-AOW" (内置MLC的存储单元)型号为例介绍

1. 概述

CSNP32GCR01-AOW是基于NAND闪存和SD控制器的32Gb密度嵌入式存储。该产品与原始NAND相比,它有许多优点,包括嵌入式坏块管理和更强的嵌入式ECC。即使在异常断电的情况下,它仍然可以安全地保存数据。

2. 特点

接口:标准SD规范2.0版,带有1-I/O和4-I/O。

电源:Vcc=2.7V-3.6V

默认模式:可变时钟频率0-25 MHz,最高12.5 MB/秒接口速度(使用4条并行数据线)

高速模式:可变时钟频率0-50 MHz,最高25 MB/秒接口速度(使用4条并行数据线)

工作温度:-25°C至+85°C

储存温度:-40°C至+85°C

备用电流:<250uA

开关功能命令支持高速、电子商务和未来功能

内存字段错误的纠正

内容保护机制-符合SDMI标准的最高安全性。

SD NAND的密码保护(CMD42-锁定和解锁)

使用机械开关的写保护功能

内置写保护功能(永久和临时)

特定于应用程序的命令

...

...

3. 引脚分配

4. 数据传输模式

5. SD NAND寄存器

SDNAND接口中定义了六个寄存器:OCR、CID、CSD、RCA、DSR和SCR。这些信息只能通过

相应的命令。OCR、CID、CSD和SCR寄存器携带SDNAND/内容特定信息,而RCA、DSR寄存器是存储实际配置参数的配置寄存器(这里选取俩个寄存器进行展示)。

CID register

SCR register

6. 通电图

通电时间

7. 参考设计


Tips: RDAT和RCMD(10K~100 kΩ)是上拉电阻器,当SDNAND处于a状态时,保护CMD和DAT线路不受总线浮动的影响;在高阻抗模式,即使主机仅在SD模式下使用SDNAND作为1位模式,主机也应通过RDAT上拉所有DAT0-3线。它是建议VCC上有2.2uF电容。RCLK参考0~120Ω。

三、STM32测试例程

1. 初始化

cpp 复制代码
SD_Error SD_Init(void)
{
  uint32_t i = 0;

  /*!< Initialize SD_SPI */
  GPIO_Configuration(); 

  /*!< SD chip select high */
  SD_CS_HIGH();

  /*!< Send dummy byte 0xFF, 10 times with CS high */
  /*!< Rise CS and MOSI for 80 clocks cycles */
  for (i = 0; i <= 9; i++)
  {
    /*!< Send dummy byte 0xFF */
    SD_WriteByte(SD_DUMMY_BYTE);
  } 
//获取卡的类型,最多尝试10次
i=0;
do
{ 
/*------------Put SD in SPI mode--------------*/
/*!< SD initialized and set to SPI mode properly */
SD_GoIdleState();

/*Get card type*/
SD_GetCardType();
}while(SD_Type == SD_TYPE_NOT_SD && i++ >10);
//不支持的卡
if(SD_Type == SD_TYPE_NOT_SD)
return SD_RESPONSE_FAILURE;
return SD_GetCardInfo(&SDCardInfo); 
}

2. 单数据块测试

cpp 复制代码
void SD_SingleBlockTest(void)
{  
  /*------------------- Block Read/Write --------------------------*/
  /* Fill the buffer to send */
  Fill_Buffer(Buffer_Block_Tx, BLOCK_SIZE, 0x320F);

  if (Status == SD_RESPONSE_NO_ERROR)
  {
    /* Write block of 512 bytes on address 0 */
    Status = SD_WriteBlock(Buffer_Block_Tx, 0x00, BLOCK_SIZE);
    /* Check if the Transfer is finished */
  }

  if (Status == SD_RESPONSE_NO_ERROR)
  {
    /* Read block of 512 bytes from address 0 */
    Status = SD_ReadBlock(Buffer_Block_Rx, 0x00, BLOCK_SIZE);

  }

  /* Check the correctness of written data */
  if (Status == SD_RESPONSE_NO_ERROR)
  {
    TransferStatus1 = Buffercmp(Buffer_Block_Tx, Buffer_Block_Rx, BLOCK_SIZE);
  }
  
  if(TransferStatus1 == PASSED)
  {
    LED2_ON;
    printf("Single block 测试成功!\n");

  }
  else
  {
LED1_ON;
    printf("Single block 测试失败,请确保SD卡正确接入开发板,或换一张SD卡测试!\n");
    
  }
}

3. 多数据块测试

cpp 复制代码
void SD_MultiBlockTest(void)
{  
  /*--------------- Multiple Block Read/Write ---------------------*/
  /* Fill the buffer to send */
  Fill_Buffer(Buffer_MultiBlock_Tx, MULTI_BUFFER_SIZE, 0x0);

  if (Status == SD_RESPONSE_NO_ERROR)
  {
    /* Write multiple block of many bytes on address 0 */
    Status = SD_WriteMultiBlocks(Buffer_MultiBlock_Tx, 0x00, BLOCK_SIZE, NUMBER_OF_BLOCKS);
    /* Check if the Transfer is finished */
  }

  if (Status == SD_RESPONSE_NO_ERROR)
  {
    /* Read block of many bytes from address 0 */
    Status = SD_ReadMultiBlocks(Buffer_MultiBlock_Rx, 0x00, BLOCK_SIZE, NUMBER_OF_BLOCKS);
    /* Check if the Transfer is finished */
  }

  /* Check the correctness of written data */
  if (Status == SD_RESPONSE_NO_ERROR)
  {
    TransferStatus2 = Buffercmp(Buffer_MultiBlock_Tx, Buffer_MultiBlock_Rx, MULTI_BUFFER_SIZE);
  }
  
  if(TransferStatus2 == PASSED)
  {
LED2_ON;
    printf("Multi block 测试成功!");

  }
  else
  {
LED1_ON;
    printf("Multi block 测试失败,请确保SD卡正确接入开发板,或换一张SD卡测试!");
  }
}

4. 状态缓冲

cpp 复制代码
TestStatus Buffercmp(uint8_t* pBuffer1, uint8_t* pBuffer2, uint32_t BufferLength)
{
  while (BufferLength--)
  {
    if (*pBuffer1 != *pBuffer2)
    {
      return FAILED;
    }

    pBuffer1++;
    pBuffer2++;
  }

  return PASSED;
}

void Fill_Buffer(uint8_t *pBuffer, uint32_t BufferLength, uint32_t Offset)
{
  uint16_t index = 0;

  /* Put in global buffer same values */
  for (index = 0; index < BufferLength; index++)
  {
    pBuffer[index] = index + Offset;
  }
}

亲爱的卡友们,欢迎光临雷龙官网,如果看完文章之后还是有疑惑或不懂的地方,请联系我们,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,深圳市雷龙发展专注存储行业13年,专业提供小容量存储解决方案。

相关推荐
leoufung4 分钟前
VIM FZF 安裝和使用
linux·编辑器·vim
白水先森10 分钟前
如何使用ArcGIS Pro高效查找小区最近的地铁站
经验分享·arcgis·信息可视化·数据分析
匹马夕阳14 分钟前
ECharts极简入门
前端·信息可视化·echarts
bugtraq20211 小时前
XiaoMi Mi5(gemini) 刷入Ubuntu Touch 16.04——安卓手机刷入Linux
linux·运维·ubuntu
xmweisi1 小时前
【华为】报文统计的技术NetStream
运维·服务器·网络·华为认证
VVVVWeiYee1 小时前
BGP配置华为——路径优选验证
运维·网络·华为·信息与通信
陆鳐LuLu1 小时前
日志管理利器:基于 ELK 的日志收集、存储与可视化实战
运维·elk·jenkins
CodeWithMe2 小时前
[ Vim ] 常用命令 and 配置
linux·编辑器·vim
DC_BLOG2 小时前
Linux-GlusterFS进阶分布式卷
linux·运维·服务器·分布式
yourkin6662 小时前
TCP...
服务器·网络·tcp/ip