tag 标签: SD卡FLASH

相关帖子
相关博文
  • 2024-10-16 18:07
    121 次阅读|
    0 个评论
    说起SD NAND FLASH常被联想到SD卡,SD NAND FLASH具备当前SD卡的基本功能,并具有更高的存储密度,更小的体积,通过芯片形式焊接在电路中稳定可靠,在电路中高度集成可SMT机贴片等优点。这一节我们主要是介绍一下SD NAND FLASH,该应用实例的SD NAND FLASH采用深圳市雷龙发展有限公司的CSNP1GCR01-AOW型号的存储芯片,雷龙发展在SD NAND FLASH中已经有多年的深厚研发经验和严格的测试流程。 一、SD NAND FLASH芯片简介 CSNP1GCR01-AOW是基于NAND FLASH 和SD 控制器的1Gb容量空间的存储芯片。比传统的NAND FLASH具有还有坏块管理,数据ECC功能和异常掉电保证数据安全存储等功能。封装尺寸为8mm x 6mm x0.75mm。 产品特点: 接口:具备1线或者4线SD标准2.0版本 供电:Vcc = 2.7V - 3.6V 默认模式:可变的时钟范围0~25MHz,高达12.5MB/s的接口速度(使用4线) 高速模式:可变的时钟范围0~50MHz,高达25MB/s的接口速度(使用4线) 工作温度范围:-40°C to +85°C 存储温度范围:-55°C to +125°C 标准电流:< 250uA 开关功能命令支持高速,商务和未来的一些功能 矫正存储区域的错误 内容保护机制兼容最安全的SDMI标准 支持SD NAND密码保护功能 使用机械开关进行写保护功能 内置写保护功能(永久和临时) 通用场景 应用程序特定命令 舒适擦除机制 通过下图的功能框图可以理解,SD NAND FLASH是通过Memory core来进行存储数据的,通过SD控制进行通讯接口的控制和存储的管理。 外部引脚位置和定义如下图所示: 机械尺寸如下图所示: 二、总结 本节主要介绍了SD NAND FLASH的基本功能特性,引脚定义和外形的机械尺寸,通过这个基本的描述可以对SD NAND FLASH有个初步的了解。下一节主要介绍,SD NAND FLASH的初始化过程。
  • 热度 1
    2023-12-6 18:18
    614 次阅读|
    0 个评论
    文章目录 前言 1 SD NAND概述 2 代码说明 3 记录Log 前言 本文基于 ESP32 芯片作为主控制器,测试 SD NAND 记录飞控 Log 功能。 关于 MCU 的存储方面,以前基本上用内置的 E2PROM,或者是外置的 NOR Flash 就可以。随着物联网的兴起,MCU 的应用越来越广泛,逐渐的 MCU 会涉及到大容量的存储需求,用来存储音频,图片(GUI)、视频缓存、协议栈等等。传统的 E2PROM 和 NOR Flash 就不够用了。这个时候 MCU 可能就需要用到 NAND Flash。 针对 MCU 需要使用大容量的存储需求,推荐一款简单易用、稳定可靠的 NAND Flash —— SD NAND 。 1 SD NAND概述 SD NAND 的架构,内部采用使用寿命最长、性能最稳定的 NAND Flash(SLC NAND Flash)晶圆,它的擦写寿命可以达到 5~10 万次。内置了 Flash 控制器和针对 NAND Flash 管理的 Firmware。对外采用通用性最强的 SD 接口(几乎所有 MCU 都带有 SD 接口)。 本文选择的是 CSNP32GCR01-AOW 芯片。 不用编写驱动程序,自带坏块管理的 NAND Flash(贴片式 TF 卡),尺寸小巧,简单易用,兼容性强,稳定可靠,固件可定制,LGA-8 封装,标准 SDIO 接口,兼容 SPI,兼容拔插式 TF卡/SD卡,可替代普通 TF卡/SD卡,尺寸 6.2x8mm。 内置平均读写算法,通过 1 万次随机掉电测试耐高低温,机贴手贴都非常方便,速度级别 Class10(读取速度 23.5MB/s,写入速度 12.3MB/s)。标准的 SD 2.0 协议使得用户可以直接移植标准驱动代码,省去了驱动代码编程环节。支持 TF 卡启动的 SOC 都可以用 SD NAND,提供 STM32 参考例程及原厂技术支持,容量:4GB, 比 TF 卡稳定,比 eMMC 便宜。 2 代码说明 1. 宏定义使能 SD 卡功能 #define HAL_ESP32_SDCARD 2. 挂载 SD 卡 bool sdcard_retry(void) { if(!card) return mount_sdcard; return true; } bool mount_sdcard { printf("............Try mount.\n"); sdmmc_host_t host = SDMMC_HOST_DEFAULT; host.max_freq_khz = SDMMC_FREQ_HIGHSPEED; sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT; slot_config.flags = SDMMC_SLOT_FLAG_INTERNAL_PULLUP; esp_vfs_fat_sdmmc_mount_config_t mount_config = { .format_if_mount_failed = false, .max_files = 5, .allocation_unit_size = 4 * 1024 }; esp_err_t ret = esp_vfs_fat_sdmmc_mount("/SDCARD", &host, &slot_config, &mount_config, &card); if (ret == ESP_OK) { mkdir("/SDCARD/APM", 0777); printf("sdcard is mounted\n"); update_fw; return true; } else { printf("sdcard is not mounted.\n"); return false; } } 3. 卸载 SD 卡 void sdcard_stop(void) { unmount_sdcard; } void unmount_sdcard { if (card != nullptr) { esp_vfs_fat_sdmmc_unmount; } } 3 记录Log 1. LOG目录建立 可以看到飞控已经在 SD NAND 中成功建立 LOG 目录。 2. LOG分析 飞机通电,翻滚机身,记录飞机的姿态角。 下载日志,加载到 Mission Planner 软件。选中 ATT 字段中的 Roll 和 Pitch。可以看到曲线跟随飞机姿态变化。 至此,使用 SD NAND 替代 SD 卡,测试飞控 LOG 记录功能完成。
  • 热度 8
    2023-3-3 17:52
    624 次阅读|
    0 个评论
    五、案例使用 5.1 读取GBK字库文件(LCD汉字显示) 产品开发中,如果设备带有LCD显示屏,一般会显示各种文字提示,或者机器操作说明,显示中文需要字库,为了方便字模的提取,可以将字库文件制作好之后放到SD NAND上,通过文件系统打开字库文件,读取字模进行显示。 下面贴出文件系统读取字模的核心代码: /* 函数功能: 显示GBK字库数据 u32 x 范围0~319 u32 y 范围0~479 u32 size 数据的宽度(必须是8的倍数) 是正方形 u8 *p 中文 说明: 取模横向坐标必须保证是8的倍数 */ void ILI9341_DisplayGBKData(u32 x,u32 y,u32 size,u8 *p) { FIL fp; UINT br; u8 L,H; u32 Addr; u16 font_size=size/8*size; //字体占用的点阵码字节大小 u8 *buff=NULL; H=*p; L=*(p+1); if(L<0x7f)L=L-0x40; else L=L-0x41; H=H-0x81; Addr=(190*H+L)*font_size; //中文在字库里的偏移量 buff=malloc(font_size); //使用的堆空间 if(buff==NULL)return; switch(size) { case 16: if(f_open(&fp,"0:/font/gbk16.DZK",FA_READ)!=FR_OK) { printf("f_open error.\r\n"); } f_lseek(&fp,Addr); f_read(&fp,buff,font_size,&br); f_close(&fp); break; case 24: f_open(&fp,"0:/font/gbk24.DZK",FA_READ); f_lseek(&fp,Addr); f_read(&fp,buff,font_size,&br); f_close(&fp); break; case 32: break; } //显示中文 ILI9341_DisplayData(x,y,size,size,buff); //释放空间 free(buff); } 这是读取字模,显示的效果: 5.2 读取MP3文件播放(开机音乐) 这个例子是演示文件系统的目录扫描函数使用方式,读取指定目录下的MP3文件进行播放。 u8 PlayerMP3(const char *path); FATFS FatFs; int main() { LED_Init(); BEEP_Init(); KeyInit(); USARTx_Init(USART1,72,115200); SDCardDeviceInit(); //初始化SD卡 // res=f_mkfs("0:",FM_ANY,0,work,sizeof work); // if(res)printf("格式化失败!\n"); // else printf("格式化成功!\n"); f_mount(&FatFs, "0:", 0); //注册工作区 PlayerMP3("0:/MP3"); while(1) { DelayMs(100); LED0=!LED0; } } /* 函数功能: 扫描目录mp3播放 0表示成功 1表示失败 */ u8 PlayerMP3(const char *path) { DIR dir; FRESULT res; FILINFO fno; //存放读取的文件信息 char *abs_path=NULL; /*1. 打开目录*/ res=f_opendir(&dir,path); if(res!=FR_OK)return res; /*2. 循环读取目录*/ while(1) { res=f_readdir(&dir,&fno); if(fno.fname == 0 || res!=0)break; printf("文件名称: %s,文件大小: %ld 字节\r\n",fno.fname,fno.fsize); /*过滤目录*/ if(strstr(fno.fname,".mp3")) { //申请存放文件名称的长度 abs_path=malloc(strlen(path)+strlen(fno.fname)+1); if(abs_path==NULL)break; strcpy(abs_path,path); strcat(abs_path,"/"); strcat(abs_path,fno.fname); printf("abs_path=%s\n",abs_path); VS1053_MP3(0,0,abs_path); free(abs_path); } } /*3. 关闭目录*/ f_closedir(&dir); return 0; }