1.CS创世简介
创世半导体成立于2016年,在香港,韩国,中国设有办公室。创世成立是预见到5G,人工智能,物联网等行业的崛起。用户对芯片的需求会有新一个世代的要求。
创世半导体利用韩国,台湾地区的芯片设计能力和供应资源,在中国实现封装和测试,并提供本地化的服务与支持。目前专注于SD NAND存储产品的研发和生产。
2016年,创世推出了第一代SD NAND,给客户提供兼容性强,一致性高,焊接稳定可靠的产品。大大降低了客户使用其他存储产品带来的不良率,也帮助客户缩短了调试小容量存储芯片驱动的研发时间,加快客户项目的迭代速度。
2018年,为满足更轨道交通,航空航天,工业控制,仪器仪表等行业类客户需求,创世半导体首家推出了第二代SD NAND产品。能够实现更快的读写速度,更宽泛的使用环境。能够承受高低温冷热冲击,随机掉电等苛刻的操作环境。同时能给客户提供个性化的固件定制服务。
2020年,随着智能穿戴设备的兴起和物联网的不断发展,用户对存储容量的需求也不断增长。创世半导体推出了4GB SD NAND产品,能够实现同等容量下,最小的尺寸封装和最少的pin脚。帮助用户推出更小巧,稳定的产品。
创世的产品已经广泛应用于医疗设备,工业控制,轨道交通,安防,网络设备,IPC,执法记录仪,可视对讲,门禁考勤,平板电脑,汽车电子,电力设备,工业仪器设备,POS机,教育电子等行业。成功合作客户包括中国中车,中国航天,中国船舶集团,清华大学,糖猫,360等企业。合作CPU平台包括:ST, NXP,TI, Microchip, Nordic, ESPRESSIF, MTK,Qualcomm等。
2.SD NAND FLASH简介
SD NAND FLASH,即安全数字NAND闪存技术,是一种结合了NAND闪存的高密度存储能力和安全性能的存储解决方案。是一种非易失性存储器技术,意味着它在断电后仍能保存数据。它通过电荷的存储与释放来实现数据的存储,基本单元结构是一个浮栅晶体管。将NAND Flash集成到SD卡中,提供了一个集成的存储解决方案。它通常具有额外的安全特性,如加密和访问控制,以保护存储的数据免受未经授权的访问或篡改。
SD NAND FLASH的工作原理与NAND Flash相似,涉及一系列的编程(写入)、擦除和读取操作。写入过程:通过施加高电压,电子被注入浮栅,改变浮栅上的电荷,进而影响晶体管的导通状态,从而表示不同的存储信息(通常是“0”或“1”)。采用块擦除的方式。通过施加反向电压,浮栅上的电子被移除,恢复晶体管的原始状态。擦除通常是对整个块进行操作,而不是单个字节。通过检测浮栅上的电荷状态,可以确定存储单元的导通状态,从而读取出存储的信息。
SD NAND FLASH具有更高的存储密度,使其适用于需要大容量存储的应用。提供了硬件和软件层面的安全性保护,包括加密和访问控制,以确保存储的数据不容易被盗取或篡改。常用于数码相机、手机、平板电脑等需要可移动存储和数据保护的设备。
随着技术的不断发展,SD NAND FLASH在持续改进和创新。它将继续提高性能和存储密度,以满足高容量、高性能的需求。同时,随着物联网、人工智能等技术的兴起,SD NAND FLASH将在更多领域发挥重要作用,如安全摄像头、工业控制系统等。
SD NAND FLASH是一种结合了高密度存储能力和安全性能的存储解决方案。它具有便携性、高密度、安全性等优势,并广泛应用于各种需要可移动存储和数据保护的设备中。随着技术的不断进步和应用领域的拓展,SD NAND FLASH的市场前景将更加广阔。
创世SD NAND FLASH二代采用SDIO驱动接口,兼容SPI模式。有多种存储容量,外围接口电路简单,工作电压为3.3V,适用于各种嵌入式平台,如STM32系列单片机。
3.SD NAND FLASH PC端测试
??将创世的SD NAND存储芯片焊接到官方提供的测试底板,然后使用读卡器插入电脑端,硬件实物如图所示:
??磁盘可用大小为3.6GB。
??通过使用磁盘检测工具对整个空间进行写入测试,平均写入速度可达17.6MB/S。
??在实际拷贝文件测试中,可以看到平台写入速度为7MB/S。
4.STM32 SDIO驱动SD NAND示例
SDIO(Secure Digital Input Output),即安全数字输入输出接口,是一种基于SD(Secure Digital)卡技术的扩展接口标准。SDIO最早由SD协会(SD Association,SDA)于2001年发布,作为SD卡标准的一种扩展。它允许外部设备通过标准的SD卡槽连接并通信,不仅支持传统的存储功能,还允许设备通过SD卡接口进行输入输出操作。
SDIO协议支持高达50MHz的数据传输速率(某些模式下甚至更高,如UHS-I模式可达到104MB/s或更高),可以实现快速的数据读写操作。
多设备连接:SDIO接口可以同时连接多个设备,通过多个数据线同时进行数据传输,提高通信效率。支持热插拔功能,允许用户在不关闭系统的情况下插入或移除外设,增强了系统的灵活性和易用性。同时,SDIO设备通常被划分为多个功能单元(Function),每个功能单元可以看作是一个独立的外设,具有自己的寄存器和配置选项。
SDIO接口继承了SD卡的紧凑尺寸和低功耗特性,同时提供了更高的数据传输速率和更多的功能选项。然而,由于SDIO协议的不同版本和设备之间的差异,可能存在兼容性问题。开发人员需要针对不同的设备进行适配和测试。
4.1 STM32F10x上的SDIO接口
STM32 SDIO总线上的通信是通过传送命令和数据实现。在多媒体卡/SD/SD I/O总线上的基本操作是命令/响应结构,这样的总线操作在命令或总线机制下实现信息交换;另外,某些操作还具有数据令牌。
在SD/SDIO存储器卡上传送的数据是以数据块的形式传输;在MMC上传送的数据是以数据块或数据流的形式传输;在CE-ATA设备上传送的数据也是以数据块的形式传输。
4.2 硬件接口
4.3 软件设置
??1.芯片选择
??2.时钟配置
??3.SDIO配置
4.4 代码生成
void MX_SDIO_SD_Init(void) { /* USER CODE BEGIN SDIO_Init 0 */ /* USER CODE END SDIO_Init 0 */ /* USER CODE BEGIN SDIO_Init 1 */ /* USER CODE END SDIO_Init 1 */ hsd.Instance = SDIO; hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;//在主时钟SDIOCLK的上升沿产生SDIO_CK hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;//盘路时钟失能 hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;//始终输出SDIO_CK hsd.Init.BusWide = SDIO_BUS_WIDE_1B;//总线宽度 hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;//关闭硬件流控制 //当SD/SDIO卡或多媒体卡在识别模式, SDIO_CK的频率必须低于400kHz。 hsd.Init.ClockDiv = 6;//时钟分频系数,SDIO_CK=HCLK/(ClockDiv+2) if (HAL_SD_Init(&hsd) != HAL_OK)//SD初始化 { Error_Handler(); } if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK)//配置总线宽度 { Error_Handler(); } /* USER CODE BEGIN SDIO_Init 2 */ hsd.Init.ClockDiv=0;//重新设置时钟速度 /* USER CODE END SDIO_Init 2 */ }
??2.SD读写扇区函数
??为了方便后续FATFS文件系统移植,我们这里封装两个函数SD卡写扇区和读扇区。
void SD_WriteDisk(uint8_t *buf,uint32_t sector_add,uint32_t cnt) { HAL_SD_WriteBlocks(&hsd,buf,sector_add,cnt,5000);//SD卡写块 while(HAL_SD_GetCardState(&hsd)!=HAL_SD_CARD_TRANSFER);//等待数据传输完成 } void SD_ReadDisk(uint8_t *buf,uint32_t sector_add,uint32_t cnt) { HAL_SD_ReadBlocks(&hsd,buf,sector_add,cnt,5000);//SD卡读块 while(HAL_SD_GetCardState(&hsd)!=HAL_SD_CARD_TRANSFER);//等待数据传输完成 }
??3.主函数
??初始化HAL库、GPIO端口、LCD屏(FSMC驱动)、SD卡初始化;获取卡类型、卡容量,最后调用SD卡读写扇区函数实现数据读写测试。
uint8_t buf_tx[4096]="SD卡SDIO驱动HAL库配置测试数据STM32F103ZET6 -- Ver1.0"; uint8_t buf_rx[4096]; MX_GPIO_Init(); MX_FSMC_Init(); MX_SDIO_SD_Init(); MX_USART1_UART_Init(); MX_SPI2_Init(); /* USER CODE BEGIN 2 */ char buff[200]; NT35310_Init();//LCD初始化 LCD_Display_Str(LCD_WIDTH/2-strlen("SD卡初始化")/2*8,20,16,(u8 *)"SD卡初始化",BLACK); if(hsd.State!=HAL_SD_STATE_READY) { LCD_Display_Str(20,40,16,(u8 *)"SD Init ERR",RED); } else { LCD_Display_Str(20,40,16,(u8 *)"SD Init OK",RED); LCD_Display_Str(20,60,16,(u8 *)"卡类型:",RED); if(hsd.SdCard.CardType==CARD_SDHC_SDXC)//2.0告诉卡 { LCD_Display_Str(20+8+strlen("卡类型:")*8,60,16,(u8 *)"SDHC",RED); } else if(hsd.SdCard.CardType==CARD_SDSC)//2.0普通卡 { LCD_Display_Str(20+8+strlen("卡类型:")*8,60,16,(u8 *)"SDSC",RED); } snprintf(buff,sizeof(buff),"块大小: %d byten",hsd.SdCard.BlockSize); LCD_Display_Str(20,80,16,(u8 *)buff,RED); snprintf(buff,sizeof(buff),"卡容量大小: %.2f GBn",(hsd.SdCard.BlockNbr>>11)/1024.0); LCD_Display_Str(20,100,16,(u8 *)buff,RED); } LCD_Display_Str(LCD_WIDTH/2-strlen("SD数据读写测试")/2*8,130,16,(u8 *)"SD数据读写测试",BLACK); SD_WriteDisk(buf_tx,100,2); LCD_Display_Str(20,150,16,(u8 *)"SD写数据: OK",RED); SD_ReadDisk(buf_rx,100,3); LCD_Display_Str(20,170,16,(u8 *)"SD读数据: OK",RED); LCD_Display_Str(20,190,16,(u8 *)"数据内容:",RED); LCD_Display_Str(20,210,16,(u8 *)buf_rx,BLUE);
4.5 运行效果
??将SD NAND FLASH插入到STM32 SD卡座上,使用SDIO方式驱动,读取卡容量信息并进行数据读写测试。
审核编辑 黄宇
-
FlaSh
+关注
关注
10文章
1679浏览量
152005 -
ST
+关注
关注
32文章
1181浏览量
130559 -
SD NAND
+关注
关注
0文章
93浏览量
1508
发布评论请先 登录
评论