您当前的位置:首页 > 电子 > 单片机

SD NAND Flash 小容量存储解决方案及其STM32测试例程讲解

时间:11-01来源:作者:点击数:

前言

随着移动存储技术的快速发展和便携式数字设备的广泛应用,Flash闪存作为非易失性存储解决方案,在各种电子设备中扮演着越来越重要的角色。本文提供关于Flash闪存的基础知识以及一种特别推荐的小容量存储解决方案SD NAND Flash的详细介绍。将从Flash闪存的基本概念出发,探讨其分类、特点,并深入解析NOR与NAND两种主要类型的闪存技术。重点介绍了一款由雷龙发展有限公司提供的SD NAND Flash产品,它不仅具有小巧的尺寸、出色的兼容性和稳定性,而且支持标准的SD 2.0协议,极大简化了开发流程。为了帮助开发者更好地理解和应用这一技术,展示了基于STM32微控制器平台实现的单块及多块数据传输测试方法,通过具体的代码示例来验证SD NAND Flash的读写性能。

一、Flash闪存是什么?

  1. 简介
    • Flash闪存是一种非易失性(Non-Volatile)内存,在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘。这项特性使得闪存得以成为各类便携型数字设备的存储介质的基础。
    • 各类DDR、SDRAM或者RDRAM都属于挥发性内存,只要停止电流供应内存中的数据便无法保持,因此每次电脑开机都需要把数据重新载入内存。
  2. 分类
    • NOR和NAND是市场上两种主要的非易失闪存技术。
    • 在1984年,东芝公司的发明人舛冈富士雄首次提出了快速闪存存储器的概念。与传统电脑内存不同,闪存的特点是非易失性(NVM),其记录速度也非常快。
    • Intel是世界上第一个生产闪存并将其投放市场的公司。1988年,Intel推出了一款256K bit闪存芯片,并被称为NOR闪存。它结合了EPROM和EEPROM两项技术,并拥有一个SRAM接口。
    • 第二种闪存称为NAND闪存,由日立公司于1989年研制,被认为是NOR闪存的理想替代者。NAND闪存的写周期比NOR闪存短90%,保存与删除处理的速度相对较快。鉴于NAND出色的表现,它常常被应用于诸如CompactFlash、SmartMedia、SD卡等存储卡上。
    • NAND闪存采用串行结构,读写操作是以页和块为单位进行的。这种结构最大的优点在于容量可以做得很大,成本较低,有利于大规模普及。
  3. 特点
    • Flash闪存是一种非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。
    • 任何flash器件的写入操作只能在空或已擦除的单元内进行,所以在大多数情况下,在进行写入操作之前必须先执行擦除。
    • NAND器件执行擦除操作相对简单,而NOR则要求在进行擦除前先将目标块内的所有位写为1。
    • 对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作需要在基于NOR的单元中进行。因此,设计师在选择存储解决方案时需要权衡各项因素,包括NOR的读速度稍快一些、NAND的写入速度更快以及NAND的擦除速度远快于NOR等。

二、SD NAND Flash

SD NAND(Secure Digital NAND)作为一种结合了NAND Flash技术和SD卡物理形式的存储解决方案,在现代电子设备中发挥着重要作用。这种存储技术的主要优势在于它既保留了NAND Flash存储介质的高性价比和大容量特性,又具备了SD卡的便携性和易于插入的便利性。因此,SD NAND在多种应用场合中找到了它的定位。

SD NAND非常适合应用于便携式存储设备中。例如,在数码相机中,SD NAND作为存储介质,可以为用户提供大量的照片和视频存储空间。此外,在便携式媒体播放器中,SD NAND也因其小巧的外形和高容量而备受青睐。用户可以通过简单地插入或更换SD NAND卡来增加存储容量,而无需更改设备的硬件设计或内部结构。

在嵌入式系统中,SD NAND同样表现出色。对于那些需要高密度存储空间并且对成本敏感的应用场景,如工业控制系统、智能家居设备以及汽车娱乐系统等,SD NAND提供了一个经济高效的选择。其灵活的存储扩展能力使得设备制造商可以根据最终产品的不同需求来调整存储容量,从而优化成本结构。

移动设备也是SD NAND的重要应用领域之一。在智能手机和平板电脑中,用户可以通过插入SD NAND卡来扩展设备的存储空间,这对于那些经常拍摄大量照片或下载高清视频的用户来说尤其重要。SD NAND不仅为移动设备提供了额外的存储空间,而且由于其标准的SD卡接口,使得用户可以在不同品牌和型号的设备之间轻松地共享数据。

SD NAND的优势还体现在其标准化接口上。SD NAND遵循SD卡协会制定的标准规范,这意味着它可以在任何支持SD卡接口的设备中使用,无需额外的适配器或复杂的驱动程序支持。这一点极大地简化了设备的硬件设计,并减少了因兼容性问题带来的开发障碍。

SD NAND作为一种兼具成本效益和便携性的存储解决方案,在多种应用场景中展现出其独特的优势。无论是对于追求成本效益的设备制造商,还是希望获得更大存储容量的终端用户,SD NAND都提供了一个理想的选择。

这里我以贴片式TF卡“CSNP32GCR01-AOW”型号为例介绍

image-20241010152343587

下面是芯片的实物图

这是官网申请的样品,焊接了转接板,可以直接插在SD卡卡槽上测试。 最终选型之后,设计PCB板时,设计接口,直接贴片上去使用,非常稳定,抖动也不会导致,外置卡TF卡这种容易松动的问题。

image-20221201170132109
image-20221201163735081
  1. 概述
    • SD NAND Flash是一种自带坏块管理的小容量闪存,尺寸小巧、简单易用,兼容性强且稳定可靠。
    • 标准SDIO接口,兼容SPI,可替代普通TF卡/SD卡,尺寸为6.2x8mm毫米。
    • 内置平均读写算法,读取速度达到23.5MB/S,写入速度为12.3MB/S。
    • 支持标准的SD 2.0协议,用户可以直接移植标准驱动代码,省去了驱动代码编程环节。
  2. 引脚分配
    • SD NAND接口定义了六个寄存器:OCR、CID、CSD、RCA、DSR和SCR。
    • OCR、CID、CSD和SCR寄存器携带SDNAND/内容特定信息,而RCA、DSR寄存器则是存储实际配置参数的配置寄存器。
    image-20241010152504527
  3. 数据传输模式
    • 默认模式支持可变时钟频率0-25MHz,最高12.5MB/秒接口速度(使用4条并行数据线)。
    • 高速模式支持可变时钟频率0-50MHz,最高25MB/秒接口速度(使用4条并行数据线)。
    image-20241010152531857
  4. 通电图
    • RDAT和RCMD(10K~100kΩ)是上拉电阻器,当SDNAND处于高阻抗状态时,保护CMD和DAT线路不受总线浮动的影响。
    • 建议VCC上有2.2uF电容,RCLK参考0~120Ω。
    image-20241010152735906
  5. 参考设计
    • 提供了初始化、单数据块测试和多数据块测试的STM32例程,通过这些例程可以验证SD NAND Flash的读写功能。
image-20241010152825240

三、STM32测试例程

image-20221201163748859
image-20221206191527228

(1)初始化

  • 初始化过程包括设置GPIO、配置SD_SPI、发送命令使SD卡进入空闲状态并获取卡类型信息。
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)单数据块测试

  • 单数据块测试涉及填充缓冲区、写入一个512字节的数据块到地址0,然后从同一地址读取该数据块,最后比较写入和读出的数据以验证正确性。
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)多数据块测试

  • 多数据块测试类似单数据块测试,但涉及多个连续的数据块。这有助于评估批量数据处理的能力。
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)状态缓冲

  • Buffercmp函数用于比较两个缓冲区的内容,确保写入和读出的数据一致。
  • Fill_Buffer函数用于填充缓冲区,生成指定长度的数据。
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;
  }
}

四、总结

本文介绍了Flash闪存的基本概念、分类及其特点,并详细说明了SD NAND Flash产品的特性和STM32平台上的测试方法。通过这些介绍,读者可以更好地理解和应用这一类型的存储解决方案。

免费申请 SD NAND 样品,可以去官网:http://www.longsto.com/

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门
本栏推荐