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

news2024/10/23 1:48:40

文章目录

  • 前言
  • 一、Flash闪存是什么?
  • 二、SD NAND Flash
  • 三、STM32测试例程
  • 四、总结

前言

随着移动存储技术的快速发展和便携式数字设备的广泛应用,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/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2213411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在调用微信公众号H5页面支付提示签名失败

利用的是APIv2密钥&#xff0c;通过咨询微信支付客服&#xff0c;通过验签工具都验证了&#xff0c;没有问题&#xff0c;但是在发布后&#xff0c;环境中还是提示支付验签失败&#xff0c;不知道是什么原因&#xff0c;不知道有没有人遇到过&#xff0c;求大神指点下&#xff…

Kubernetes--深入理解Service与CoreDNS

文章目录 Service功能Service 的常见使用场景 Service的模式iptablesIPVS Service类型ClusterIPNodePortLoadBalancerExternalName Service的工作机制EndpointEndpoint 与 Service 的关系Endpoint 的工作原理命令操作 CoreDNSCoreDNS 的配置CoreDNS 的典型插件Corefile 示例Cor…

程序员的自我修养(链接、装载与库)--摘录与汇总(二)

程序和进程的区别(P150) 程序是一个静态的概念&#xff0c;是一些预先编译好的指令和数据集合的一个文件进程是一个动态的概念&#xff0c;它是程序运行时的一个过程 程序和进程有什么区别 程序&#xff08;或者狭义上讲可执行文件&#xff09;是一个静态的概念&#xff0c;它…

PHP:下拉列表,颜色展示

PHP展示下拉列表&#xff0c;选项设置为数据库存储颜色进制&#xff0c;colorname是颜色名称&#xff0c;color是颜色进制 一、表结构 produce_info_nav1_colorshow produce_info_nav1 二、核心代码 //查询对应默认颜色 $sql_selcolor "SELECT color FROM produce_i…

机器学习篇-day07-朴素贝叶斯和特征降维

一. 朴素贝叶斯算法 朴素贝叶斯算法介绍 利用概率值进行分类的一种机器学习算法 复习概率 相互独立&#xff1a;如果P(AB) P(A)P(B)&#xff0c;则称事件A与事件B相互独立 比如&#xff1a;女神喜欢程序员的概率&#xff0c;女神喜欢产品经理的概率&#xff0c;两个事件没有…

詹妮弗洛佩兹的比基尼影集显示,与本阿弗莱克离婚期间她正处于最勇敢的时刻

詹妮弗洛佩兹已然正式终结了其饱含浓情蜜意的时代&#xff01;此乃我……当下之时代&#xff0c;且于同本阿弗莱克离异之际&#xff0c;步入了迄今最为英勇无畏的时代&#xff0c;此番全新的摄影集便是有力的明证。 10 月 9 日&#xff0c;《采访》杂志展示了一系列洛佩兹用作…

水文监测系统的多功能性与作用深度剖析

在现代水利管理中&#xff0c;水文监测系统作为重要的技术手段&#xff0c;正发挥着日益关键的作用。这一系统&#xff0c;也被称为水文信息自动化采集系统&#xff0c;通过自动或半自动的方式&#xff0c;实现了对江河、湖泊、水库等水体以及地下水的实时监测&#xff0c;涵盖…

功能强大且简单易用的实时算法视频监控,智慧快消开源了。

智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。 基于多年的深度…

jmeter 对 dubbo 接口测试是怎么实现的?有哪几个步骤

目录 前言 一.先了解下 dubbo 的原理&#xff0c;最好自己搭建一个案例可参考以下方式搭建 http://09792bb8.wiz03.com/share/s/09uiKU3j2kR120MIpT2AdLm70pfBmE1zFApv2jiDZ01GhE8j 二.编写 dubbo 测试脚本 前言 最近使用工作中使用jmeter调用dubbo接口进行接口测试&#xf…

SLAM中的加权最小二乘法

一、数学描述 机器人携带传感器在环境中运动可由 运动方程 和 观测方程 描述。 其中 表示时刻&#xff1b; 表示 时刻的位姿&#xff1b; 是运动传感器的读数或者输入&#xff1b; 为路标点&#xff1b; 表示观测数据。 为运动噪声&#xff0c;例如对机器人下达了前进 1m 的指…

大模型时代,云原生数据底座的创新和实践

本文整理自百度云智峰会 2024 —— 云原生论坛的同名演讲。 大模型毫无疑问是当前技术发展的热点&#xff0c;成为大家默认的提升生产力工具。 但是&#xff0c;大模型训练主要使用互联网上的公开数据为主&#xff0c;没有企业内部的数据&#xff0c;所以大模型本质上自带的都…

并行 parallel broadcast partition pruning 分区裁剪 optimizer_dynamic_sampling=7

insert into abc 没有PDML所以不是全部并行 只有select 的情况 全部并行&#xff0c;没有 px send broadcast &#xff0c;所以rows没从103M变成103*8M select *from A&#xff0c;B where A.Pkey B.Pkey and A.Pkey XX A B表都会进行分区裁剪 ----并行为什么更…

定了!OPPO全旗舰新品10月24日发布

今日&#xff0c;OPPO宣布将于2024年10月24日19&#xff1a;00举办OPPO Find X8系列及旗舰生态新品发布会&#xff0c;以全新一代的年度影像旗舰 OPPO Find X8系列为核心&#xff0c;通过新一代的OPPO Enco X3旗舰耳机、OPPO Pad 3 Pro旗舰平板&#xff0c;以及再度升级的安卓全…

解决低版本pytorch和onnx组合时torch.atan2()不被onnx支持的问题

解决这个问题&#xff0c;最简单的当然是升级pytorch和onnx到比较高的版本&#xff0c;例如有人验证过的组合: pytorch2.1.1cu118, onnxruntime1.16.3 但是因为你的模型或cuda环境等约束&#xff0c;不能安装这么高的版本的pytorch和onnx组合时(例如我的环境是pytorch1.12&…

单细胞转录组亚群分析

1 单细胞转录组亚群常见分析内容 重磅综述&#xff1a;三万字长文读懂单细胞RNA测序分析的最佳实践教程 &#xff08;原理、代码和评述&#xff09; 如何使用Bioconductor进行单细胞分析&#xff1f; 单细胞转录组亚群分析的内容根据样品数目多少&#xff0c;可以分为单个样…

开源项目 - 轻量级人体姿态 人体关键点检测 机器视觉 深度学习

开源项目 - 轻量级人体姿态 人体关键点检测 机器视觉 深度学习 项目地址&#xff1a;https://gitcode.net/EricLee/light_pose 1、数据集来源&#xff1a;coco2017 数据集 * coco 数据集官方网站&#xff1a;https://cocodataset.org/#home * [数据集下载地址(百度网盘 Pa…

CogVideoX:Text-to-Video Diffusion Models with An Expert Transformer

研究背景 背景介绍: 这篇文章的研究背景是文本到视频模型的快速发展&#xff0c;特别是Transformer架构和扩散模型的应用。早期尝试预训练和扩展Transformer生成视频已经显示出巨大潜力&#xff0c;如CogVideo和Phenaki。扩散模型在多模态生成方面也取得了显著进展&#xff0c…

数据结构 -- 排序算法

一 排序 1.1 排序的概念 所谓排序&#xff0c;就是一种使一串数据记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减地组织起来的操作。 从排序方式上&#xff0c;排序算法一般被分为比较排序和非比较排序。从比较排序的内容上&#xff0c;它一般被分为…

Excel:vba实现拆分单元格成一字一单元格

我拿到的表格如下&#xff1a; 我想实现的表格效果如下&#xff1a; 要求就是&#xff1a;将A列的千字文拆分成一个单元格一个字&#xff0c;并整理成4列 我这里是将效果呈现到一个新的表里面&#xff0c;没有在原表里面(在原表里…

SpringBoot统一日志框架

在项目开发中&#xff0c;日志十分的重要&#xff0c;不管是记录运行情况还是定位线上问题&#xff0c;都离不开对日志的分析。 1.日志框架的选择 市面上常见的日志框架有很多&#xff0c;它们可以被分为两类&#xff1a;日志门面&#xff08;日志抽象层&#xff09;和日志实…