页次: 1
目录
前言:
简介:
对照:
测试:
使用:
照片存储:
基于卷积神经网络的数字识别:
————————————————
前言:
感谢深圳雷龙公司寄送的样品,其中包括两张2代的4gbit和32gbit的SD NAND FLASH芯片以及一份测试板卡。
简介:
根据官方文档的描述,这款芯片采用LGA-8封装,具有标准SDIO接口,并同时兼容SPI和SD接口。因此,可以直接移植标准驱动代码,支持使用SD NAND FLASH的SOC也可以用于TF卡启动。
以下是该芯片的主要参数(以CSNP32GCR01-BOW手册为准):
接口:符合标准SD Specification Version 2.0规范,包括1-I/O和4-I/O两种模式。
默认模式:在默认模式下,时钟频率可变范围为0-25 MHz,接口速度高达12.5 MB/sec(使用4条并行数据线路)。
高速模式:在高速模式下,时钟频率可变范围为0-50 MHz,接口速度高达25 MB/sec(使用4条并行数据线路)。
对照:
下面是SD NAND芯片和传统TF卡的一些对比:
目前,一些树莓派和一些国产的微处理器经常通过SD卡进行系统的移植,但一些设计不合理的卡槽经常不能保护SD卡,反而会损坏折断。相比之下,SD NAND可以通过贴片直接嵌入嵌入式设备中,更适合嵌入式环境的开发。同时,裸露的SD卡槽和松动的SD卡时常会影响系统的稳定性,因此一个可以反复擦拭的稳定存储芯片显得十分重要。
通过将测试板和芯片进行简单的焊接,我们可以像使用SD卡一样对SD NAND FLASH进行测试。
测试:
首先,我们使用CrystalDiskMark 8.0.4c对这款储存器进行了测试:
本次测试的是512MB的容量的产品,容量是真实的。我们可以看出,在包括顺序读取、顺序写入、随机读取和随机写入的四个测试方式下,SD NAND取得了不错的测试结果,接近官方数据,可以成功进行高速存储。
使用:
此外,我们还利用k210与SD NAND进行了照片的存储和基于卷积神经网络的数字识别。
1.照片存储:
通过向SD NAND内烧录micropython代码,实现了k210对照片的拍摄和存储。存储速度非常快。
import sensor, lcd
from Maix import GPIO
from fpioa_manager import fm
from board import board_info
import os, sys
import time
import image
#### image size ####
set_windowing = (224, 224)
#### sensor config ####
sensor.reset(freq=22000000, dual_buff=False)
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA) # 320x240
try:
sensor.set_jb_quality(95) # for IDE display quality
except Exception:
pass # no IDE support
if set_windowing:
sensor.set_windowing(set_windowing)
# sensor.set_auto_gain(False)
# sensor.set_auto_whitebal(False, rgb_gain_db=(0x52,0x40,0x4d))
# sensor.set_saturation(0)
# sensor.set_brightness(4)
# sensor.set_contrast(0)
# sensor.set_hmirror(True) # image horizonal mirror
# sensor.set_vflip(True) # image vertical flip
# sensor.set_auto_whitebal(False)
sensor.skip_frames()
#### lcd config ####
lcd.init(type=1, freq=15000000)
lcd.rotation(2)
#### boot key ####
boot_pin = 16 # board_info.BOOT_KEY
fm.register(boot_pin, fm.fpioa.GPIOHS0)
key = GPIO(GPIO.GPIOHS0, GPIO.PULL_UP)
######################################################
#### main ####
def capture_main(key):
def draw_string(img, x, y, text, color, scale, bg=None , full_w = False):
if bg:
if full_w:
full_w = img.width()
else:
full_w = len(text)*8*scale+4
img.draw_rectangle(x-2,y-2, full_w, 16*scale, fill=True, color=bg)
img = img.draw_string(x, y, text, color=color,scale=scale)
return img
def del_all_images():
os.chdir("/sd")
images_dir = "cap_images"
if images_dir in os.listdir():
os.chdir(images_dir)
types = os.listdir()
for t in types:
os.chdir(t)
files = os.listdir()
for f in files:
os.remove(f)
os.chdir("..")
os.rmdir(t)
os.chdir("..")
os.rmdir(images_dir)
# del_all_images()
os.chdir("/sd")
dirs = os.listdir()
images_dir = "cap_images"
last_dir = 0
for d in dirs:
if d.startswith(images_dir):
if len(d) > 11:
n = int(d[11:])
if n > last_dir:
last_dir = n
images_dir = "{}_{}".format(images_dir, last_dir+1)
print("save to ", images_dir)
if images_dir in os.listdir():
img = image.Image()
img = draw_string(img, 2, 200, "please del cap_images dir", color=lcd.WHITE,scale=1, bg=lcd.RED)
lcd.display(img)
sys.exit(1)
os.mkdir(images_dir)
last_cap_time = 0
last_btn_status = 1
save_dir = 0
save_count = 0
os.mkdir("{}/{}".format(images_dir, save_dir))
while(True):
img0 = sensor.snapshot()
if set_windowing:
img = image.Image()
img = img.draw_image(img0, (img.width() - set_windowing[0])//2, img.height() - set_windowing[1])
else:
img = img0.copy()
# img = img.resize(320, 240)
if key.value() == 0:
time.sleep_ms(30)
if key.value() == 0 and (last_btn_status == 1) and (time.ticks_ms() - last_cap_time > 500):
last_btn_status = 0
last_cap_time = time.ticks_ms()
else:
if time.ticks_ms() - last_cap_time > 5000:
img = draw_string(img, 2, 200, "release to change type", color=lcd.WHITE,scale=1, bg=lcd.RED)
else:
img = draw_string(img, 2, 200, "release to capture", color=lcd.WHITE,scale=1, bg=lcd.RED)
if time.ticks_ms() - last_cap_time > 2000:
img = draw_string(img, 2, 160, "keep push to change type", color=lcd.WHITE,scale=1, bg=lcd.RED)
else:
time.sleep_ms(30)
if key.value() == 1 and (last_btn_status == 0):
if time.ticks_ms() - last_cap_time > 5000:
img = draw_string(img, 2, 200, "change object type", color=lcd.WHITE,scale=1, bg=lcd.RED)
lcd.display(img)
time.sleep_ms(1000)
save_dir += 1
save_count = 0
dir_name = "{}/{}".format(images_dir, save_dir)
os.mkdir(dir_name)
else:
draw_string(img, 2, 200, "capture image {}".format(save_count), color=lcd.WHITE,scale=1, bg=lcd.RED)
lcd.display(img)
f_name = "{}/{}/{}.jpg".format(images_dir, save_dir, save_count)
img0.save(f_name, quality=95)
save_count += 1
last_btn_status = 1
img = draw_string(img, 2, 0, "will save to {}/{}/{}.jpg".format(images_dir, save_dir, save_count), color=lcd.WHITE,scale=1, bg=lcd.RED, full_w=True)
lcd.display(img)
del img
del img0
def main():
try:
capture_main(key)
except Exception as e:
print("error:", e)
import uio
s = uio.StringIO()
sys.print_exception(e, s)
s = s.getvalue()
img = image.Image()
img.draw_string(0, 0, s)
lcd.display(img)
main()
2.基于卷积神经网络的数字识别:
我们向SD NAND内烧录了功能代码、模型参数和模型结构。SD NAND可以很好地存储以上内容,并通过k210正确加载模型。在使用过程中,SD NAND表现出了出色的稳定性,没有出现崩溃或弹出的情况。
# generated by maixhub, tested on maixpy3 v0.4.8
# copy files to TF card and plug into board and power on
import sensor, image, lcd, time
import KPU as kpu
import gc, sys
input_size = (224, 224)
labels = ['1', '2', '3', '4', '5', '6', '7', '8']
anchors = [0.45, 1.55, 1.46, 2.54, 1.22, 1.55, 1.58, 2.59, 1.47, 2.78]
def lcd_show_except(e):
import uio
err_str = uio.StringIO()
sys.print_exception(e, err_str)
err_str = err_str.getvalue()
img = image.Image(size=input_size)
img.draw_string(0, 10, err_str, scale=1, color=(0xff,0x00,0x00))
lcd.display(img)
def main(anchors, labels = None, model_addr="/sd/m.kmodel", sensor_window=input_size, lcd_rotation=0, sensor_hmirror=False, sensor_vflip=False):
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.set_windowing(sensor_window)
sensor.set_vflip(1)
sensor.run(1)
lcd.init(type=1)
lcd.rotation(lcd_rotation)
lcd.clear(lcd.WHITE)
if not labels:
with open('labels.txt','r') as f:
exec(f.read())
if not labels:
print("no labels.txt")
img = image.Image(size=(320, 240))
img.draw_string(90, 110, "no labels.txt", color=(255, 0, 0), scale=2)
lcd.display(img)
return 1
try:
img = image.Image("startup.jpg")
lcd.display(img)
except Exception:
img = image.Image(size=(320, 240))
img.draw_string(90, 110, "loading model...", color=(255, 255, 255), scale=2)
lcd.display(img)
try:
task = None
task = kpu.load(model_addr)
kpu.init_yolo2(task, 0.5, 0.3, 5, anchors) # threshold:[0,1], nms_value: [0, 1]
while(True):
img = sensor.snapshot()
t = time.ticks_ms()
objects = kpu.run_yolo2(task, img)
t = time.ticks_ms() - t
if objects:
for obj in objects:
pos = obj.rect()
img.draw_rectangle(pos)
img.draw_string(pos[0], pos[1], "%s : %.2f" %(labels[obj.classid()], obj.value()), scale=2, color=(255, 0, 0))
img.draw_string(0, 200, "t:%dms" %(t), scale=2, color=(255, 0, 0))
lcd.display(img)
except Exception as e:
raise e
finally:
if not task is None:
kpu.deinit(task)
if __name__ == "__main__":
try:
# main(anchors = anchors, labels=labels, model_addr=0x300000, lcd_rotation=0)
main(anchors = anchors, labels=labels, model_addr="/sd/model-54796.kmodel")
except Exception as e:
sys.print_exception(e)
lcd_show_except(e)
finally:
gc.collect()
通过以上两个实验,SD NAND代替传统的SD/TF卡进行数据存储表现出了极大的优势和稳定性。
stm32 CubeMx 实现SD卡/sd nand FATFS读写测试。
材料:stm32F407ZGT6开发板、雷龙公司的SD_NAND 测试板(CSNP1GCR01-AOW)。(一开始是使用 Nandflash的操作起来不太方便而且 stm32cubemx自带的 fatfs还没有磨损平衡算法,很是难受。)
CSNP1GCR01-AOW的优势:
不用写驱动程序自带坏块管理的NAND Flash(贴片式TF卡),尺寸小巧,简单易用,兼容性强,稳定可靠,固件可定制,LGA-8封装,标准SDIO接口,兼容SPI/SD接口,兼容各大MCU平台,可替代普通TF卡/SD卡,尺寸6x8mm毫米,内置SLC晶圆擦写寿命10万次,通过1万次随机掉电测试耐高低温,支持工业级温度-40°~+85°,机贴手贴都非常方便,速度级别Class10(读取速度23.5MB/S写入速度12.3MB/S)标准的SD 2.0协议使得用户可以直接移植标准驱动代码,省去了驱动代码编程环节。支持TF卡启动的SOC都可以用SD NAND,提供STM32参考例程及原厂技术支持,主流容量:128MB/512MB/4GB/8GB,比TF卡稳定,比eMMC便宜,样品免费试用(可到官网找客服小姐姐领取样品哦)。雷龙官网
话不多说开始正文:
stm32cubeMX 版本:6.6.1
MDK5 版本5.35
开始配置STM32
1、 配置时钟:
系统时钟树配置(我这里直接拉满,实际使用根据功耗要求作相应的调整)
2、 配置调试接口
注意DEBUG这个一定要配置,如果是默认的那下载一次程序之后第二次就下载不进去了.
3、配置SDIO:
(我这里还是用了DMA 减少mcu的资源开销)
配置完成之后随便选一个IO口作为SD_NAND的插入检测引脚(没有检测脚的也选上不然在生成代码的时候会有警告,看着很不舒服,我这里选的是 PE4 引脚)
4、配置SDIO的DMA
5、添加文件系统
6、配置堆栈大小(稍微调大一点,不然在读写大一点的数据的时候可能会出错)
7、生成代码
8、生成代码后在 bsp_driver_sd.c这个文件中将这三行代码注释(这是检测SD卡是否接入的引脚 如果不注释在挂载sdnand的时候会提示 not_ready)
9、在main.c中 添加测试代码
*/
/* USER CODE END Header */
/* Includes */
#include "main.h"
#include "dma.h"
#include "fatfs.h"
#include "sdio.h"
#include "gpio.h"
/* Private includes */
/* USER CODE BEGIN Includes */
/* USER CODE END Includes */
/* Private typedef */
/* USER CODE BEGIN PTD */
FATFS fs; /* FatFs 文件系统对象 */
FIL file; /* 文件对象 */
FRESULT f_res; /* 文件操作结果 */
UINT fnum; /* 文件成功读写数量 */
BYTE ReadBuffer[1024] = {0}; /* 读缓冲区 */
BYTE WriteBuffer = /* 写缓冲区 */
"This is STM32 working with FatFs\r\n";
/* USER CODE END PTD */
/* Private define */
/* USER CODE BEGIN PD */
/* USER CODE END PD */
/* Private macro */
/* USER CODE BEGIN PM */
/* USER CODE END PM */
/* Private variables */
/* USER CODE BEGIN PV */
//HAL_SD_CardInfoTypeDef SDCardInfo;
//HAL_SD_CardCIDTypeDef SDCard_CID;
/* USER CODE END PV */
/* Private function prototypes */
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code */
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init;
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config;
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init;
MX_DMA_Init;
MX_SDIO_SD_Init;
MX_FATFS_Init;
/* USER CODE BEGIN 2 */
f_res = f_mount(&SDFatFS, "0:/",1);
HAL_Delay(100);
if(f_res == FR_NO_FILESYSTEM)
{
f_res = f_mkfs("0:/",FM_FAT|FM_SFD,0,&ReadBuffer,sizeof(ReadBuffer));//格式化SDNAND
HAL_Delay(100);
if(f_res == FR_OK)
{
f_res = f_mount(NULL,"0:/",1);//取消挂载
f_res = f_mount(&SDFatFS, "0:/",1);//重新挂载
}
}
HAL_Delay(100);
//写测试
f_res = f_open(&SDFile,"helloWorld.txt",FA_CREATE_ALWAYS|FA_WRITE);
HAL_Delay(100);
f_res = f_write(&SDFile,WriteBuffer,sizeof(WriteBuffer),&fnum);
HAL_Delay(100);
f_res = f_close(&SDFile);
//读测试
f_res = f_open(&SDFile,"helloWorld.txt",FA_OPEN_EXISTING | FA_READ);
HAL_Delay(100);
if(f_res == FR_OK)
{
f_res = f_read(&SDFile,ReadBuffer,sizeof(ReadBuffer),&fnum);
}
HAL_Delay(100);
f_res = f_close(&SDFile);
HAL_Delay(100);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
/* USER CODE END PTD */
配置没问题的程序运行后则可以将 sdnand测试板 插入到读卡器中,读卡器再接到电脑上则就会出现:
打开文件则会出现
至此大功告成!!!!!
需要注意的是最新版的fatfs 文件系统中
FRESULT f_mkfs (
const TCHAR* path, /* Logical drive number */
BYTE opt, /* Format option */
DWORD au, /* Size of allocation unit [byte] */
void* work, /* Pointer to working buffer */
UINT len /* Size of working buffer */
)
f_mkfs 这个函数有五个参数,老版本的只有三个参数
所以在格式化的时候得这么来操作
f_res = f_mkfs("0:/",FM_FAT|FM_SFD,0,&ReadBuffer,sizeof(ReadBuffer));
嘿,小伙伴们!今天给大家介绍一个超酷的玩意儿!你们有没有遇到过这样的情况呢?刚入门麻将,对规则一头雾水,每次都得翻阅厚厚的规则书。别担心!现在有了雷龙发展的LSYT201B离线语音模块,解决你的烦恼!
这个神奇的小模块可以实现5m离线语音控制!无需联网,随时随地都能使用。只需要简单地说出你要进行的操作,它就会立即响应你的指令。不用再费力去找规则书啦!
作为一个麻将新手,我深深感受到了这个离线语音模块带来的便利。以前总是被复杂的规则搞得头晕眼花,但现在只需要对着麻将机说出“开局”、“摸牌”、“吃碰杠胡”,它就会自动播放相应操作方式。简直是太方便啦!
而且这个离线语音模块的操作非常简单,只需要将它连接到麻将机上,然后按下按钮进行语音识别即可。不仅适用于麻将机,还可以应用在其他领域,让你的生活更加智能化。
小伙伴们,如果你也觉得这个离线语音控制麻将机超级赞的话,就点个赞吧!让我们一起享受便捷的麻将游戏体验!
雷龙发展公司致力于为客户提供一站式的离线语音解决方案。我们的服务涵盖了多个领域,包括家电、医疗器械、安防报警、汽车电子、多媒体、通信、电话录音、工业自动化控制、玩具及互动消费类产品等。通过我们的专业知识和经验,我们能够满足各类产品的语音交互需求,让用户享受更加智能、便捷的使用体验。
SD NAND 也称之为贴片式TF卡,贴片式SD卡,采用标准的SDIO接口,兼容SPI接口。下图所示为CS 新一代CS SD NAND NP1GCR01-AOW 大小为128M,对比128M的SD卡,可以看到贴片SD卡尺寸更小,不要SD卡座,占用更小的PCB面积;也可以节省PCB板层数,2层板即可使用。而且兼容可替代普通TF卡/SD卡,硬件电路软件程序通用。本案例基于RT-Thread物联网操作系统,更是不需要编写任何复杂的驱动代码就可以SD NAND读写操作。
(文末提供,STM32驱动代码下载连接,需要可以自行下载)
将SD NAND插入SD卡卡座。首先,新建一个RT-Thread项目工程,这里基于Draco开发板创建。
完整的RT-thread项目默认是开启虚拟文件系统组件,RT-Thread DFS 组件的主要功能特点有:
为应用程序提供统一的 POSIX 文件和目录操作接口:read、write、poll/select 等。
支持多种类型的文件系统,如 FatFS、RomFS、DevFS 等,并提供普通文件、设备文件、网络文件描述符的管理。这里默认开启FatFS.
支持多种类型的存储设备,如 SD Card、SPI Flash、Nand Flash 等。
在 RT-Thread 中,我们要访问存储设备中的文件,必须将文件所在的分区挂载到一个已存在的路径上,然后通过这个路径来访问存储设备。在应用程序文件夹下可找到mnt.c源程序。可以看到挂载文件系统的代码如下所示。
上图通过自动化初始化代码实现文件系统挂载。挂载成功dfs_mount函数返回0.通过调试串口可以看到打印信息。Mount "/dev/sd0" on "/":0 done,说明SD NAND挂载成功。
读写文件测试:文件系统正常工作后,就可以运行应用示例,在该示例代码中,首先会使用 open() 函数创建一个文件 text.txt,并使用 write() 函数在文件中写入字符串 “RT-Thread Programmer!\n”,然后关闭文件。再次使用 open() 函数打开 text.txt 文件,读出其中的内容并打印出来,最后关闭该文件。
测试结果:在调试中断输入msh 命令readwrite_sample,即可运行案例。可以看到成功创建了文本,并写入了数据。
STM32驱动下载链接:https://pan.baidu.com/s/1t9Bd3YUNtQmgpyQbmOIMEA?pwd=8051
提取码:8051
随着科技的不断发展,越来越多的智能化教育工具进入人们的视野。在这篇文章中,我们将详细介绍一款专为英语学习打造的得力助手——外研通点读笔VT-6C。这款点读笔以其优秀的性能、独特的特点和诸多优势,广受家长和孩子的喜爱。
性能:高效、实用的英语学习伙伴
外观设计:外研通点读笔VT-6C采用简约时尚的外观设计,笔身线条流畅,轻巧便携。孩子在使用过程中能轻松掌握,长时间握持也不会感到疲劳。
硬件配置:这款点读笔内置高速CPU和大容量内存,运行稳定,读取速度快。它还配备了高清保真喇叭,音质清晰,给孩子带来沉浸式的听读体验。
软件功能:外研通点读笔VT-6C支持多种文件格式,如MP3、MP4、TXT等,可实现多元化学习。此外,它还支持多语种发音,帮助孩子轻松学习多国语言。
特点:智能化、学习功能强大
智能化:外研通点读笔VT-6C融入了智能语音识别技术,可以实现即问即答。当孩子对某个单词或句子有疑问时,只需轻轻一点,点读笔即可实时解答,方便快捷。
学习功能:这款点读笔内置丰富的学习资源,包括各种原版英文绘本、听力练习、情景对话等,可以全面提升孩子的英语能力。
保护视力:外研通点读笔VT-6C采用绿色环保无辐射的电子墨水屏,对孩子的视力损伤最小,可以让孩子放心使用。
使用便利性:这款点读笔采用一键式操作,即插即用,非常适合孩子自行操作。同时,它还支持在线下载和更新,家长可以轻松为孩子定制学习内容。
优势:卓越的音质、音效,超长电池续航
音质和音效:外研通点读笔VT-6C选用高品质的喇叭和音频处理芯片,确保了发音的清晰度和还原度,带给孩子出色的听读享受。
电池续航:这款点读笔配备了高性能锂电池,续航时间长达8小时,满足孩子一整天的使用需求。
价格:相较于其他品牌的点读笔,外研通点读笔VT-6C的价格更加亲民,性价比较高。
使用案例:助力孩子英语学习的好帮手
学习英语单词:外研通点读笔VT-6C可以准确读取英语单词,帮助孩子学习和记忆。在学习的过程中,还可以进行跟读和听写练习,提高孩子的听说能力。
提高听力水平:通过使用这款点读笔,孩子可以接触到各种原汁原味的英语音频资源,包括经典童话、科普知识等。这不仅有助于提高孩子的听力水平,还能拓展他们的视野。
阅读英文书籍:外研通点读笔VT-6C支持多种电子书格式,可以轻松读取各种原版英文书籍。这为孩子提供了丰富的阅读资源,让他们在阅读中不断提高英语阅读能力。
注意事项:合理使用,确保安全
使用时间:虽然外研通点读笔VT-6C对孩子的视力损伤较小,但仍然需要注意控制使用时间,避免用眼过度。建议每次使用时间不超过30分钟,每天使用累计时间不超过2小时。
充电方法:在充电时,应使用原装充电器或指定的充电设备进行充电,以防止意外发生。禁止使用非原装充电器或未经指定的充电设备。
存放注意事项:平时不使用时,应将点读笔放在干燥通风的地方,避免潮湿和高温环境。
总结:孩子英语学习的得力助手
外研通点读笔VT-6C以其优秀的性能、独特的特点和诸多优势,成为了孩子英语学习的得力助手。它不仅外观设计简约时尚,硬件配置高效实用,还拥有强大的学习功能和智能化特性。与其他品牌的点读笔相比,它在音质、音效、电池续航和价格等方面也具有显著优势。
通过使用外研通点读笔VT-6C,孩子们可以更加轻松地学习英语单词、提高听力水平、阅读英文书籍等。同时,家长也可以更加省心地为孩子定制学习内容,帮助他们更好地掌握英语知识。在合理使用的前提下,外研通点读笔VT-6C不仅能帮助孩子们提高英语学习成绩,还对他们的综合语言能力有一定提升。
关于北京君正
北京君正集成电路股份有限公司成立于2005年,基于创始团队创新的CPU设计技术,迅速在消费电子市场实现SoC芯片产业化,2011年5月公司在深圳创业板上市(300223)。
君正在处理器技术、多媒体技术和AI技术等计算技术领域持续投入,其芯片在智能视频监控、AIoT、工业和消费、生物识别及教育电子领域获得了稳健和广阔的市场。
2020年,君正完成对美国ISSI及其下属子品牌Lumissil的收购。ISSI面向汽车、工业和医疗等领域提供高品质、高可靠性的存储器产品,包括SRAM、DRAM、NOR Flash、2D NAND Flash和eMMC,客户遍布全球。Lumissil面向汽车、家电和消费电子等领域提供LED驱动、微处理器、电源管理和互联等芯片产品。
君正将整合其积累十几年的计算技术,及ISSI三十余年的存储、模拟和互联技术,利用公司拥有的完整车规芯片质量和服务体系,为汽车、工业、AIoT等行业的发展持续做出贡献。
亲,如果你在网站上没找到想要的信息可以联系雷龙发展,我们提供原厂技术支持,并提供君正集成电路完整解决方案,大大降低你的开发难度及开发时间。
作者 | 谭文杰
来源 | 3D打印资源库(ID:www-3dzyk-cn)
如果你在一年前开始接触3D打印,并且拥有一台入门级的3D打印机。那么,我相信很大一部分时间你是在给机器打“补丁”,让它真正能为你所用。而这台机器很可能是来自创想三维,不出意外就是其Ender系列的某一款。
然而,现在情况有所不同,你有机会真正享受3D打印的乐趣,而不再是被3D打印机“玩”。2023年4月,创想三维正式推出了新一代旗舰高速3D打印机K1及K1 Max,以巩固其在消费级3D打印市场的领导地位。
我们此前已经对K1进行过测试,然而由于热端和挤出机的设计不佳,它未能达到预期的效果。现在,全新升级的K1 Max在这些硬件方面进行了改进,让它成为了进入高速3D打印世界的可靠入门产品。
K1 Max是一款尺寸更大的Core XY 3D打印机,成型尺寸高达300x300x300mm。与K1一样,这是一台组装好的全封闭3D打印机,其最快打印速度可达600mm/s,加速度更达20000mm/s²。同时,通过自动调平、振动补偿、流量校准等功能,使它具有非常出色的打印质量。
而K1 Max不仅仅是更大,更快,更好而且更智能,它配有AI激光雷达和高清摄像头,可在打印失败时发出警告。除了强大的配置外,最吸引人的还是它的价格,这也是创想三维被称为性价比之王的原因。
创想三维 K1 Max 测评结果
优点:
速度快,质量好
打印尺寸足够大
配置高,价格低
缺点:
高速打印噪音大
换耗材,不顺畅
AI没有达到预期
总体而言,K1 Max是一款非常出色的机器,无论是在打印速度还是模型质量方面都超越了同价位的大部分机器。作为一款面向消费级的入门级3D打印机,K1 Max完全能够满足大多数用户的需求。最为重要的是,它还在不断升级,正在变得更加智能,让普通用户都可以使用。
设备参数:
成型技术:熔融沉积成型(FDM/FFF)
产品尺寸:435 x 462 x 526 mm
打印尺寸:300 x 300 x 300 mm
最大打印速度:600mm/s
打印平台:PEI光面弹簧钢板
喷嘴最高温度:300°C
热床最高温度:100°C
切片软件:Creality Print(支持其他第三方软件)
支持材料:PLA、ABS、PETG、TPU、PA、ASA、PC、PLA-CF、PA-CF、PET-CF
打印方式:U盘打印、局域网打印、创想云打印
操作界面:4.3英寸彩色触摸屏
产品净重:18kg
市场价格:4999元
开箱
K1 Max 3D打印机采用了定制木箱包装,这在很大程度上减少了运输过程中对机器可能造成的损坏。打开箱子后,可以看到里面装有运行3D打印机所需的所有工具和配件。其中包括电源线、料管、一套备用的加热头、触摸屏、减振垫、整卷耗材和配件盒。配件盒内含润滑脂、斜口钳、捅针、U盘、铲刀、固体胶、扳手及螺丝刀等工具。
此外,随机还附带了一本快速指南,根据操作指引,安装触摸屏、料管、前门把手,连接电源线并启动机器。接着,装载耗材,将玻璃顶盖放置在机器上放,拆下固定热床的三颗螺丝,并按照显示屏的开机引导进行下一步操作。
将打印机连接到本地的无线网络,下载创想云手机APP,注册账号并扫码绑定。完成这些步骤后,点击进行设备自检,其中包括关键的振动补偿和自动调平,等待11分钟左右即可开始打印。此外,在随机赠送的U盘中已经存储了切片软件,开箱视频,使用手册等。
设计
框架
K1 Max的机身采用铝合金材质,经过一体压铸与CNC加工制成,表面呈灰色;机器的侧面采用了半透明的黑色亚克力板,而顶部和前面则是透明的黑色玻璃。这样的配色让机器显得非常简约也很耐看。
K1 Max采用了Core XY结构的设计,XY轴方向的电机固定在机身的两侧,同时运动,打印头会更加轻便。Z轴采用的是三组光轴+丝杆的组合,可以有效保证机器在Z方向的稳定运行。这样的设计使得运动更加平稳,即使在高速打印下也能保证很好的打印质量,尤其是适合于大尺寸的3D打印机。
和K1一样,K1 Max同样是采用全封闭式机箱设计,不同之处在于它的顶部是玻璃,而K1则使用亚克力板。当使用常见的PLA材料进行打印时,可以取下顶盖;而在打印ABS等高温材料时,则需要盖上它,这有助于有效减少模型的开裂或翘边等问题。
机器的右侧板安装了一个18W的辅助涡轮散热风扇,通过它对当前打印的层进行吹风,进一步增强模型的冷却效果,可有效减少拉丝和翘曲现象。背面还有一台带有空气滤芯的机箱风扇,不仅可以控制腔体温度,还能减少有害物质排放到空气中,尤其是在打印ABS等工程材料时非常有必要。
挤出与喷头
前面提到了,K1 Max采用了升级后的挤出机与喷头组件,确保打印过程中材料的流动性和均匀性,整体性能得到了显著的改善。其中,近端双齿轮减速挤出机可以更好地控制耗材的挤出和回抽。
不过,在加载耗材时仍会遇到一定的阻力,其中一部分是由于被托链固定弯曲的PTFE管,另一部分是因为需要穿过机箱上的断料检测器。不过,挤出机上方的可拨动开关是一个非常不错的设计,特别是当耗材断在喷头中或者堵塞时,方便进行清理而无需进行复杂的拆卸。
双金属喉管的设计是一个亮点,其上端采用铜合金,下端采用钛合金,能够有效降低堵头的风险。热端使用的是环形陶瓷片,能够在37秒内将温度升至200°C,而最高可承受300°C的硬质合金喷头能够支持大部分材料的打印。
打印平台
K1 Max采用了铝合金热床,导热均匀,通过交流电加热速度也非常快。热床的上方覆盖着一块单面PEI涂层的柔性磁吸面板,可以轻松从机器中拿出来,冷却后,模型甚至可以自行脱落。
这里对比一下K1的面板,你就会发现K1 Max的300x300x300mm成型尺寸是如此之大,足以满足大多数的打印需求。此外,打印平台中还安装了压力传感器,通过与打印头的配合来实现高精度的自动调平,保证首层的打印成功。这样也就不再需要人工通过A4纸去调平热床,何况现在的K1 Max你也找不到原本用于调平的螺丝。
摄像头
K1 Max作为创想三维的一款高配版旗舰3D打印机,在发货时已经内置了高清摄像头,可用于实时监控和延时摄影。这样,即使不在机器旁边,也可以放心进行打印。同时,摄影视频还能自动生成,直接下载后即可方便地分享出去。
同时,当开启AI检查时,K1 Max结合摄像头可以实现异物检测,并在检测到异物时暂停打印并发出警告。在实际测试中,这项功能被证明是可行的。例如,当平台上已有模型或工具时,点击其他打印时,机器会发现并发出警告,这一功能是不错的加分项。不过,官方宣称的“炒面检测”功能应该还在开发中,经测试目前该功能尚未生效。
触摸屏
K1 Max配备了一块4.3英寸的彩色触摸屏,反应灵敏,不会卡顿,界面布局也非常简洁。通过它可以实现人机交互,轻松地移动轴、控制温度和风扇,还可以进行一键进料或退料等操作。
在首次使用时,需要在显示屏中找到设置选项,然后手动开启“首层检测”和“流量校准”。此外,显示屏还能够显示模型的预览,还包括已经打印的时间和剩余的时间。同时腔室温度同样也会直观的显示出来,非常的人性化。
AI激光雷达
最后,我们再来看看固定在打印头左侧的激光雷达。
在使用过程中,AI激光雷达会进行首层检测,通过红外线照射平台结合算法进行分析判断。
当完成模型的首层打印后,机器会暂停,激光雷达会再次扫描模型以确定首层是否打印成功。在这里,我特意把模型拉起伪造成首层“翻车”,机器能够很快的识别出来,并自动暂停打印。
除了首层检测外,激光雷达还被用于流量校准,这样就可以无需像过去那样人工手动打印校准图案,再进行压力补偿的修改。
在细节方面,K1 Max同样进行了多处优化,进一步提升了用户体验和安全性。机器四个脚的减振垫可以减少机器的振动,提高机器运动的稳定性;前门上的把手采用了磁吸设计,轻轻一推,玻璃门就可以有效地粘合到机器上;机器背面还设有装载耗材方向的提示,这对于3D打印新手来说非常有帮助;而机箱风扇上添加的活性炭过滤器能够有效过滤大部分打印时释放的有害物质。
打印
K1 Max支持多种打印方式,包括U盘打印,局域网打印还有创想云打印。在实际的测试中,经常使用的还是局域网打印,非常的快捷方便。
在机器中自带常见的测试小船Benchy,只需要16分钟就完成了打印,模型的质量也非常不错。但是,我们想测试小船在K1 Max中的极限打印下的表现,因此我们在Creality Print软件中把模型的尺寸放大到了300x155x124mm,设置:0.25层高、2层壁厚、4层顶部和底部、5%的填充、默认速度300mm/s,使用了赠送的白色Hyper PLA耗材。
完成打印用时8小时6分42秒,这样的模型换作是使用之前的机器,可能需要一天以上的时间。Benchy最终打印的效果也没有让我失望,挤出的每一层都非常均匀,曲面打印得也很好,几乎看不到任何振纹。虽然模型很大,但在没有加支撑的情况下,模型顶部的悬垂效果也近乎完美。唯一的不足之处是有一条比较明显的接缝线,这是因为中途耗材用完了,换料导致的,因为在打印它之前,我还打印了下面这样一个一比一的头盔。
这款曼达洛人头盔的尺寸为253x253x266mm,同样是采用了默认的打印速度,其他参数同样按默认,手动添加了少量支撑,最终用时17小时10分钟。值得一提的是,这是一次成功,中途没有出现任何错误,这足以证明机器的稳定性。不过,这里的官方Hyper PLA高速耗材也发挥了作用,能够在如此快的打印速度下保证高强度和平滑的打印效果。
接下来,为了全方位的测试机器,我们更换成了KEXCELLED的绿色ABS K5耗材,按默认速度打印了机器自带的另外一个模型:独立耗材支架。
如上图所示,K1 Max能够很好地应对ABS材料,但请记得在打印时加上顶盖,即使在不涂抹固体胶的情况下也能成功完成打印。为了进一步挑战机器的性能,我们又拿出了双力的高速ABS碳纤维材料进行测试。
最终,整体的效果是几乎完美的。同样是采用了默认的300mm/s的速度进行打印,可以看出来模型细节也很好。但是,在打印的最后还是”翻车“了,机器堵头,最顶部的船烟筒没有打印成功。这可能是因为打印之前,我没有把耗材放入干燥箱所致。虽然失败,但是也可以看出来K1 Max能够打印要求更高的工程材料。不过,如果打印ABS碳纤维,需要在铲除模型时非常小心,因为模型和打印面板的黏附非常牢固,容易损坏面板。
我们再回到Creality Print,这是创想三维基于Cura开源软件进行二次开发的打印软件。该软件在参数配置方面进行了优化,针对不同的材料进行了调整。只需选择所使用的机器和材料,就可以开始打印。此外,它集成了创想云的模型库,方便用户获取模型,同时也支持局域网打印。
除了在电脑端进行操作,同样可以选择手机上的创想云APP进行打印(本次测试用的是极速版),它还支持云切片文件,可以选择之前在注册账号下上传的切片文件进行一键打印。在手机APP上,用户可以进行与在电脑或机器上相同的操作,我们可以根据需要选择适合自己的打印方式。
吐槽
K1 Max是一台合格的高速3D打印机,但是还是有些小问题值得继续优化。
高速打印往往伴随着噪音的增加,主要源于机器的运动和风扇,尤其是机器侧面的辅助风扇。在距离机器1米的测试中,噪音水平为65分贝;盖上顶盖后,噪音减至60分贝,但这仍然是一个让人感到不那么安静的声音。
机器的AI功能在进行异物检测方面表现正常,但在其他方面存在一些问题。例如,在上图中显示的错误报告中,机器本身没有发现问题,但系统却检测到了问题,却没有提供具体的原因提示。此外,甚至在不加载耗材的情况下(即材料穿过断料检测但没有进入挤出机),机器仍能正常打印而没有检测出任何问题而自动暂停。不过,这部分的功能确实还在开发中,当我们在显示屏中手动开启它时有明确提醒。
当中途取消打印时,我发现机器有时候并不会立即停止打印,而是需要打印完当前层才最终停止。对于小模型可能影响不大,但如果是在打印大型模型时可能让人失去耐心,甚至会直接关闭机器以中断打印。
最后一点,还是需要抱怨下耗材加载的问题,当换料的时候,将耗材送入挤出机的过程中存在一些阻力,在这点上还希望能够继续改进。另外,Creality Print软件够用,但还不是足够完美,比如:添加一个分盘打印的功能可能对于3D打印农场主来说是一个刚需。
结论
K1 Max是一台基于Klipper固件的封闭式Core-XY高速3D打印机,非常易于使用。它拥有高配置,包括智能的AI激光雷达和摄像头,能够实现故障检测、首层检测、延时摄影等功能。与其他同类机器相比,如拓竹的P1系列或者X1系列,K1 Max具有更大的成型尺寸。
如果预算有限,可以考虑低配版的K1,它同样是一款出色的机器,相比于此前需要各种调整才能打印出好模型的机器,无论是K1还是K1 Max都是开箱即用,而且打印速度和质量都有非常大的优势。
如果你想要一台替代品,可以考虑价格类似的拓竹P1S Combo。它具有几乎相同的打印速度和可靠的打印质量,并且带有AMS多色换料系统,可以实现四色打印。当然,最近刚推出的ChromaSet多色套件同样可以在K1系列机器上使用,也就是说,颜色的问题已不是绝对的选择壁垒。
当然,如果预算充足,我们也建议你考虑拓竹的X1系列。它的激光雷达可以实现稳定的故障检测,同时选购AMS可以实现多色打印。但这台机器的售价比K1 Max多了足足1000元,而且打印面积更小一点,只有256x256x256mm。不过,拓竹机器的溢价更多体现在它的软件和整体用户体验上,抛开与K1 Max的对比,这个台机器同样值得你考虑。
关于北京君正
北京君正集成电路股份有限公司成立于2005年,基于创始团队创新的CPU设计技术,迅速在消费电子市场实现SoC芯片产业化,2011年5月公司在深圳创业板上市(300223)。
君正在处理器技术、多媒体技术和AI技术等计算技术领域持续投入,其芯片在智能视频监控、AIoT、工业和消费、生物识别及教育电子领域获得了稳健和广阔的市场。
2020年,君正完成对美国ISSI及其下属子品牌Lumissil的收购。ISSI面向汽车、工业和医疗等领域提供高品质、高可靠性的存储器产品,包括SRAM、DRAM、NOR Flash、2D NAND Flash和eMMC,客户遍布全球。Lumissil面向汽车、家电和消费电子等领域提供LED驱动、微处理器、电源管理和互联等芯片产品。
君正将整合其积累十几年的计算技术,及ISSI三十余年的存储、模拟和互联技术,利用公司拥有的完整车规芯片质量和服务体系,为汽车、工业、AIoT等行业的发展持续做出贡献。雷龙发展提供原厂技术支持,并提供君正集成电路完整解决方案。
一、晾衣架的新革命:语音识别技术的应用
语音识别晾衣架,顾名思义,就是通过语音识别技术来控制晾衣架升降和衣物晾晒的智能家居产品。与传统的晾衣架相比,语音识别晾衣架具有以下优点:
方便快捷:用户只需对晾衣架发出指令,如“上升”、“下降”、“烘干”等,晾衣架便会自动完成操作,无需手动干预。
节省时间:晾衣架的自动化操作,避免了传统晾衣架需要用户一个个手动操作的麻烦,大大节省了用户的时间。
智能化管理:语音识别晾衣架还具有定时烘干、衣物重量感知等功能,让你的衣物始终保持干净整洁。
二、语音识别晾衣架的应用场景
家庭生活:只需一句话,晾衣架自动降低到眼前,轻松完成晾衣、消毒等功能。
公寓宿舍:对于人口密集的公寓和宿舍,使用语音识别晾衣架可以极大提高晾衣效率,节省空间和时间。
医院学校:在这些公共场所,语音识别晾衣架的自动化操作可以避免手动晾衣的麻烦,提高效率。
同时我司针对家庭环境特别推出自学功能,该功能可以学习用户的语音代替原有的词条,该功能不仅可以学习普通话还可以学习方言和小语种,极大的方便了说方言的用户,让每个人能都享受到语音识别的便利。
自学习功能是指终端用户可以通过语音输入的方式学习客户词条,来自定义唤醒词和命令词。以灯具为例,设备默认的唤醒词为“你好雷龙”,用户通过语音输入学习了“你好小乐”,则设备可以同时使用“你好雷龙”和“你好小乐”唤醒;设备默认可以通过“降低晾衣架”执行降低的动作,用户通过语音输入学习了“降低”,则可以通过“降低”的说法来执行降低的动作。
三、语音识别晾衣架,让生活更智能
语音识别晾衣架作为智能家居的新成员,凭借其强大的功能和便捷性,正逐渐改变着我们的生活方式。它将传统的晾衣架与现代科技相结合,把人们从繁琐的家务中解放出来,让生活变得更加智能、高效。
通过上述分析,我们可以清楚地看到,语音识别晾衣架不仅具有诸多优点,而且在现代社会中的实际应用也取得了显著的成果。无论是家庭生活还是公共场所,语音识别晾衣架都展示出极大的优势和竞争力。
随着科技的不断发展,我们有理由相信,语音识别晾衣架在未来将更加普及,为我们的生活带来更多便利。让我们期待这一天的到来,一起迈向智能化的未来!
雷龙发展公司致力于为客户提供一站式的离线语音解决方案。我们的服务涵盖了多个领域,包括家电、医疗器械、安防报警、汽车电子、多媒体、通信、电话录音、工业自动化控制、玩具及互动消费类产品等。通过我们的专业知识和经验,我们能够满足各类产品的语音交互需求,让用户享受更加智能、便捷的使用体验。
文章目录
前言
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 接口)。
SD NAND的架构
本文选择的是 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 便宜。
CS SD NAND的优势
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 目录。
LOG目录建立
2. LOG分析
飞机通电,翻滚机身,记录飞机的姿态角。
LOG分析
下载日志,加载到 Mission Planner 软件。选中 ATT 字段中的 Roll 和 Pitch。可以看到曲线跟随飞机姿态变化。
至此,使用 SD NAND 替代 SD 卡,测试飞控 LOG 记录功能完成。
引言:
随着人工智能的飞速发展,离线语音识别技术成为了一项备受瞩目的创新。离线语音识别技术能够将人的语音转化为可理解的文本,无需依赖网络连接,极大地提升了语音识别的便捷性和实用性。
一、什么是离线语音识别
离线语音识别是指在设备本地进行语音信号的识别和转换,而无需依赖互联网连接或云端服务。具体来说,离线语音识别是借助本地的语音识别引擎和算法,在设备上对用户的语音输入进行处理和解析,将语音信号转化为文本或语义结果。
与传统的云端语音识别相比,离线语音识别的工作原理是将语音识别技术算法和模型部署在用户的设备上,通过设备内部的处理能力进行语音信号的分析和识别,而不需要将语音数据上传至云端进行处理。
离线语音识别能够在设备上实现实时的语音识别响应,具有响应速度快、隐私保护好、稳定可靠等优势。它广泛应用于移动设备、智能音箱、嵌入式系统等场景,为用户提供便利的语音输入和交互体验,同时降低了对网络依赖的程度。
二、离线语音识别技术的优势
离线语音识别的优势主要体现在以下几个方面:
1. 隐私保护:离线语音识别在处理过程中不需要将语音数据上传至云端,可以在本地设备上进行处理,有效保护用户的隐私。
2. 实时响应:离线语音识别可以在设备上瞬间完成语音识别,0.2s即可完成识别,不需要依赖网络连接,因此可以实现更快的实时响应速度。
3. 稳定性和可靠性:离线语音识别不受网络状态、带宽以及延迟等因素的影响,可以在各种情况下都提供稳定可靠的识别服务。
4. 节省成本:离线语音识别不需要使用云服务,可以避免云服务的使用费用,降低开发和使用成本。
5. 离线使用:离线语音识别可以在没有网络连接的情况下进行使用,适用于一些特殊场景,如旅行、户外等无法连接网络的环境。
6. 开发周期短:在客户的产品已经完善的情况下,可以快速接入离线语音识别。使用深圳雷龙发展有限公司的推出的LSYT201B模组,最快一天即可根据客户要求完成自定义产品。
雷龙发展公司致力于为客户提供一站式的离线语音解决方案。我们的服务涵盖了多个领域,包括家电、医疗器械、安防报警、汽车电子、多媒体、通信、电话录音、工业自动化控制、玩具及互动消费类产品等。通过我们的专业知识和经验,我们能够满足各类产品的语音交互需求,让用户享受更加智能、便捷的使用体验。
文章目录
前言
传统SD卡和可贴片SD卡
传统SD卡
可贴片SD卡
实际使用
总结
前言
随着目前时代的快速发展,即使是使用MCU的项目上也经常有大数据存储的需求。可以看到经常有小伙伴这样提问:
大家好,请问有没有SD卡芯片,可以直接焊接到PCB板上的。
项目需要保存900M以上字节,nand flash 比较贵。或者有什么便宜的存储芯片提供。谢谢!
传统做法无非如下几种:
用eMMC芯片,和SD接口基本兼容,细节有区别。一般的操作系统能支持。
东芝还是谁有焊接的嵌入式SD模块,贵。
做TF卡的封装,直接上锡人工焊死。
其实还有一种选择就是可贴片SD卡。
传统SD卡和可贴片SD卡
传统SD卡
相对于可贴片SD卡,传统SD卡存在一些劣势,包括:
尺寸和体积:传统SD卡相对较大,尺寸较大,占据更多的空间。这在某些紧凑型设备或嵌入式系统中可能会造成问题,因为可贴片SD卡的尺寸更小,更适合于空间受限的应用。
插拔耐久性:传统SD卡需要频繁插拔使用,这可能会导致卡槽和插口的磨损和腐蚀。长期使用后,可能会出现接触不良、断开连接或读写错误的问题。而可贴片SD卡由于直接焊接在PCB上,没有插拔操作,因此在插拔耐久性方面更有优势。
抗震抗振性能:传统SD卡的连接方式是通过卡槽和插口实现的,这种连接方式对于抗震抗振能力较差。在某些震动频繁的应用场景下,传统SD卡可能会出现连接不稳定或数据丢失的问题。而可贴片SD卡由于直接焊接在PCB上,具有更好的抗震抗振性能。
物理保护:传统SD卡的外部没有额外的保护措施,如防水、防尘等功能。在某些恶劣环境中使用时,传统SD卡可能会受到外界因素的影响,导致数据损坏或设备故障。而一些可贴片SD卡提供了防水、防尘和抗静电等功能,以增加物理保护。
传统SD卡和可贴片SD卡在功能和性能上并没有本质的区别,只是封装形式不同。选择哪种类型的SD卡取决于具体的应用需求和设备限制。对于空间受限、插拔频繁或对抗震抗振性能要求较高的场景,可贴片SD卡可能更适合。而对于一般应用,传统SD卡仍然是一种可靠的存储介质。
可贴片SD卡
可贴片SD卡是一种集成电路封装形式的SD(Secure Digital)存储卡。与传统的SD卡相比,可贴片SD卡采用了更为紧凑的封装形式,使其更适合于嵌入式系统和紧凑型设备的应用。
以下是可贴片SD卡的特点和优势:
封装形式:可贴片SD卡采用了表面贴装技术(Surface Mount Technology,SMT)封装,将SD卡的芯片和连接器集成在一个紧凑的封装中,没有外部插口。这种封装形式使得可贴片SD卡可以直接焊接在PCB(Printed Circuit Board)上,节省空间并提高可靠性。
尺寸小巧:可贴片SD卡的尺寸通常比传统的SD卡更小,因此适用于那些对空间要求严格的设备,如嵌入式系统、便携式设备和小型电子产品等。
抗震抗振动:由于可贴片SD卡直接焊接在PCB上,没有外部插口,因此具有更好的抗震抗振动性能。这使得它更适合于应对恶劣环境和振动频繁的应用场景。
可靠性:可贴片SD卡的焊接连接更牢固,减少了插拔引起的接触不良和断开的风险,提高了存储数据的可靠性和稳定性。
实际使用
前主流的存储芯片大致可以分为NOR Flash和NAND Flash。NOR Flash容量比较小,所以一般项目对于容量有一定要求的话(512M起步),就会用采用NAND Flash。
一般从成本考虑,多会使用裸的NAND FLASH进行贴片。随着也会带来几个问题:
第一,笔者在项目中经常遇到NAND Flash的坏块问题,即使让厂商增加了出厂检测,仍会有较高的不良率,所以必须要进行坏块管理。
第二,不同品牌之间的NAND Flash,由于Page,Block大小不同,时序不同等。都需要嵌入式工程师重新调试驱动,经常遇到替换供应商后重新添加、修改驱动的问题,费时费力。
笔者所在项目需要再NAND FLASH中存储图片 语音数据,经常因为坏块问题需要去工厂解决问题,编写坏块管理,甚至手动编写平均读写算法……非常的麻烦。之前没有了解到国产有非常优秀的贴片式SD卡产品——雷龙。
自带SD转接测试板,方便在demo阶段直接使用SD卡接口测试。
兼容无压力,在电脑上也可以免驱直接读写,非常方便。
SD NAND就是这样一款产品。简单来说它的架构如下图。内部使用寿命最长、性能最稳定的SLC NAND Flash晶圆,擦写次数可以达到10万次。另外,内置了特定的Flash控制器和Firmware,硬件对外采用最为通用的SD接口。
完美兼容了基本所有的项目,尺寸小巧,对于开发板甚至核心板这种对于尺寸要求很高的PCB都可以降低成本!
SD NAND内置坏块管理,平均读写,动态和静态的EDC/ECC算法等等,除了让产品的质量更稳定,更好的延长寿命,更能减少CPU的负荷。让后续针对NAND Flash的操作,都可以交给SD NAND,CPU可以不用再管了。领导再也不用担心我的NAND Flash驱动了。
总结
实际使用下来感觉非常好,推荐大家在项目初期就考虑使用雷龙的NAND FLASH,可以节约大量硬件成本和人工成本。有兴趣的伙伴,可以随时联系雷龙官方客服。
随着科技的不断发展,离线语音识别技术已经变得越来越成熟。在日常生活中,老人或小孩可能会遇到一些困难,如操作复杂的电子设备。为了解决这一问题,离线语音识别模块成为了一个很好的解决方案。
一般情况下,留守老人和小孩说方言比较多,在雷龙离线语音模块 自定义语音的帮助下,老人或小孩不再需要手动操作复杂的电子设备。他们只需对设备用方言说出自己的需求,即可实现设备的控制。这一功能对于老人和小孩来说非常友好,降低了他们使用设备的门槛。
在实际应用中,老人或小孩只需简单地对设备说出自己的需求,即可完成对设备的控制。例如,如果老人想要打开电视机,他只需对遥控器说:“打开电视”,即可完成操作。如果小孩想要听故事,她只需对智能音箱说:“播放故事”,即可开始享受美妙的故事。
以老人使用方言控制智能音箱为例,假设他想要听一段京剧。他只需对智能音箱说:“给我来一段京剧”,音箱就会开始播放他喜欢的京剧。如果小孩想要通过语音控制智能灯的亮度,她只需说:“把灯调暗一点”,智能灯就会自动调整亮度。
离线语音模块的工作原理与在线语音识别技术有所不同。离线语音模块主要依靠本地语音识别算法进行语音识别,无需联网即可实现语音控制。相比之下,在线语音识别技术需要将语音数据传输到云端进行处理,然后返回识别结果,这种方法需要网络连接且可能涉及隐私安全问题。
在离线语音模块的应用过程中,建议为老人或小孩选择合适的设备。选择的设备应该具有语音识别功能且支持方言识别,以确保他们能够顺利地控制设备。此外,为了让老人或小孩更快地上手操作,可以提供简单的操作指南或者语音引导。
总之,离线语音模块为老人或小孩使用方言控制设备提供了便利。这一技术可以帮助他们更加轻松地操作各种电子设备,从而提高了他们的生活质量。通过离线语音模块的应用,我们可以实现更加智能化的生活,让科技更加贴近我们的日常。
雷龙发展公司致力于为客户提供一站式的离线语音解决方案。我们的服务涵盖了多个领域,包括家电、医疗器械、安防报警、汽车电子、多媒体、通信、电话录音、工业自动化控制、玩具及互动消费类产品等。通过我们的专业知识和经验,我们能够满足各类产品的语音交互需求,让用户享受更加智能、便捷的使用体验。
凯迪仕在今年4月发布了智能锁旗舰新品K70 Pro Max掌静脉3D人脸猫眼视屏智能锁,随即这款新品也成了行业热议的焦点。凯迪仕每次新品都力求突破精益求精,不仅追求科技感、高级感与品质感,而且赋予科技温度,带来人文化的关怀。K70 Pro Max实现多项行业首创,是凯迪仕至今为止功能最为丰富和强大的一款智能锁新品,是当之无愧的“十全十美”。
K70 Pro Max打造了行业首创的2.5D盘古玻璃全面屏,采用精铸锌合金,AF纳米材料镀膜工艺,自研全自动锁体支持关门即可自动上锁,内部齿轮转动声音几乎听不到。K70 Pro Max还创新使用大小双屏设计,其中4.7英寸室内屏拥有750*1334分辨率,1.3英寸室外屏拥有240*240分辨率,房门内外一目了然,真正实现了“掌中有乾坤”。
据了解,K70ProMax创新加入了掌静脉识别,兼具3D人脸识别功能,无需接触即可解锁进门,安全便捷。加上3K超高清可视猫眼,165°超大广角,搭配室内4.7英寸升级彩屏,让家庭每一位成员享受到智能安防带来的安心。
除了采用运算更快、功耗更低的全新四核ARM Cortex-M4处理器,支持腾讯云loT-Video技术和WiFi长连接技术,K70 Pro Max还拥有业内过硬的质量标准。在凯迪仕综合实验室,K70 Pro Max经历了20万次机械寿命测试,8000N面板强度测试,96小时凝露测试,120小时耐盐雾测试,≥30min防暴力开启测试,﹣20~60℃工作温度测试,每一件都是匠心打造的科技美学巅峰之作。
作为凯迪仕2023年的旗舰新品,这款智能锁行业首创车规级24GHz雷达,行业首创更可靠的胁迫报警,实现视频录制上报+电话+短信通知,三重示警,家门安全尽在掌握;行业首创抽屉式电池仓设计,11000mAh超大容量锂电池,持久续航,24h守护在线。
K70 Pro Max拥有八大解锁方式:掌静脉、3D人脸识别、指纹、密码、CPU卡、临时密码、双重验证、钥匙,可以满足不同群体的解锁方式喜好与需求。其中,充满科技感与新奇体验的无接触掌静脉解锁方式,利用藏在掌内的静脉作为独特密钥,近红外线精准识别匹配,挥手即可开启解锁新Style,再加上全新3D人脸识别算法,搭配仿生夜视摄像头,不论日常妆容造型,还是各种光线环境,都能精准识别。
作为家庭智慧安防的第一道防线,K70 Pro Max还拥有强大的危险预警功能,24GHz雷达可实现精准轨迹侦测,以及拥有165°广角且3K分辨率的超高清摄像头,可将室外人员逗留视频抓拍进行云端存证,并通过智能APP实时推送。当有访客按响门铃,K70 Pro Max还支持微信小程序强提醒,不论在家与否,均可点击消息预览门外画面,实现远程可视对讲。
凯迪仕这款锁老少皆宜,使用门槛非常低。凯迪仕在开门这个细节上做到了极大的安全性、便捷性和易用性。凯迪仕把产品安全性和易用性刻入品牌基因,难怪其获得市场和行业的认可,成为杭州亚运会官方指定智能门锁。
凯迪仕专注在智能锁领域这么多年,始终坚持以品质为根本,以服务为保障,为消费者带来了多款经典智能锁爆款,全方位守护消费者家门安全。功能如此强大,真是满满的期待住了,近期有在看智能锁的朋友们可以锁定凯迪仕K70 Pro Max,锁定智享生活。
文章来源:汉王科技服务
关于北京君正
北京君正集成电路股份有限公司成立于2005年,基于创始团队创新的CPU设计技术,迅速在消费电子市场实现SoC芯片产业化,2011年5月公司在深圳创业板上市(300223)。
君正在处理器技术、多媒体技术和AI技术等计算技术领域持续投入,其芯片在智能视频监控、AIoT、工业和消费、生物识别及教育电子领域获得了稳健和广阔的市场。
2020年,君正完成对美国ISSI及其下属子品牌Lumissil的收购。ISSI面向汽车、工业和医疗等领域提供高品质、高可靠性的存储器产品,包括SRAM、DRAM、NOR Flash、2D NAND Flash和eMMC,客户遍布全球。Lumissil面向汽车、家电和消费电子等领域提供LED驱动、微处理器、电源管理和互联等芯片产品。
君正将整合其积累十几年的计算技术,及ISSI三十余年的存储、模拟和互联技术,利用公司拥有的完整车规芯片质量和服务体系,为汽车、工业、AIoT等行业的发展持续做出贡献。
亲,如果你在网站上没找到想要的信息可以联系我们,雷龙发展提供原厂技术支持,并提供君正集成电路完整解决方案。
前言:
很感谢深圳雷龙发展有限公司为博主提供的两片SD NAND的存储芯片,在这里博主记录一下自己的使用过程以及部分设计。
深入了解该产品:
拿到这个产品之后,我大致了解了下两款芯片的性能。CSNP4GCR01-AMW是一种基于NAND闪存和SD控制器的4Gb密度嵌入式存储;而CSNP32GCR01-AOW是一种基于NAND闪存和SD控制器的32Gb密度嵌入式存储。与原始NAND相比其具有嵌入式坏块管理和更强的嵌入式ECC。即使在异常断电,它仍然可以安全地保存数据。作为一个存储芯片,它确实做到了小巧,LGA-8的封装对比我之前用到过的TF卡,只占到了其面积的三分之一,这样对于一些嵌入式的设计就方便了很多。
雷龙官方还很贴心的提供了样品的测试板,在这款测试板上,我焊接了4GB的CSNP4GCR01-AMW上去,并且跑了一下分,对于一款小的存储芯片而言,实在难得。
(上图为测试板焊接图)
博主日前在设计基于H616与NB-IOT的嵌入式智能储物柜的时候考虑过存储方面的问题,当时在SD NAND和EMMC与TF卡中徘徊,以下是几个存储类型的对比。
经过多方对比,本着不需要频繁更换的原则,同时也为了更好的防水和成本考虑,最终决定使用雷龙公司的SD NAND 作为设计样品的存储部分。
此外,SD NAND还具有不用写驱动程序自带坏块管理的NAND FLASH(贴片式TF卡),不标准的SDIO接口,也同时兼容SPI/SD接口,10万次的SLC晶圆擦写寿命,通过一万次的随机掉电测试耐高低温,经过跑分测得,速度级别Class10。标准的SD2.0协议,普通的SD卡可以直接驱动,支持TF卡启动的SOC都可以用SD NAND,而且雷龙官方还贴心的提供了STM32参考例程和原厂技术支持,这对于刚上手的小白而言,十分友好。
设计理念:
使用H616作为主控CPU并搭配NB-IOT来向申请下来的云端传输数据,当WIFI正常时,储物数据每搁两小时向云端传输一次,当有人取出物品时再次向云端发送一次数据(不保留在SD NAND中);一旦系统检测到WIFI出现问题,储物数据转而存储到SD NAND中,取物时输入的物品ID和取出时间一并放入SD NAND中(我也是看中了SD NAND与原始NAND相比其具有嵌入式坏块管理和更强的嵌入式ECC。即使在异常断电,它仍然可以安全地保存数据这一点)。
部分SD NAND的参考设计
根据官方数据手册提供的SD NAND参考设计,只占用8个GPIO,对于H616来说,确实很友好
这里为了不泄露他人的劳动成果,我也就不粘PCB设计了。
采用H616驱动SD NAND的示例代码
下面是关于H616驱动SD NAND的示例代码,这里记录一下自己当初的学习过程(注:这个代码不能直接拿过来就用,而是要根据自己的需求修改)
#include
#include
#include
#include
#include "h616_sdio.h"
// 定义SDIO引脚
#define SDIO_CMD_PIN 0
#define SDIO_CLK_PIN 1
#define SDIO_D0_PIN 2
#define SDIO_D1_PIN 3
#define SDIO_D2_PIN 4
#define SDIO_D3_PIN 5
// 定义NAND芯片命令
#define CMD_READ 0x00
#define CMD_WRITE 0x80
#define CMD_ERASE 0x60
#define CMD_STATUS 0x70
#define CMD_RESET 0xff
// 定义NAND芯片状态
#define STATUS_READY 0x40
#define STATUS_ERROR 0x01
// 初始化SDIO控制器
void sdio_init()
{
// 设置SDIO引脚模式和速率
h616_sdio_set_pin_mode(SDIO_CMD_PIN, H616_SDIO_PIN_MODE_SDIO);
h616_sdio_set_pin_mode(SDIO_CLK_PIN, H616_SDIO_PIN_MODE_SDIO);
h616_sdio_set_pin_mode(SDIO_D0_PIN, H616_SDIO_PIN_MODE_SDIO);
h616_sdio_set_pin_mode(SDIO_D1_PIN, H616_SDIO_PIN_MODE_SDIO);
h616_sdio_set_pin_mode(SDIO_D2_PIN, H616_SDIO_PIN_MODE_SDIO);
h616_sdio_set_pin_mode(SDIO_D3_PIN, H616_SDIO_PIN_MODE_SDIO);
h616_sdio_set_clock(H616_SDIO_CLOCK_FREQ_25MHZ);
// 初始化SDIO控制器
h616_sdio_init();
}
// 发送NAND芯片命令
void nand_send_cmd(uint8_t cmd)
{
// 设置SDIO控制器传输模式和命令码
h616_sdio_set_transfer_mode(H616_SDIO_TRANSFER_MODE_WRITE);
h616_sdio_set_command_code(cmd);
// 发送命令
h616_sdio_send_command();
}
// 发送NAND芯片地址
void nand_send_addr(uint32_t addr)
{
// 设置SDIO控制器传输模式和地址
h616_sdio_set_transfer_mode(H616_SDIO_TRANSFER_MODE_WRITE);
h616_sdio_set_address(addr);
// 发送地址
h616_sdio_send_address();
}
// 读取NAND芯片数据
void nand_read_data(uint8_t *data, uint32_t size)
{
// 设置SDIO控制器传输模式
h616_sdio_set_transfer_mode(H616_SDIO_TRANSFER_MODE_READ);
// 读取数据
h616_sdio_read_data(data, size);
}
// 写入NAND芯片数据
void nand_write_data(const uint8_t *data, uint32_t size)
{
// 设置SDIO控制器传输模式
h616_sdio_set_transfer_mode(H616_SDIO_TRANSFER_MODE_WRITE);
// 写入数据
h616_sdio_write_data(data, size);
}
// 读取NAND芯片状态
uint8_t nand_read_status()
{
uint8_t status;
// 发送读取状态命令
nand_send_cmd(CMD_STATUS);
// 读取状态
nand_read_data(&status, 1);
return status;
}
// 等待NAND芯片准备就绪
void nand_wait_ready()
{
uint8_t status;
// 循环读取状态,直到NAND芯片准备就绪
do {
status = nand_read_status();
} while ((status & STATUS_READY) == 0);
}
// 读取NAND芯片数据
void nand_read(uint32_t page, uint32_t column, uint8_t *data, uint32_t size)
{
// 发送读取命令和地址
nand_send_cmd(CMD_READ);
nand_send_addr(column | (page << 8));
// 等待NAND芯片准备就绪
nand_wait_ready();
// 读取数据
nand_read_data(data, size);
}
// 写入NAND芯片数据
void nand_write(uint32_t page, uint32_t column, const uint8_t *data, uint32_t size)
{
// 发送写入命令和地址
nand_send_cmd(CMD_WRITE);
nand_send_addr(column | (page << 8));
// 写入数据
nand_write_data(data, size);
// 等待NAND芯片准备就绪
nand_wait_ready();
}
// 擦除NAND芯片块
void nand_erase(uint32_t block)
{
// 发送擦除命令和地址
nand_send_cmd(CMD_ERASE);
nand_send_addr(block << 8);
// 等待NAND芯片准备就绪
nand_wait_ready();
}
// 复位NAND芯片
void nand_reset()
{
// 发送复位命令
nand_send_cmd(CMD_RESET);
// 等待NAND芯片准备就绪
nand_wait_ready();
}
// 示例程序入口
int main()
{
uint8_t data[2048];
memset(data, 0x5a, sizeof(data));
// 初始化SDIO控制器
sdio_init();
// 复位NAND芯片
nand_reset();
// 擦除第0块
nand_erase(0);
// 写入第0页
nand_write(0, 0, data, sizeof(data));
// 读取第0页
nand_read(0, 0, data, sizeof(data));
return 0;
}
伴随下游应用持续丰富,细节需求不断增多,标准化产品已越来越难以满足市场需求,芯片方案提供商需要不断深入行业,根据市场需求推出适配的产品。在这样的背景下,北京君正迅速推出X2600系列多核异构跨界处理器,并于2023年ELEXCON深圳国际电子展上正式推向市场。
北京君正X2600系列处理器结构图
据介绍,X2600系列处理器采用了北京君正自研的CPU内核、图像/视频处理、2D处理引擎和打印机控制等关键技术,同时承袭了北京君正特有的功耗低、开发门槛低等技术特点,适用于各类消费、商业和工业的嵌入式应用领域。
多核异构,按需优化
北京君正X2600系列处理器采用多核异构架构,内置有3大核心处理器,其中XBurst®2逻辑双核为主控芯片,采用MIPS架构,主频达1.2GHz,采用北京君正的最新一代技术,内置128位SIMD指令、硬件浮点运算单元以及内存管理单元,主要支持系统管理和复杂计算,同时自带轻量化AI算法,在满足主控应用的同时,为各类场景提供智能加持。
其次是专注运用控制的Victory®0 CPU内核,采用自主研发的RISC-V内核,主频达600MHz,兼容MIPS架构,支持访问片内DRAM、程序和数据空间,并提供有JTAG调试接口,用于替代独立MCU,与传统的独立控制方案相比,集成Victory®0 CPU内核的X2600系列芯片响应速度快,实时控制性能更突出。
另一个核心内核为XBurst®0,采用自主研发的RISC-V CPU内核,主要用于安全系统管理,内置随机数发生器,支持AES-256 / MD5 / SHA / SHA2等加密算法,适配高安全等级场景应用开发。
基于X2600处理器的Halley 7开发板
在三大核心控制器基础上,X2600系列处理器还支持内置64MB~512MB的DRAM,并提供有eMMC/SD/SDIO接口,北京君正副总经理刘将表示,“该处理器硬件上做到了Pin 2 Pin,兼容性更好。”
刘将继续介绍,“目前行业与此前主要打造标准品不同,会有很多的细分需求,未来还会有越来越多的智能化设备,怎么去满足越来越多的细分需求,又怎么去满足智能化设备的互联互通?这是君正推出X2600系列处理器的重要原因,该系列处理器的首要特点就是多核,其次采用的是异构架构,第三是跨界应用,对满足新需求和新痛点有着非常大的潜力和空间。”
据了解,北京君正通过将各个领域的细分需求拆解,从而分解出共通点,再针对性开发出解决方案,并集成于X2600系列处理器中;同时,针对更细分的应用,X2600系列处理器还提供有丰富的型号可选,从而实现为不同需求匹配最优解决方案。
外设丰富,兼容性强
除了强大的主控架构设计,外设接口丰富也是X2600系列处理器的一大特色。
解码方面,X2600系列处理器支持H.264解码、JPEG编解码方式,最大解码分辨率均达1080P@60fps,可通过DVP接口外接640×480分辨率摄像头,通过内置的2D GPU控制器,可实现对图像进行旋转、缩放、剪切、色彩转换等应用。
显示方面,通过内置Rotator功能,可实现屏显旋转,同时提供有MIPI-DSI、LVDS、RGB、SLCD、SPI等屏显接口,支持1080P@60fps图像解码输出,便于开发者基于LVGL、AWTK、QT、OpenHarmony、HaaS等开发个性化UI屏显系统。
音频方面,处理器也提供有I2S、DMIC接口,并内置Audio CODEC编解码器,很好满足语音输入、输出处理及控制。
更多的接口集成于Victory®0 CPU内核实时控制区,提供有GPIO、I2C×4、PWM(16路)、A/D转换器(16通路)、SPI(Master×2,Slave×1)、UART、USB2.0、百兆网口以及CAN总线等通讯接口,极大方便外设应用开发;结合Victory®0 CPU内核高度融合的运动控制,让机械操控应用更得心应手。
针对打印机场景,X2600系列处理器还提供有打印机控制器(如X2670系列),内置1个热敏打印头控制单元,以及1个8路或2个4路步进精进电机控制单元,实现对机械部件的高效、精准运动控制,并覆盖热敏打印机、喷墨打印机、激光打印机、3D打印机、扫描/复印/激光一体机等应用场景。
值得一提的是,通过集成丰富的外部接口,开发者将极大节省外围开关器件用料,进而实现降本增效,这对产品集成度越来越高、成本控制越来越严苛的下游方案商来说,X2600系列处理器极具吸引力。
极简开发,性价比高
X2600系列处理器同时继承了北京君正低功耗、高稳定性的技术特点。据刘将介绍,典型功耗可以做到0.5W以内,应对功耗敏感场景无压力,稳定性方面,“我们这款产品采用工规级设计,支持-40℃~85℃工作温度,推出参考设计之前,我们都会通过原型机高低温压力测试,确保产品长期稳定、可靠性运行。”
而其多核、异构、跨界特性,也将给开发者带来实实在在的降本增效体验。
X2600系列处理器兼具应用处理器(Application Processor)的计算性能和微控制器(Micro Controller Unit)的易用性、低功耗与实时操作特性,打破了MCU和AP之间的技术鸿沟,大幅降低了产品开发难度。
以3D打印场景为例,传统方案需要两颗处理器分别处理数据和运动控制,而采用X2670系列处理器,一款产品就可以替代原有方案的各项功能开发需求,其中,主处理器负责显示、交互、联网等应用,Victory®0 CPU则专注运动控制,大幅降低了开发难度,而且产品的稳定性、可靠性也随之提升。
3D打印是X2600系列处理器应用场景之一
北京君正同时为X2600系列处理器提供有Halley 7开发工具包,具体包括Halley 7开发板参考设计、Linux kernel 4.4.94和5.10、OpenHarmony、U-Boot资源包、Buildroot和第三方函数库、编译工具链、USB Flash烧录工具等,极大方便下游客户的应用开发。
“我们的某3D打印客户只需要2个月就可以将原有方案功能平移到X2600系列处理器上,接下来再对产品进行APP、云端应用以及业务逻辑完善开发,产品就可以进入量产进程,整个周期大概6个月。”刘将继续举例说明道,“如果是后续产品迭代,只需要3个月就可以实现产品量产,整个开发周期再缩短一半。”
事实上,基于其高性能、低功耗、实时控制的突出特点,X2600系列处理器不仅适用于商业打印机领域,在智能商业显示、扫地机器人、工业机器人、智能家居、工业控制等领域也有广泛的应用潜力,“该产品已经开始应用,合作客户的满意度非常高,除了原来的合作伙伴,这款产品也获得了越来越多来自新领域合作伙伴的认可。”刘将如是介绍。
关于北京君正
北京君正集成电路股份有限公司成立于2005年,基于创始团队创新的CPU设计技术,迅速在消费电子市场实现SoC芯片产业化,2011年5月公司在深圳创业板上市。
君正在处理器技术、多媒体技术和AI技术等计算技术领域持续投入,其芯片在智能视频监控、AIoT、工业和消费、生物识别及教育电子领域获得了稳健和广阔的市场。
2020年,君正完成对美国ISSI及其下属子品牌Lumissil的收购。ISSI面向汽车、工业和医疗等领域提供高品质、高可靠性的存储器产品,包括SRAM、DRAM、NOR Flash、2D NAND Flash和eMMC,客户遍布全球。Lumissil面向汽车、家电和消费电子等领域提供LED驱动、微处理器、电源管理和互联等芯片产品。
君正将整合其积累十几年的计算技术,及ISSI三十余年的存储、模拟和互联技术,利用公司拥有的完整车规芯片质量和服务体系,为汽车、工业、AIoT等行业的发展持续做出贡献。
亲,如果你在网站上没找到想要的信息可以联系我们,深圳市雷龙发展提供原厂技术支持,并提供君正集成电路完整解决方案
引言
离线语音识别是指在没有网络连接的情况下,通过在本地设备上进行语音信号处理和识别,实现语音命令的转化和执行。随着智能设备的普及,离线语音识别技术在智能客服、电话会议、智能交通等领域的应用越来越广泛。本文将深入探讨离线语音识别的工作原理,以及其所使用的技术。
一、离线语音识别的工作原理
离线语音识别的工作原理包括信号采集、预处理、特征提取和匹配等步骤。下面我们逐一详细介绍这些步骤:
1.信号采集
离线语音识别系统的第一步是信号采集。声音信号通过麦克风(传感器)以电信号的形式被捕捉到,这是后续处理的基础。
2.预处理
预处理阶段包括去除噪声、回声消除、降噪等处理,以提高语音信号的质量。同时,进行采样和量化,将连续的模拟信号转换为离散的数字信号。主要通过DSP来处理,雷龙语音模块内置DSP芯片,可以做各种卷积和数字滤波处理。大幅提高语音质量。
3.特征提取
在特征提取阶段,将语音信号转化为具有代表性的特征向量。这些特征向量能够捕捉到语音信号中的关键信息,如音调、音色和音节等。特征信息也是需要通过算法来提取,也需要大量的计算能力。
4.匹配
在匹配阶段,将提取的特征向量与预定义的词典中的词进行匹配。最常用的匹配算法是动态时间规整(DTW),它能有效地解决语音信号的时间扭曲问题。
二、离线语音识别使用的技术
离线语音识别主要使用深度学习、卷积神经网络(CNN)和循环神经网络(RNN)等技术。这些技术能够在本地设备上实现高效运算,使得离线语音识别成为可能。
1.深度学习
深度学习在语音识别领域具有广泛的应用。其中,循环神经网络(RNN)和卷积神经网络(CNN)是最常用的两种技术。RNN 适用于处理时间序列数据,如语音信号,而 CNN 则适用于处理具有网格结构的数据,如图像。通过深度学习技术,可以有效地提高语音识别的准确率和鲁棒性。
2.卷积神经网络(CNN)
CNN 是针对网格结构数据的处理而设计的。在语音识别领域,CNN 主要用于处理语音信号的短时傅里叶变换(STFT)后的频谱图。通过卷积层、池化层和全连接层等基本结构的组合使用,CNN 能够有效地捕捉语音信号的局部特征。
3.循环神经网络(RNN)
RNN 是专门为处理时间序列数据而设计的神经网络。在语音识别领域,RNN 主要用于处理语音信号的时间序列数据。通过将相邻时间步长的特征向量串联起来,RNN 能够捕捉到语音信号的长时依赖关系。同时,通过使用 LSTM(长短时记忆)或 GRU(门控循环单元)等变体,可以进一步提高 RNN 的性能。
三、离线语音识别的优势和应用场景
离线语音识别具有数据安全性高、实时性好等优点。此外,由于无需联网,离线语音识别在处理低延迟、高可靠性的场景时具有很大的优势。下面我们通过与传统语音识别方法的比较,说明离线语音识别的特点和作用:
与传统语音识别方法相比,离线语音识别无需联网,因此可以避免由于网络延迟或不稳定导致的问题。同时,离线语音识别可以更好地保护用户隐私,避免因联网而产生的数据泄露风险。在某些需要高可靠性的应用场景,如智能客服、电话会议和智能交通等,离线语音识别能够发挥重要作用。
雷龙发展公司致力于为客户提供一站式的离线语音解决方案。我们的服务涵盖了多个领域,包括家电、医疗器械、安防报警、汽车电子、多媒体、通信、电话录音、工业自动化控制、玩具及互动消费类产品等。通过我们的专业知识和经验,我们能够满足各类产品的语音交互需求,让用户享受更加智能、便捷的使用体验。
一.使用场景
夏天某个凉爽的早晨,当你躺在床上玩着手机,突然一阵困意袭来,原来已经中午了,此时你一个侧身准备休息,突然发现一阵酷热袭来,你定睛一看,原来是风扇没有打开,这个睡姿很舒服你又不想起床怎么办?此时如果你有一个智能语音风扇,你只需要说一句打开风扇即可。关于语音识别这个功能,市面上有多家公司开发有关离线识别的芯片和算法,可是识别效果不是很理想,但是思必驰是例外,该公司的芯片唤醒率和识别率均高于市场同行,抗噪音的能力也非常优秀。
二.思必驰芯片简介
本文主要介绍思必驰股份有限公司推出的一款离线语音识别芯片。该芯片是根据智能语音交互市场需求及思必驰算法的发展方向定义开发的“芯片+算法”人工智能人机语音交互解决方案,具有高性能、低功耗、低成本、高识别率、低误触发率、远距离唤醒、更强的抗噪能力、更快的响应时间、项目快速落地等优秀的特点。
该芯片通过软硬融合的方法,具备快速赋予各类设备语音交互的能力,赋予设备“听”和“说”的能力,从用户说出命令到执行命令只需要0.2-0.6秒的时间,极大的提高了用户体验和产品灵活性。
三.产品特色
2.词条自定义
思必驰的智云译芯平台,可以让客户自定义属于自己的词条,还可以配置不同情况下MUC的动作,不需要懂编程即可完成配置。同时平台提供10种音色供客户选择。
3.产品品类
已落地多种品类的项目。如:遥控器、空调伴侣、取暖桌、油烟机、茶吧机、集成灶、晾衣架、按摩椅、风扇、灯具、净水器、热水器等等项目。只有你想不到,没有我们做不到。
4.处理器
●32位处理器,支持FPU
●运行频率:240MHZ
●内置2MB Flash
5.外设
该芯片有丰富的外设,有13个IO供客户二次开发使用,可以替代大部分市面上的MCU,为客户节省成本,替换MCU的同时,增加了语音识别功能。
该芯片具有丰富的外设,USB1.1,4个16位定时器,三个16位PWM发生器,三个全双工串口,两个SPI接口,一个IIC接口,内置触摸按键控制器,10位ADC模拟器,所有GPIO支持外部中断/唤醒。
6.蓝牙
支持蓝牙V5.3+BR+EDR+BLE规范,发射功率+6dB,接收器最小灵敏度-90dB。可以制作配套小程序。
外部电路简单,如果客户不需要播报应答语,还可以省一个功放。
四、思必驰的优势
在上诉介绍中可以看到,思必驰的识别效果更好,价格美丽。一定情况下还可以替换MCU。
随着智能家居市场扩大和消费者需求增加,深圳雷龙发展专注于行业语音交互器件标准化,致力于简化复杂事物,提供快捷的语音、智能物联网应用解决方案。我们的产品价格便宜、实用简单,适合中小型批量生产,小数量生产也可及时拿货,满足大多数用户的产品使用需求。质量有保障,提供免费技术服务、免费打样。同时,为减少客户测试时间,我们还提供功放模块。
2023春季新品发布会上汉王科技发布柯氏音法电子血压计产品—汉王电子血压计,继嗅觉检测盒之后再次深度布局大健康领域。
不同于当前市面上使用示波法原理的电子血压计,汉王电子血压计采用血压测量金标准中的柯氏音法,由此引领一场电子血压计领域颠覆式革命,开启电子血压计的医用级准确测量全新时代。
柯氏音医用级准确 电子测量方便环保
柯氏音法也叫听诊法,在国际上被称为无创血压测量的“金标准”,使用柯氏音法的水银血压计虽然被医疗机构广泛使用,但测量过程复杂且需要专业医生进行听诊并记录,因此难以推广家用。现实生活中,大多数消费者选择了测量方便的示波法原理电子血压计,但此类血压计检测结果远不及柯氏音水银血压计准确。
此次上市的汉王电子血压计在电子血压计中采用柯氏音法,不仅拥有传统水银血压计的医用级准确性,同时使用非常便捷,贴合手臂的扇形袖带,单手即可操作,一键轻松开启测量,在承袭电子血压计便捷性的同时较其在精准度上更上一个台阶,可谓结合了水银血压计的医用级准确和电子血压计测量便捷性的两家之长。
此外,由于水银泄漏的危害性极大,根据《水俣公约》,自2026年1月1日起,我国将全面禁止生产含汞体温计和含汞血压计产品,未来我们将彻底告别含汞血压计产品。汉王电子血压计的上市,替代了当前的柯氏音水银血压计,让日常的血压测量轻松准确的同时又能保护环境,让生活更加美好。
超性能CPU双传感器 血压测得准测得全
汉王电子血压计,采用双传感器模式,让采集到的血压信号更加优质。搭载GHz级的CPU,1.2G的主频以超出同类产品数倍的性能,为汉王自研深度学习神经网络算法提供优越的硬件支持,可对测量结果进行深度优化,在柯氏音法的基础之上让血压检测结果更加准确。
不仅血压测得准,汉王电子血压计更是测得全。测血压时,部分有房颤或者心律不齐等问题的病人在使用传统电子血压计时测量结果会有一定偏差,而汉王电子血压计则有效解决了这一问题,其适用范围全面广泛,在房颤、心律不齐、低血压等多种症状下,或者是孕妇等特殊人群,均可准确测量血压,同时搭配便捷的操作体验,一键即可开启测量,在家也能准确测血压。
物联网传输更便捷 家人关怀就在身边
汉王电子血压计采用物联网传输方式,内置NB模块,无需蓝牙WiFi也可连接。数据自动上传应用程序,仅需使用手机扫描机身条形码或填写设备编号,即可在应用程序中绑定血压计设备。
相比于蓝牙或WiFi连接方式,物联网传输方式的操作更为简便,稳定性更强。完成血压测量后,数据会自动同步上传,进行数据智能分析,从而可随时随地了解家人健康状况,即使不在身边也能让家人感受到暖心的关怀。
汉王电子血压计拥有8MB内存,比当前市面主流电子血压计产品具备更大的存储空间,同时还支持双人模式,可以分组记录,本机自动存储最近测量的400组数据,对比两人血压数据,表达双份关怀。
此外,汉王电子血压计还可以分时段进行记录,饭前与饭后各测一次,白天与夜间各测一次,对比血压结果更安心。
其采用双供电模式,电源适配器与干电池、锂电池可自由选择搭配,居家出行两不误,守护健康不断电。
超清大屏显而易见 操作体验贴心舒适
汉王电子血压计搭载LCD清晰大屏,信息显示全面,关键指数显而易见。并贴心推出具有背光功能的型号,在夜晚也可清晰显示,白天夜间检测都放心。
汉王电子血压计操作全流程细节满满,给用户舒适的操作体验。使用智能加压技术,为不同被测者设定不同的加压最大压力值,避免加压过高引起不适,为用户提供更舒适的测量体验。
测量过程中搭配语音播报,音量大小可调节,引导用户进行正确测量,让测量过程更方便,操作更省心。智能检测血压测量全流程,对测量误动、佩戴错误、袖带故障等各方面错误进行提示,引导用户进行正确测量,让用户每一次测量都能得到正确的反馈结果。
文章来源:汉王科技
关于北京君正
北京君正集成电路股份有限公司成立于2005年,基于创始团队创新的CPU设计技术,迅速在消费电子市场实现SoC芯片产业化,2011年5月公司在深圳创业板上市。
君正持续投入于多媒体编解码、影像信号处理、AI引擎、AI算法等核心领域并形成自有技术能力,其芯片在智能视频监控、AIoT、工业和消费、生物识别及教育电子领域获得了稳健和广阔的市场。
2020年,君正完成对北京矽成(ISSI)及其下属子品牌Lumissil的收购,并拥有其100%股份。ISSI于1988年成立于硅谷,主要为汽车、工业和医疗、通讯和企业设备、及消费等市场的电子产品提供、开发和设计具有高技术、高性能、高品质、高性价比的集成电路芯片,并已同全球用户建立了长期的供货关系。
其中,ISSI存储部门有高速低功耗SRAM,低中密度DRAM,NOR/NAND Flash,嵌入式Flash pFusion®,及eMMC等芯片产品。模拟和互联部门Lumissil有LED驱动、触控传感、音频驱动、微处理器、电源管理和互联等芯片产品。
亲,如果你在网站上没找到想要的信息可以联系我们,雷龙发展提供原厂技术支持,并提供君正集成电路完整解决方案
文章目录
FAT32文件系统详细分析 (续FAT文件系统详解)
1. 前言
2. 格式化SD nand/SD卡
3. FAT32文件系统分析
3.1 保留区分析
3.1.1 BPB(BIOS Parameter Block) 及BS区分析
3.1.2 FSInfo 结构扇区分析
3.1.3 引导扇区剩余扇区
3.1.4 备份引导扇区
3.1.5 保留区剩余区域
3.2 分区偏移及大小计算
3.3 FAT区分析:
3.3.1 FAT1
3.3.2 FAT2
3.4 数据区分析:
4. 总结
1. 前言
续上一篇文章 : FATFS文件系统详解:关于如SD卡、SD nand、spi nor flash等众多存储设备
在上一篇文章,我们已经对FAT文件系统有了一个详细的介绍,但由于FAT文件系统由历史发展,存在FAT12/16/32三种系统,在上一篇文章中采用的是FAT16系统作为实例进行的分析,而FAT32系统存在些许差异,且FAT32文件系统在当前应用广泛,因此特补充此篇博文,完善FAT32的示例分析。
2. 格式化SD nand/SD卡
申请到雷龙发展代理的CS创世 贴片 SD Card (SD NAND) 样品,做出测试,分享一下,该公司SD NAND 二代产品介绍可以参考如下地址http://longsto.com/product/list-39.html,有1Gb,4Gb,32Gb,64Gb的容量可选,我这里申请到的是两片32Gb的芯片和测试板.
2.1 格式化SD nand / SD卡,强制采用FAT32格式,分配每个簇大小为2048Byte,同时为了避免其他原有数据干扰,我们此处取消快速格式化。
2.2 使用 WinHex 打开分析
3. FAT32文件系统分析
FAT文件系统布局图如下,和FAT16上有些许差别:
3.1 保留区分析
保留区分为引导扇区、备份引导扇区及其他字段,具体数据段分析如下。
3.1.1 BPB(BIOS Parameter Block) 及BS区分析
BPB及BS参数内容数据如下:
EB 58 90 :BS_JmpBoot,跳转指令
4D 53 44 4F 53 35 2E 30:BS_OEMName,MSDOS 5.0,一个名字,指示创建此卷的操作系统,无其他作用`
00 02:BPB_BytsPerSec,扇区大小 512 字节
04:BPB_SecPerClus,每次操作的最小扇区数,簇 Cluster,4 (与格式化时选择的大小匹配 2048 = 512 * 4)
16 11:BPB_RsvdSecCnt,保留区的扇区数,0x1116=4374 (通过此可计算,FAT区起始地址为 4374 * 512 = 0x22 2C00)
02:BPB_NumFATs,FATs的个数,2(一般此值为2,多一个用来做冗余备份,解决系统异常导致第一个损坏时,增大恢复的可能性,表示FAT区有两个FATs备份)
00 00:BPB_RootEntCnt,0,在FAT12/16系统中,此字段表示根目录中32字节目录条目数量,设置此值时需注意对齐,为了最大的兼容性,FAT16系统上此值应设置为512,FAT32系统上此值应设置为0
00 00:BPB_TotSec16,16位大小区域描述FAT卷扇区总数,0。当FAT12/16系统扇区数 ≥0x10000(65536)时,此字段应设置为0,真实值存放在 BPB_TotSec32 字段;对于FAT32系统,此值必须为0。(此处由于我们的总扇区数=118.510241024/512 = 242688 > 65536,所以此字段为0)
F8:BPB_Media 媒体类型
00 00:BPB_FATSz16,00,一个FAT占用的扇区数,此字段仅在FAT12/16系统使用;FAT32系统,此字段必须为0,使用BPB_FATSz32字段替代。
3F 00:BPB_SecPerTrk,每个磁道的扇区数,此字段仅与具有几何形状且仅用于 IBM PC 的磁盘 BIOS 的介质相关,不用管。
FF 00:BPB_NumHeads,头数量,此字段仅与具有几何形状且仅用于 IBM PC 的磁盘 BIOS 的介质相关,不用管。
00 00 00 00:BPB_HiddSec,0,FAT 卷之前的隐藏物理扇区数(当磁盘被分区之后,当前分区并不一定是从扇区头开始的)
00 08 0F 00:BPB_TotSec32,0x0F0800 = 985088(整个卷空间大小),32位大小区域描述FAT卷扇区总数。 FAT12/16系统,扇区总数小于0x10000时,此字段必须为0,真实值存放在BPB_FATSz16;FAT32系统,此字段一直有效。(481M = 512 * 985088)
以上是FAT12/16/32公共字段,接下来是FAT32独有字段
75 07 00 00:BPB_FATSz32,1909,一个FAT占用的扇区数,FAT区总大小等于 BPB_FATSz?? * BPB_NumFATs 扇区。(由此可计算FAT区总大小:1909 * 2 = 3818扇区 = 3818 * 512Byte = 0x1D D400 Byte)
00 00: BPB_ExtFlags,扩展标识字段,bit7=0,表示所有FAT都是镜像的和活跃的;bit7=1,表示只有bit3-0表示的FAT是有效的。
00 00:BPB_FSVer:FAT32版本,高字节是主版本号,低字节是次版本号。
02 00 00 00:BPB_RootClus,2, 根目录的第一个簇号,此值通常为2,因为前两个簇一般用于保留。
01 00:BPB_FSInfo,1,FSInfo结构扇区与FAT32卷顶部的偏移扇区值。此值通常为1,因为其通常位于引导扇区旁边。
06 00:BPB_BkBootSec,6, 备份引导扇区与FAT32卷顶部的偏移扇区值。此值通常为6,考虑最大的兼容性,此值不建议为其他值。
00 00 00 00 00 00 00 00 00 00 00 00:BPB_Reserved,0,保留
80:BS_DrvNum,IBM PC 的磁盘 BIOS 使用的驱动器号,00h代表软盘,80h代表固定磁盘
00:BS_Reserved,保留字段,0
29:BS_BootSig,扩展引导签名,表示以下存在三个字段
30 D1 B5 78:BS_VolID,与 BS_VolLab 一起构成卷序列号,一般在格式化的时候结合时间生成
4E 4F 20 4E 41 4D 45 20 20 20 20:(解析为:"NO NAME “),BS_VolLab,11byte卷标,当卷标不存在时,此值应设置为"NO NAME”
46 41 54 33 32 20 20 20:BS_FilSysType,始终为"FAT32 ",对FAT类型的确定没有任何影响。
33 C9 ... B9 01 00 00:BS_BootCode32,引导启动程序,与平台有关,不使用时填充为0
BS_BootSign:0xAA55,引导签名,指示这是一个有效的引导扇区当扇区大小大于512字节时,剩余的字段应全部使用0x0填充。
3.1.2 FSInfo 结构扇区分析
FSInfo 数据结构为FAT32系统所特有,其目的是记录FAT32系统上剩余的簇数量以及下一个空闲簇数据;以避免扫描整个磁盘搜索导致的时间浪费。
FSInfo数据偏移可从引导扇区内的 BPB_FSInfo 参数获取,此处为 1,因此 FSInfo 数据偏移为1个扇区,对应512Byte,0x200地址处。FSInfo数据结构如下:
内容如下:
3.1.3 引导扇区剩余扇区
FAT32引导扇区总共有三个512Byte的扇区构成。BPB、BS、FSInfo字段已使用了2个扇区,还剩有一个扇区未使用,字段为0,如下图所示,需要注意的是,此扇区在偏移值510处依旧存在尾部签名0xAA55。
引导扇区剩余字段,为非有效字段,采用0x00填充。
3.1.4 备份引导扇区
相比FAT12/16,FAT32系统上存在引导扇区的备份,此块区域偏移参考引导扇区内BPB_BkBootSec字段,当前引导扇区内此参数值为6, 因此在当前文件系统内,备份引导扇区的偏移为 6号扇区,对应偏移地址为 BPB_BkBootSec * BPB_BytsPerSec = 6 * 512Byte = 3072Byte = 0xC00
3.1.5 保留区剩余区域
在FAT32系统中,保留区除了 BPB区域、FSInfo区域以及这两个区域的备份区域外,还有一部分区域,目前我没找到此区域的作用,我理解为此块区域是作为某种引导程序,数据内容如下:
关于此块区域,欢迎大家在评论区讨论!
此外,还有一处区域的存在也欢迎大家讨论,即FSInfo扇区后面的一个扇区,只有看到尾部签名,其他数据为空,目前也未找到此处有关说明,后续清楚后会在此补充,亦欢迎大家在评论区讨论!
3.2 分区偏移及大小计算
知道BPB参数内容之后,便可以进行分区偏移及大小计算了!
各分区偏移地址及大小如下:
关于FAT区,通常存在一个以上的FAT,如此处所格式化的sd卡便存在两个FAT,对应的偏移地址和大小如下:
注意:在FAT32系统中,根目录区不存在,但依旧存在根目录,不过是根目录作为数据区的一部分!
3.3 FAT区分析:
FAT32系统与FAT12/16系统在FAT区数据一个显著差别是:FAT32每条FAT条目占32bit,FAT16占16个bit,FAT12占12bit。关于此部分更详细描述,可参考上一篇:FAT文件系统详解(点击跳转!) 的 4.3 章节!
3.3.1 FAT1
FAT1偏移地址:0x22 2C00
数据内容如下:
3.3.2 FAT2
FAT2是FAT1的备份,偏移地址:0x31 1600
数据内容与FAT1一致,如下:
3.4 数据区分析:
偏移地址:0x40 0000
由参数BPB_RootClus可知,数据区第一个簇是2号簇。
打开数据区的第一个簇,里面存放的内容便是根目录的内容!这也就是为什么FAT32没有根目录区,但依旧存在根目录的实现方式。数据内容如下:
之后我们看到3号簇的内容:
数据字段如下图所示,由于在上一篇博文中已对长短文件名每个字段进行过细致分析,此处不再做过度分析,仅抽取关键字段进行分析,如下图所示:
之后切换到4号簇和5号簇,可以查看到对应数据:
从6号簇开始便没有在使用,均为空闲簇,对应上 FSInfo 结构内 FSI_Nxt_Free 字段的内容。
4. 总结
相比FAT16系统,FAT32文件系统在保留区有了更多的设计:
1)增加了引导扇区的备份,异常掉电等情况下可恢复性更强;
2)增加了FSInfo结构,对于大容量flash访问将更加高效;
此外FAT32系统取消了根目录区,将根目录移至数据区,根目录与普通目录本来就没有什么区别,确实也不用单独分一个区存放,提高了一致性。
关于数据的存储思想,依旧保持不变:FAT区内的FAT条目通过簇链记录扇区使用情况及文件占用的扇区情况;数据区内目录和文件都作为文件,通过目录这一类特殊文件,描述文件属性以及实际文件内容存放的簇的方式,将整个文件管理起来。
综上,便是FAT32格式文件系统的详细解析,欢迎大家评论区进行积极讨论与反馈!!!
前段时间有幸得到了雷龙出品的贴片式的TF卡的芯片及转接板,从而对其产品进行了相应的了解和测评。
从获得的相关资料看,雷龙出品的贴片式芯片分为两类,即BOW型和AOW型,其中BOW型为第一代产品,属商业级;AOW型则是第二代产品,属工业级或接近工业级。
而就存储容量看,则分为3个等级,即128MB、512 MB及4GB。
详细信息参见下表所示:
芯片及转接板的外观如图1和图2所示。
图1正面
图2背面
单就几何尺寸来讲,不随容量而改变,见图3所示,其中左侧的芯片为CSNP1GCR01-AOW,右侧的是CSNP32GCR01-BOW。
图3芯片对比
就相关产品来看,其对比情况如图4所示。由此可见,芯片要比常规的TF卡要小,不同厂家的芯片在几何尺寸方面基本一致。在转接卡方面,雷龙的转接板要大一些,而在芯片的焊接方面均采用贴面焊的方式。
对普通用户来讲,受贴面焊的限制,还是选取厂家的产品比较方便,其测试卡的成品形式见图4所示。
图4成品形式
芯片相关的封装参数如图5所示,尺寸单位为毫米。
图5封装参数
芯片的引脚如图6所示:
图6 芯片引脚
芯片各引脚的功能及用途如图7所示,由此可知该芯片能支持两种读写方式,即SD模式和SPI模式。
图7片内结构
在使用时,它有2种工作模式,即默认模式和高速模式,其工作时序如图8和图9所示。
图8默认模式
图9高速模式
芯片的典型应用电路如图10所示,其工作电源为3.3V。
图10典型应用
有了前面概括性的认识,下面再来看一看具体的测试过程。
1.电脑上的测试
大容量存储介质:
首先将测试卡插入USB转换器上,以连接电脑的USB口,见图11所示。
图11 USB转接方式
在正常的情况下,会在电脑上呈现出一个虚拟的U盘设备,其容量会因芯片的容量而改变,图12是1GB和4GB芯片的测试效果。
图12上电测试
在向U盘写入文件后,其测试效果如图13和图14所示,这说明其读写性能正常。
图13 U盘内容
图14 文件内容
2.微控器上的测试
除了在电脑上直接以U盘的方式作为存储介质来使用,它也会在各种设备上充当存储容量扩展的重要手段。
1) MP3播放器
随着多媒体技术的发展,各种媒体对存储容量的要求也显著地在增加,为此就需要TF卡这类小巧的介质来存放数据。
以MP3播放模块为例,它只有硬币的大小,在连接扬声器的情况下就可实现音乐播放的功能。而其播放的音乐数据则是存放在TF卡这类存储介质上。
用雷龙的存储芯片,一样可得到灵活地播放效果,其电路连接如图15所示。在使用串口通信的情况下,以相应的指令就可使其播放出指定的音乐。
图15 MP3播放线路
图16 存储播放文件
图17 播放控制
2)数码相框
如今有许多微控器都开始提供SD卡的读写功能及相应的文件系统支持,尤其是沁恒微的产品还提供和十分方便的U盘读写功能和文件系统。以 CH32V307为例,在TFT显示屏的配合下,以U盘来存储图片,就可快速地实现数码相框的功能,其显示效果效果如图19所示。
图18 硬件构成
图19 显示效果
当然雷龙CS SD NAND存储芯片的应用还有很多,这里只是作以简单的介绍,希望它对您在这方面的应用能带来一些帮助。感兴趣的朋友们,可到雷龙官网申请免费样品!
文章目录#申请原创#
FATFS文件系统详解
1. 简介
2. 基础概念
3. FAT文件系统组成介绍
4. FAT文件系统分析
4.1 采用FAT格式格式化SD nand/sd卡
4.2 引导扇区分析
4.3 分区偏移及大小计算
4.4 FAT子类型确认
4.4 访问FAT条目
4.5 文件与簇之间的关系
4.6 FSInfo扇区结构及备份引导扇区
4.7 FAT目录
4.7.1 SFN 短文件名目录
4.7.2 LFN长文件名
4.7.3 LFN系统对于SFN的兼容
5. 分区分析
5.1 保留分区分析
5.2 FAT区分析
5.3 根目录区分析
5.4 数据区分析
5.5 新增文件测试
6. 总结
1. 简介
在早期计算机刚发展的时候,那时候硬盘大小、flash设备容量都比较小,随着技术的不断迭代更新,硬盘容量越来越大。在早期,面对小容量的硬盘/flash,往往采用对应地址存放对应数据的方案,由于数据量不大,操作起来尚还可以。但是发展到今天,随着硬盘/flash容量不断增大,存储的数据也越来越多,早期单一的对应地址存放对应数据的方案已经无法满足我们的需求,操作硬盘/flash会变得异常的困难复杂。
因此针对上述问题,一群大佬们便开始设计文件系统这样一个东西,用来管理硬盘/flash上的数据信息,像我们电脑上打开文件夹,访问里面的文件,这其实就是基于文件系统访问电脑硬盘上数据的一个操作。
发展至今,文件系统已有众多版本,本文主要分享 关于FAT文件系统的详细设计, FAT文件系统适用于嵌入式设备,如SD卡、SD nand、spi nor flash等众多存储设备,同时基于此文件系统的文件亦能被电脑正常读取。
2. 基础概念
在研究文件系统之前,我们需要首先弄清楚关于内存这块的几个基本概念:
2.1.区分 扇区、块、簇的概念
扇区(sector):flash可操作的最小单元,通常指我们擦除的最小单元大小,以sd nand举例,通常最小为512Byte
块(block) 以及 簇(cluster):其实这是两个相同的概念,只是由于历史原因,在不同系统上的不同称呼,在windows中称簇,而在linux中称块。一个簇/块由多个扇区组成,由于一个扇区的空间较小,因此文件系统通过会将多个扇区组合在一起形成一个簇,并以簇为单位进行读写操作! 一个簇通常可以由 2、4、8、… 、2的n次方个扇区组成。
2.2.FAT文件系统总共由FAT12、FAT16以及FAT32三个版本,这是由于随着存储技术不断发展,FAT文件系统迭代导致,数字越大,版本越新,新版本对老版本完全兼容!
3. FAT文件系统组成介绍
Fat文件系统官方文档:http://elm-chan.org/docs/fat_e.html
FAT文件系统在flash上的布局如下图所示,总共由四个区域组成:
保留区
FAT区
根目录区 (FAT32类型不包含此区域)
数据区
SD NAND,贴片式TF卡,贴片式SD卡,北京君正,nor flash,存储,芯片,主控,小容量emmc,大容量SLC Nand
接下来,我们对一张格式化为FAT格式的SD卡进行分析,理解FAT文件系统的实现细节:
4. FAT文件系统分析
4.1 采用FAT格式格式化SD nand/sd卡
1.使用win10格式化一张118.5M的SD nand / sd卡,我这里用的是手上的一颗 创世CS 家的sd nand加一块转接板,和SD卡完全没有区别,且SD nand在稳定性上比SD卡具有优势。
此处由于SD nand(SD卡)大小原因,默认采用FAT16进行了格式化!因此在下文中我们先以FAT16进行分析,之后再重新格式化为FAT32进行分析,就很容易懂了!
4.2 引导扇区分析
1.使用 winhex 工具打开对应磁盘,注意需使用管理员权限运行
2.打开后我们可以以二进制的格式查看SD卡上所有数据,首先看到第一个扇区,也就是对应的引导扇区 boot sector,注意引导扇区位于保留区!
3.接下来我们根据官方文档 对引导扇区进行分析
注意,FAT文件系统数据均采用小端格式!
a) 首先是FAT12/16/32公共部分,(偏移值 0 - 35):
EB 3C 90:BS_JmpBoot,跳转指令
4D 53 44 4F 53 35 2E 30:BS_OEMName,MSDOS 5.0,一个名字,指示创建此卷的操作系统,无其他作用
00 02:BPB_BytsPerSec,扇区大小 512 字节
04:BPB_SecPerClus,每次操作的最小扇区数,簇 Cluster,4 (与格式化时选择的大小匹配 2048 = 512 * 4)
06 00:BPB_RsvdSecCnt,保留区的扇区数,6 (通过此可计算,FAT区起始地址为 6 * 512 = 0xC00)
02:BPB_NumFATs,FATs的个数,2(一般此值为2,多一个用来做冗余备份,解决系统异常导致第一个损坏时,增大恢复的可能性,表示FAT区有两个FATs备份)
00 02:BPB_RootEntCnt,512,在FAT12/16系统中,此字段表示根目录中32字节目录条目数量,设置此值时需注意对齐,为了最大的兼容性,FAT16系统上此值应设置为512,FAT32系统上此值应设置为0
00 00:BPB_TotSec16,16位大小区域描述FAT卷扇区总数,0。当FAT12/16系统扇区数 ≥0x10000(65536)时,此字段应设置为0,真实值存放在 BPB_TotSec32 字段;对于FAT32系统,此值必须为0。(此处由于我们的总扇区数=118.510241024/512 = 242688 > 65536,所以此字段为0)
F8:BPB_Media 媒体类型
ED 00:BPB_FATSz16,237,一个FAT占用的扇区数,此字段仅在FAT12/16系统使用;FAT32系统,此字段必须为0,使用BPB_FATSz32字段替代。FAT区总大小等于 BPB_FATSz?? * BPB_NumFATs 扇区(2372512=242688=0x3B400,由此可推算根目录区起始地址:0x3B400+0xC00=0x3C000)。
3F 00:BPB_SecPerTrk,每个磁道的扇区数,此字段仅与具有几何形状且仅用于 IBM PC 的磁盘 BIOS 的介质相关,不用管。
FF 00:BPB_NumHeads,头数量,此字段仅与具有几何形状且仅用于 IBM PC 的磁盘 BIOS 的介质相关,不用管。
00 00 00 00:BPB_HiddSec,0,FAT 卷之前的隐藏物理扇区数(当磁盘被分区之后,当前分区并不一定是从扇区头开始的)
00 B4 03 00:BPB_TotSec32,242688,32位大小区域描述FAT卷扇区总数(整个卷空间大小)。 FAT12/16系统,扇区总数小于0x10000时,此字段必须为0,真实值存放在BPB_FATSz16;FAT32系统,此字段一直有效。(118.5M = 512 * 242688)
b) 接下来是FAT12/16特有字段(偏移值36)
80:BS_DrvNum,IBM PC 的磁盘 BIOS 使用的驱动器号,00h代表软盘,80h代表固定磁盘
00:BS_Reserved,保留字段,0
29:BS_BootSig,扩展引导签名,表示以下存在三个字段
83 3E 07 E4:BS_VolID,与 BS_VolLab 一起构成卷序列号,一般在格式化的时候结合时间生成
4E 4F 20 4E 41 4D 45 20 20 20 20:(解析为:"NO NAME “),BS_VolLab,11byte卷标,当卷标不存在时,此值应设置为"NO NAME”
46 41 54 31 36 20 20 20:(解析为:"FAT16 "),BS_FilSysType文件系统类型,支持字段有:"FAT12 ", "FAT16 " or "FAT ",注意很多人认为是通过此字段区分FAT12/16/32系统类型,实际是错误的,文件系统类型实际上是根据磁盘大小确定的,官方文档 “Determination of FAT sub-type” 章节或本博文后文有描述,不过为了最大的兼容性考虑,此字段应设置为对应文件系统的名字。
33 C9 ~ CB D8:BS_BootCode,引导启动程序,与平台有关,不使用时填充为0
55 AA:BS_BootSign,0xAA55,引导签名,指示这是一个有效的引导扇区
当扇区大小大于512字节时,剩余的字段应全部使用0x0填充。
c) 如果是FAT32,则采用FAT32特有字段解析(偏移值和FAT12/16特有字段一致为36)
虽然此处我们的是FAT16格式,不过此处也将FAT的字段进行描述,方便理解。
BPB_FATSz32:一个FAT占用的扇区数,此字段仅在FAT32系统有效。FAT区总大小等于 BPB_FATSz?? * BPB_NumFATs 扇区。
BPB_ExtFlags:扩展标识字段,bit7=0,表示所有FAT都是镜像的和活跃的;bit7=1,表示只有bit3-0表示的FAT是有效的。
BPB_FSVer:FAT32版本,高字节是主版本号,低字节是次版本号。
BPB_RootClus:根目录的第一个簇号,此值通常为2,因为前两个簇一般用于保留。
BPB_FSInfo:FSInfo结构扇区与FAT32卷顶部的偏移扇区值。此值通常为1,因为其通常位于引导扇区旁边。
BPB_BkBootSec:备份引导扇区与FAT32卷顶部的偏移扇区值。此值通常为6,考虑最大的兼容性,此值不建议为其他值。
BPB_Reserved:保留
BS_DrvNum:含义与FAT12/16字段一样
BS_Reserved:含义与FAT12/16字段一样
BS_BootSig:含义与FAT12/16字段一样
BS_VolID:含义与FAT12/16字段一样
BS_VolLab:含义与FAT12/16字段一样
BS_FilSysType:始终为"FAT32 ",对FAT类型的确定没有任何影响。
BS_BootCode32:引导启动程序,与平台有关,不使用时填充为0
BS_BootSign:0xAA55,引导签名,指示这是一个有效的引导扇区
当扇区大小大于512字节时,剩余的字段应全部使用0x0填充。
以上就是引导扇区内容的详细分析了,通过引导扇区的内容,我们即可知道FAT文件系统依赖的硬件存储空间大小、簇大小、扇区大小以及以及FAT系统版本等重要信息。
同时通过引导扇区的内容,我们便可计算出对应的FAT的四个区域的大小及起始偏移位置等重要信息,接下来计算FAT四个分区的起始位置及大小。
4.3 分区偏移及大小计算
FAT卷总共分为以下四个区域:
保留区
1.第一个扇区为引导扇区,存放BPB(BIOS Parameter Block)数据,存放的是FAT卷的配置参数。
2.上述参数中以 BPB_ 命名的字段都是 BPB 的一部分,而以 BS_ 标题命名的字段都不是 BPB 的一部分,而只是引导扇区的一部分
FAT区(分区表装载区)
根目录区
数据区
各分区偏移地址及大小如下:
此外,关于FAT区,通常存在一个以上的FAT,如此处所格式化的sd卡便存在两个FAT,对应的偏移地址和大小如下:
4.4 FAT子类型确认
关于FAT的类型是FAT12/16/32确认:FAT类型由数据区内簇的数量决定,除此之外无其他办法!
当一个卷,簇的数量 ≤4085 时,为FAT12
当一个卷,簇的数量 ≥4086 且 ≤65525 时,为FAT16
当一个卷,簇的数量 ≥65526 时,为FAT32
簇的数量计算公式:CountofClusters = DataSectors / BPB_SecPerClus;
如我们这里:CountofClusters = 242176 / 4 = 60544,所以为 FAT16!
当簇的大小从 512 ~ 32768字节的各种条件下,不同类型FAT对应卷的大小范围如下:
4.4 访问FAT条目
FAT区由一条条FAT条目构成,关于 FAT[N] 对应的条目具体位置计算如下:
FAT16:
FAT32:
格外需要注意的是,不同格式,对应的FAT条目的长度和格式不一样:
此外对于FAT32格式,高4位是保留位,只有低28位有效!
具体如下图所示:
4.5 文件与簇之间的关系
那么文件和簇之间的相互关系又是怎样的呢?我们又是如何准确的找到存放在flash上的文件的呢?接下来让我们看下文件与簇之间的关系映射。
在FAT卷上文件通过目录管理,目录是一个32字节数组组成的目录条目结构,此目录结构包含:文件名、文件大小、时间戳以及文件所在的第一个簇号。
簇号为0和1的簇被保留,由参数BPB_RootClus可知,有效簇从第2号簇开始。FAT[2](2号簇)对应数据区的第一个簇。
因此第N个簇的位置计算公式如下:
FirstSectorofCluster = DataStartSector + (N - 2) * BPB_SecPerClus
每个条目所在的位置,对应一个簇。当文件长度大于一个簇长度时,条目内的值为下一个条目的索引,直到文件所在的最后一个簇,由此构成簇链!文件所在的最有一个簇所对应的FAT条目内的值由一个特殊的值(EOC)组成,它永远不会匹配任何有效的簇号,如下:
FAT12: 0xFF8 - 0xFFF (typically 0xFFF)
FAT16: 0xFFF8 - 0xFFFF (typically 0xFFFF)
FAT32: 0x0FFFFFF8 - 0x0FFFFFFF (typically 0x0FFFFFFF)
存在一些特殊的值被用来做损坏簇的标记,如下:
FAT12: 0xFF7
FAT16:0xFFF7
FAT32:0xFFFFFFF7
不过此处需要注意,在FAT12/16系统上,上述特殊值绝不会和任何有效簇匹配,但是在FAT32上有可能,因此为了防止混淆,你在创建FAT32系统的时候应该避免这种情况发生!因此FAT32系统上簇的上限为268435445(大于256M个簇)
FAT条目初始化的时候,FAT[2] 及以后的数据应被初始化为0,指示未被使用处于空闲状态,如果值不为0,则意味着簇被损坏或被使用状态。在FAT12/16系统上,空闲簇的数量未被记录,而在FAT32系统上,FAT32支持FSInfo结构体,里面记录了空闲簇的数量。
关于FAT[0]和FAT[1]:
此两个保留的条目,没有与任何簇有联系;不过具有其他意义,如下:
FAT12: FAT[0] = 0xF??; FAT[1] = 0xFFF;
FAT16: FAT[0] = 0xFF??; FAT[1] = 0xFFFF;
FAT32: FAT[0] = 0xFFFFFF??; FAT[1] = 0xFFFFFFFF;
FAT[0]中的?? 与 BPB_Media 相同;
FAT[1] 记录了错误历史记录:卷脏标志(FAT16:bit15、FAT32:bit31),系统在启动的时候清除此位,正常关闭的时候恢复。
如果此位已经清除,表明上次未被正常关闭,可能存在逻辑卷错误;硬件错误标志(FAT16:bit14、FAT32:bit30)当出现无法恢复的读写错误时清除,表明需要进行全面检查。
关于FAT区域,有两个重点注意事项:
第一个是FAT的最后一个扇区可能没有被完全使用。在大多数情况下,FAT在扇区的中间结束。FAT驱动程序不应该对未使用的区域做出任何假设。在格式化卷时,应该用零填充它,并且在此之后不应更改它。
另一个是BPB_FATSz16/32可以指示比卷需要的值大的值。换句话说,未使用的扇区可以跟随每个FAT。这可能是数据区域对齐或其他原因导致的。同时,在格式化时这些扇区也会被用零填充。
下表展示了不同FAT类型中FAT值所对应的含义解释:
一、什么是pSLC
pSLC(Pseudo-Single Level Cell)即伪SLC,是一种将MLC/TLC改为SLC的一种技术,现Nand Flash基本支持此功能,可以通过指令控制MLC进入pSCL模式,存储时在MLC的每个单元中仅存储1bit数据,使MLC拥有SLC的性能,同时具有MLC的性价比。
如图所示,单个单元中,MLC可以存储2bit数据,单个单元可以拥有4种状态,当进入pSLC模式后,仅保存1bit数据。
二、各NAND FLASH的特点
MLC常用制程为15nm,擦写次数约为3000次,改为pSLC模式后约为2万次。
三、pSLC的优缺点
pSLC具有以下优点:
(1)与相同容量下的SLC相比,成本更低,体积更小;
(2)比MLC更高的P/E次数。
pSLC的缺点:
(1)寿命与性能略低于SLC;
(2)pSLC模式会牺牲原生芯片的一部分容量。
四、应用场景
CS创世推出的2GB pSLC SD Nand,尺寸为6.2*8mm,使用标准SD2.0协议,可以无需修改软件直接替换SD卡和TF卡,采用了贴片式SD NAND后能使您的产品更稳定更安全同时有效增加使用寿命。该芯片几乎达到了协议的最高理论速度(25MB/s),连续读取最高速度可以到达20.6MB/s,连续写入最高速度可以达到19.4MB/s。
pSLC SD Nand在文件传输时无论是大文件还是小文件,读写速度都可以保持在一个稳定的状态,同时在反复擦写、异常掉电等特殊场景都具有良好表现,且芯片温宽达到-25℃到85℃,同时兼具SLC的优点和MLC的性价比,是工业存储设备不二选择。
深圳市雷龙发展有限公司主营Nand Flash 15年,产品应用领域有:医疗设备,工业控制,PON,安防,机顶盒,DVR,通信,网络设备,IPC,执法记录仪,可视对讲,门禁考勤,平板电脑,汽车电子,电力设备,工业仪器设备,POS机,数码相机,教育电子等。其代表客户包括:创维,友华,糖猫,西门子,阿巴町,TCL,ZTE,ABB,Vtech等。
申请到雷龙发展代理的CS创世 贴片 SD Card (SD NAND) 样品,做出测试,分享一下。
生产方:CS创世半导体
总代理官方网站:深圳市雷龙发展有限公司
目前雷龙发展代理的 SD NAND 已可在立创商城搜索到,其详情页也附有手册。
芯片简介
芯片外观及封装
实拍图:
根据官方文档介绍,此款芯片采用 LGA-8 封装,标准SDIO接口,兼容SPI/SD接口。
标准的SD 2.0协议可以直接移植标准驱动代码,支持TF卡启动的SOC都可以用SD NAND。
芯片主要参数(以CSNP32GCR01-BOW手册为准)
Interface: Standard SD Specification Version 2.0 with 1-I/O and 4-I/O.
Default mode: Variable clock rate 0 - 25 MHz, up to 12.5 MB/sec interface speed (using 4 parallel data lines)
High-Speed mode: Variable clock rate 0 - 50 MHz, up to 25 MB/sec interface speed (using 4 parallel data lines)
高速模式下,可达到 25MB/s 的传输速度,在普通模式下也有 12.5MB/s 的传输速度。
端口信息对比
SD NAND 接口信息
SD Card 接口信息
micro SD:
SD:
可以对比,除引脚分布外,在引脚功能上SD NAND 和 SD Card 并无明显差别。
参考设计电路图
从所给的参考电路来看,与设计 SD卡托 所需外围电路基本一致,不用修改外围器件或原理图,只需少量修改 PCB 布局即可实现替换。
NAND Flash Menory
介绍 NAND Flash 有关资料均来自 KIOXIA 官网 。
存储单元结构
下图为闪存的内部存储单元结构(横截面)。存储单元是数据存储的最小单位。通过将电子移入或者移出封闭在绝缘体中的电荷存储膜来存储数据。
写入擦除操作
当高压(Vcg(++))施加到控制栅极(control gate)时,电子穿过绝缘体(Insulator)并从硅衬底(Silocon substrate)进入电荷存储膜(Charge storage film)(如图a)。当电源关闭时,此存储电子的状态仍会存在。当在硅衬底侧施加高电压(Vw(++))时,电子穿过绝缘体并从电荷存储膜离开到硅衬底侧(如图b)。这就是存储单元写入数据和擦除数据的操作。
数据0和数据1判定
当向控制栅极施加恒定电压(读出电压Vcg(+))时,数据”0“和”1“取决于电流是否在存储单元内横向流动。当电压逐渐施加到控制栅极时,电流开始在存储单元中流动的控制栅电压被称为阈值电压。”0“和”1“的判断是利用该阈值电压根据电荷存储膜中是否存在电子而变化的事实来执行的。在电荷存储膜中有电子的状态下(数据”0“),阈值电压高于读出电压Vcg(+),所以电流不流动(如图a)。在电荷存储膜中没有电子的状态下(数据”1“),阈值电压低于读出电压Vcg(+),因此电流流动。
即使是电源关闭,状态仍然会保留,即断电不丢失。
NAND Flash
存储单元串联排列的结构称为 NAND Flash,NAND Flash的一个特点是可以高密度排列存储单元。
NAND Flash 相比较于 NOR Flash 容量更大,擦写速度更快。作为存储数据是不错的选择。
传输速度测量
以 CSNP4GCR01-BOW 为例子:
这个芯片又不往电脑上用,测速就略微看看,做个参考就得了。
SD卡控制
对于 NAND SD卡的控制,官方有提供基于 STM32 的测试程序,这里由于篇幅原因,不做过多介绍,其与普通 SD Card 基本相同。
【本文转载自CSDN,作者:喜暖知寒】
文章目录
1、存储芯片分类
2、NOR Flash 与 NAND Flash的区别
3、什么是SD卡?
4、什么是SD NAND?
5、SD NAND的控制时序
6、FPGA实现SD NAND读写
6.1、设计思路
6.2、仿真结果
6.3、实验结果
1、存储芯片分类
目前市面上的存储芯片,大致可以将其分为3大类:
SD NAND,贴片式TF卡,贴片式SD卡
① EEPROM
EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器,是一种掉电后数据不丢失的存储芯片。EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。
这类产品容量小,读取速度慢,且无法在应用过程中写入数据,十分不便。目前多存在于一些MCU内部,如遥控器,电风扇等各类低端、低速消费类产品。相信你读大学如果玩单片机的话,那么应该是不陌生。
② NOR Flash
NOR Flash由Intel在1988年发明,是市场上两种主要的非易失闪存技术之一。NOR Flash 技术的出现,彻底改变了原先由EPROM和EEPROM一统天下的局面。
NOR Flash可能是目前应用领域最广泛的一种存储芯片了,基本上主流的电子产品里都有使用,比如手机摄像头内部,或者屏幕驱动电路板。主要用来存储代码和一些比较小的数据文件。NOR Flash架构决定了它的容量不能做大,而且读取速度比较慢。好处在于简单易用,其接口可以实现地址寻址,也就意味着可以做到直接对某个地址直接操作,而不需要建立额外的文件系统。
③ NAND Flash
虽然很多人平常说的Flash 存储器一半默认其就是NOR Flash ,但这无疑是不严谨的。FLASH产品可以分为两个大类:NOR Flash 和 NAND Flash 。
NAND Flash 是市场上两种主要的非易失闪存技术之一,由东芝公司在1989年发明。其强调降低每比特的成本,并拥有更高的性能,可以像磁盘一样可以通过接口轻松升级。
NAND Flash应该是目前最热门的存储芯片了。因为我们生活中经常使用的电子产品都会涉及到它。比如你买手机,肯定会考虑64GB,还是256GB?买笔记本是买256GB,还是512GB容量的硬盘呢?(目前电脑大部分采用了基于NAND Flash产品的固态硬盘)
2、NOR Flash 与 NAND Flash的区别
Flash 闪存是非易失存储器,可以对称为块的存储器单元块进行擦写和再编程。任何Flash 器件的写入操作都只能在空或已擦除的单元内进行,所以大多数情况下,在进行写入操作之前必须先执行擦除。NAND器件执行擦除操作是十分简单的,而NOR则要求在进行擦除前先要将目标块内所有的位都写为0。
执行擦除时块尺寸的不同进一步拉大了NOR和NAND之间的性能差距,统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行。这样,当选择存储解决方案时,用户必须权衡以下因素:
NOR Flash支持随机访问,所以支持XIP(execute In Place),NAND Flash需要按块进行读取,所以不支持XIP
NAND FLASH理论读取速度与NOR Flash相近,实际情况会根据接口不同有些差异
NOR 与 NAND 写入前都需要先擦除,NOR在擦除时以64~128KB的块进行,执行一个写入/擦除操作的时间约5s,NAND在擦除时以8~32KB的块进行,执行一个写入/擦除操作的时间约4ms
NAND 理论最大擦除次数比NOR多
NOR 驱动比NAND简单,NAND FLASH需要通过专门的NFI(NAND FLASH Interface)与Host端进行通信,驱动相对复杂
所有Flash 都会有位反转的问题,NAND 位反转概率要比NOR高,NAND Flash 必须要使用ECC
NAND的单元尺寸几乎是NOR器件的一半,所以NAND成本更低
SD NAND,贴片式TF卡,贴片式SD卡
NOR 与 NAND 各有特点,应用场景与应用难度也不同,一般来讲,NOR适用于小容量、略低速且需要直接对地址块进行操作的应用,而NADN则适用于大容量的高速应用。SD NAND 在保留了NAND架构优质特性的同时改进了不足之处,内置的控制器能自行管理NAND Flash,无需在外部处理ECC和进行坏块管理,免去了MTD层,不需要写繁琐的驱动代码。
3、什么是SD卡?
①概述
SD卡的英文全称是Secure Digital Card,即安全数字卡(又叫安全数码卡),是在MMC 卡(Multimedia Card,多媒体卡)的基础上发展而来,主要增加了两个特色:更高的安全性和更快的读写速度。
SD NAND,贴片式TF卡,贴片式SD卡
②容量标准和速度等级
若按照容量 对 SD 卡进行等级划分,SD 卡可分为 4 个等级,SD(Secure Digital Card,安全数字卡) 卡、SDHC 卡(Secure Digital High Capacity,高容量安全数字卡)、SDXC 卡( SD eXtended Capacity,容量扩大化的安全数字卡)和 SDUC(Secure Digital Ultra Capacity,超 容量安全数字卡)。现今,市场的主流 SD 产品是 SDHC 和 SDXC 这两种较大容量的存储 卡,SD 卡因容量过小,已逐渐被市场淘汰,SDUC 则是容量太大,预计会出现在未来市 场。SD 卡的四种容量标准,具体见下图:
SD NAND,贴片式TF卡,贴片式SD卡
不同品牌和厂商生产的 SD 卡在对存取速度上的定义标准不同,这会使用户在选择 SD卡时产生困扰。所以 SD 协会根据视频匀速写入到 SD 卡的最低持续速度来划分不同等级, 每个等级的速率是以每秒传输多少 MB 来衡量的,单位为 MB/S。
SD 协会定义了三种速度等级:速度等级、UHS 速度等级与视频速度等级。三种速度等级的具体传输速度如下图:
SD NAND,贴片式TF卡,贴片式SD卡
4、什么是SD NAND?
上文中提到的SD卡其实更应该叫做TF卡,在日常生活中最常见的应用就是数码相机的存储卡。因为它是可拆卸的,所以这类SD卡最大的优点就是便携方便,但同时也有容易丢失和接触不良等毛病,所以多用于消费类产品。
在工业级应用中,更多见的是一类贴片式的SD NAND产品,俗称贴片式T卡或贴片式SD卡。虽然SD NAND 和TF卡称呼上有些类似,但是SD NAND和TF卡有着本质上的区别:
SD NAND,贴片式TF卡,贴片式SD卡
为什么SD NAND和 TF卡 之间有这么大区别呢?因为 SD NAND是为内置存储而生,是焊接在PCB板上的,是针对工业级应用的产品,所以品质稳定、一致性高、使用稳定性高、同时尺寸也小。而TF卡主要是针对普通消费者,品质和一致性、使用稳定性等相对要求不高,再加上国内鱼龙混杂的市场环境,导致内置存储用TF卡的品质风险高。
NAND Flash产品的一个特质就是它的品质并不是0和1这么简单,有些品质隐患是使用一段时间之后才被发现,如果这个产品已经销往海外,处理起来会变得异常麻烦。使用SD NAND可以为客户产品带来整体品质的提升,提供确定性,是客户产品良好品牌和口碑的稳定基石。而使用TF卡时,产品整机不可控因素会增高,比如常见的卡座老化松动、TF触点氧化、TF卡遗失、抗震性能减退等等。综上所述,虽然SD NAND与TF卡使用的协议相同,但从外观到内在都有区别。正在使用TF卡的客户需要提升产品稳定性及耐用性时,SD NAND 是绝佳选择。
尽管 SD NAND和 TF卡之间有着这么大的区别,但具体到实际应用,其对外接口和驱动程序都是一样了,这说明可移植性非常好。
① 物理结构
SD NAND从物理结构看包括 5 个部分,分别为存储单元、存储单元接口、电源检测、卡及接口控制器和对外接口,具体见下图。
SD NAND,贴片式TF卡,贴片式SD卡
存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输
存储单元接口是接口控制器与存储单元的数据交互通道
电源检测单元保证 SD NAND工作在合适的电压下,如出现掉电或上电状态时,它会使控制单元和存储单元接口复位
卡及接口控制单元控制 SDNAND的运行状态,它包括 8 个寄存器
对外接口单元控制 SD NAND引脚的输入输出,一般包含SDIO接口和SPI接口
② 对外接口
SD NAND共有 9 个引脚,其中包括 3 根电源线、1 根时钟线、1 根命令线和 4根数据线。如下:
CLK:同步时钟线,由主机产生,即由主控制器(FPGA)输出; 使用 SPI 模式 时,该引脚与 SPI 总线的 SCK 时钟信号相连
CMD:命令控制线, SDIO 主机通过该线发送命令控制 SD NAND,如果命令要求 SD NAND 提供应答(响应), SD NAND也是通过该线传输应答信息; 使用 SPI 模式时,该引脚与 SPI总线的 MOSI 信号相连, SPI 主机通过它向 SD NAND发送命令及数据,但因为 SPI 总线 的 MOSI 仅用于主机向从机输出信号,所以 SD NAND返回应答信息时不使用该信号线;
DAT0-3:在 SDIO 模式下,它们均为数据线,传输读写数据, SD NAND可将 D0 拉低表 示忙状态; 在 SPI 模式下, DAT0 与 SPI 总线的 MISO 信号相连, SD NAND通过该信号线向主机发送数据或响应, DAT3 与总线的 CS 信号相连, SPI 主机通过该信号线选择要通讯的 SD NAND。
VDD、VSS1、VSS2:电源和地信号。
③ 工作模式
SD NAND有两种工作模式:SDIO 模式与SPI模式
在 SDIO 模式下,SD NAND共使用到 CLK、CMD、DAT[3:0] 6根信号线;SDIO 总线与多个 SD NAND连接时,可以共用 CLK 时钟信号线,对于 CMD、DAT[3:0]信号线,每个 SD NAND都要独立连接。SDIO 总线与 SD 卡连接方式,具体见下图。此模式使用IO引脚多,但传输速度高。
SD NAND,贴片式TF卡,贴片式SD卡
在 SPI 模式下,SD NAND共使用到 CS(DAT[3])、CLK、MISO(DAT[0])、MOSI(CMD) 4根信号线;SPI 总线与多个 SD NAND连接时,除 CS 片选信号线不可共用外,其他信号均可公用。SPI 总线与 SD NAND连方式,具体见下图。此模式使用IO引脚少,但传输速度慢。
SD NAND,贴片式TF卡,贴片式SD卡
④ 内部寄存器
SD NAND总共有 8 个寄存器,用于设定或表示 SD NAND信息,寄存器描述具体见下图。 这些寄存器只能通过对应的命令访问,对 SD NAND的控制操作是通过命令来执行的, SD NAND定义了 64 个命令(部分命令不支持 SPI 模式) ,每个命令都有特殊意义,可以实现某一特定功能, SD NAND接收到命令后,根据命令要求对 SD NAND内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现 SD NAND的控制以及读写操作。
SD NAND,贴片式TF卡,贴片式SD卡
内部寄存器就不展开讲了,我们用FPGA实现读写测试也不需要了解那么多寄存器。
5、SD NAND的控制时序
① 命令与读写时序
SD NAND的通信是基于命令和数据传输的。通讯由一个起始位(“0”)开始,由一个停止位(“1”)终止。SD NAND通信一般是主机发送一个命令(Command),从设备在接收到命令后作出响应(Response),如有需要会有数据(Data)传输参与。SD NAND的基本交互是命令与响应交互, 见下图:
SD NAND,贴片式TF卡,贴片式SD卡
SD NAND数据是以块(Block)形式传输的,SDHC 规格数据块长度一般为 512 字节,数据可以从主机到芯片,也可以是从芯片到主机。数据块需要 CRC 位来保证数据传输成功,CRC 位由 SD NAND系统硬件生成。单个数据块的读、写时序分别见下2图:
SD NAND,贴片式TF卡,贴片式SD卡
SD NAND,贴片式TF卡,贴片式SD卡
读写操作都是由主机发起的,主机发送不同的命令表示读或写, SD NAND接收到命令后先针对命令返回响应。在读操作中, SD NAND返回一个数据块,数据块中包含 CRC校验码;在写操作中,主机接收到命令响应后需要先发送一个标志(TOKEN)然后紧跟一个要写入的数据块,SD NAND接收完数据块后会返回一个数据响应及忙碌标志,当 SD NAND把接收到的数据写入到内部存储单元完成后,会停止发送忙碌标志,主机确认 SD NAND空闲后,才可以发送下一个命令。
SD NAND数据传输支持单块和多块读写,它们分别对应不同的操作命令, 结束多块读写时需要使用命令来停止操作。
② 命令格式
SD NAND命令由主机发出,命令格式固定为 48bit,通过 CMD 信号线连续传输。SD NAND命令格式,具体见下图:
SD NAND,贴片式TF卡,贴片式SD卡
起始位和终止位:命令的主体包含在起始位与终止位之间,它们都只包含一个数据位,起始位为 0,终止位为 1。
传输标志:用于区分传输方向,该位为 1 时表示命令,方向为主机传输到 SD NAND,该位为 0 时表示响应,方向为 SD NAND传输到主机。命令主体内容包括命令、地址信息/参数和 CRC 校验三个部分。
命令号:它固定占用 6bit,所以总共有 64 个命令,每个命令都有特定的用途,部分命令不适用于 SPI 总线,或不适用于 SD NAND操作,只是专门用于 MMC 卡或者 SD I/O卡。
地址/参数:每个命令有 32bit 地址信息/参数用于命令附加内容,例如,广播命令没有地址信息,这 32bit 用于指定参数,而寻址命令这 32bit 用于指定目标 SD NAND的地址, 当使用 SDIO 驱动多个 SD NAND时,通过地址信息区分控制不同的SD NAND,使用 SPI 总线驱动时,通过片选引脚来选择不同的SD NAND,所以使用这些命令时地址可填充任意值。
CRC7 校验:长度为 7bit 的校验位用于验证命令传输内容正确性,如果发生外部干扰 导致传输数据个别位状态改变将导致校准失败,也意味着命令传输失败, SD NAND不执行命令。 使用 SDIO 驱动时,命令中必须包含正确的 CRC7 校验值;而使用 SPI 驱动时,命令中的 CRC7 校验默认是关闭的,即这 CRC7 校验位中可以写入任意值而不影响通讯,仅在发送 CMD0 命令时需要强制带标准的 CRC7 校验。
③ 命令内容
SD NAND命令可分为标准命令 (如 CMD0)和特殊应用命令 (如 ACMD41),其中特殊应用命令只有在先写入 CMD55 命令后才能被识别。按照指令类型又可将 SD NAND命令分为基本命令、数据块写命令、数据块读命令、擦除命令等 12 种(class0 ~ class11)。
本次实验将会使用 SPI 模式实现 SD NAND的数据读写操作,所以接下来只列举 SPI 模式下常用的 SD 卡命令,具体见下表:
SD NAND,贴片式TF卡,贴片式SD卡
SPI 模式下,上述各命令中,命令 CMD0 的 CRC7 校验为固定的 1001_010;命令CMD8 的 CRC7 校验为固定的 1000_011;其他命令的 CRC7 校验在 SPI 模式下无作用,赋值为 1111_111 即可。
④ 响应格式
当 SD NAND接收到命令时,会向 SD NAND回传命令响应。SD NAND有 5 种类型的命令响应:R1、R1b、R2、R3、R7;SDIO NAND还支持另外两种命令响应:R4、R5。下文只对部分响应做介绍。
R1 响应格式,具体见下图:
SD NAND,贴片式TF卡,贴片式SD卡
in idle state:当该位为 1 时,表示 SD NAND处于空闲状态
erase reset:因为接收到无需擦除操作的命令,擦除操作被复位
illegal command:接收到一个无效的命令代码
com crc error:接收到的上一个命令的 CRC 校验错误
erase sequence error:擦除命令的控制顺序错误
address error:读写的数据地址不对齐(数据地址需要按块大小对齐)
parameter error:命令的参数错误
R3 响应格式,具体见下图:
SD NAND,贴片式TF卡,贴片式SD卡
R3 响应包括 5 个字节,首先返回的第 1 个字节内容为 R1,剩下的其余字节为 OCR( Operation Conditions Register, 操作条件寄存器)寄存器的内容。
R7 响应格式,具体见下图:
SD NAND,贴片式TF卡,贴片式SD卡
R7 响应包括 5 个字节,首先返回的第 1 个字节内容为 R1,R7 [31:28]位为命令版本,R7[27:12]为保留位,R7[11:8]为反馈的电压范围,最后 1 个字节为检查模式。
6、FPGA实现SD NAND读写
接下来编写FPGA的Verilog代码实现向SD NAND的指定扇区中写入512个字节的数据,写完后将数据读出,并通过指示灯的方式验证数据是否被正确读写。需要说明的是,后文的读写操作均采用SPI模式。
6.1、设计思路
① 上电时序
SD NAND同其他的许多芯片一样上电后需要保持一定的时间以便维持电压稳定,这个时间通常是74+个时钟周期,一般实际应用中可设置参数为74~100。只有经过这个过渡时间后,才可以执行后续的SD NAND初始化操作。
SD NAND,贴片式TF卡,贴片式SD卡
② 初始化时序
SD NAND在正常读写操作之前,必须先对SD NAND进行初始化,使其工作在预期的工作模式。初始化流程如下:
SD NAND,贴片式TF卡,贴片式SD卡
SD NAND,贴片式TF卡,贴片式SD卡
1.SD NAND完成上电后,主机FPGA先对从机SD NAND发送至少74个以上的同步时钟,在上电同步期间,片选CS引脚和MOSI引脚必须为高电平(MOSI引脚除发送命令或数据外,其余时刻都为高电平);
2.拉低片选CS引脚,发送命令CMD0(0x40)复位SD NAND,命令发送完成后等待SD NAND返回响应数据;
3.SD NAND返回响应数据后,先等待8个时钟周期再拉高片选CS信号,此时判断返回的响应数据。如果返回的数据为复位完成信号0x01,在接收返回信息期间片选CS为低电平, 此时SD NAND进入SPI模式,并开始进行下一步,如果返回的值为其它值,则重新执行第2步;
4.拉低片选CS引脚,发送命令CMD8(0x48)查询SD NAND的版本号,只有SD2.0版本才支持此命令,命令发送完成后等待SD NAND返回响应数据;
5.SD NAND返回响应数据后,先等待8个时钟周期再拉高片选CS信号,此时判断返回的响应数据。如果返回的电压范围为4’b0001即2.7V~3.6V,说明2.0版本,进行下一步,否则重新执行第4步;
6.拉低片选CS引脚,发送命令CMD55(0x77)告诉SD NAND下一次发送的命令是应用相关命令,命令发送完成后等待SD NAND返回响应数据;
7.SD NAND返回响应数据后,先等待8个时钟周期再拉高片选CS信号,此时判断返回的响应数据。如果返回的数据为空闲信号0x01,开始进行下一步,否则重新执行第6步。
8.拉低片选CS引脚,发送命令ACMD41(0x69)查询SD NAND是否初始化完成,命令发送完成后等待SD NAND返回响应数据;
9.SD NAND返回响应数据后,先等待8个时钟周期再拉高片选CS信号,此时判断返回的响应数据。如果返回的数据为0x00,此时初始化完成,否则重新执行第6步。
③ 写操作时序
至此,SD NAND完成了复位以及初始化操作,进入到SPI模式的读写操作。SD NAND读写一次的数据量必须为512字节的整数倍,即对SD NAND读写操作的最少数据量为512 个字节。我们可以通过命令CMD16来配置单次读写操作的数据长度,以使每次读写的数据量为 (n*512)个字节(n≥1),本次SD NAND的读写操作使用默认配置,即单次读写操作的数据量为512个字节。
SD NAND的写操作时序图如下图所示:
SD NAND,贴片式TF卡,贴片式SD卡
拉低片选信号 CS_N,向 SD NAND写入命令 CMD24,命令号为 0x58,携带参数为 4字节的 SD NAND写扇区地址,CRC 校验字节未使用直接写入 0xFF,命令发送完成后 等待 SD NAND返回响应数据
若 SD NAND返回正确响应数据 R1 为 0x00,等待 8 个时钟周期,向 SD NAND写入令牌0xFE,紧随其后写入 512 个字节的数据
数据发送完成后,再向 SD NAND写入 2 个字节的 CRC 校验字节。SPI 模式下不对数据进行 CRC 校验,直接写入两个字节的 0xFF
校验数据发送完成后, SD NAND会有响应数据返回,随后 SD NAND将 Miso 信号拉低进入写忙状态
MISO 信号再次拉高后 SD NAND退出写忙状态,等待 8 个时钟周期后拉高片选信号,SD NAND数据写操作完成,可以执行其它操作
④ 读操作时序
SD NAND的读操作时序图如下图所示:
SD NAND,贴片式TF卡,贴片式SD卡
1.拉低片选信号 CS_N, 向 SD NAND写入命令 CMD17,命令号为 0x51,携带参数为 4字节的 SD NAND读扇区地址,CRC 校验字节未使用直接写入 0xFF,命令发送完成后 等待 SD NAND返回响应数据
2.若 SD NAND返回正确响应数据 R1 为 0x00,以 SD NAND返回的数据头 0xFE 为标志,接收自 SD NAND读出的 512 字节数据和 2 字节的 CRC 校验字节
3.解析到数据头 0xFE 后,接下来接收 SD NAND返回的 512 个字节的数据
4.数据解析完成后,接下来接收2个字节的 CRC 校验值。 由于 SPI 模式下不对数据进行 CRC 校验,可直接忽略这两个字节
5.CRC 校验字节接收完毕,等待 8 个时钟周期,拉高片选信号 CS_N,一次数据读操作完成
⑤ 程序设计
通过前面介绍的SD NAND初始化、写操作以及读操作可知,SD NAND的这3个操作是相互独立且不能同时进行的,因此我们可以将SD NAND的初始化、写操作以及读操作分别划分为3个独立的模块,最后将这三个模块例化在SD NAND的控制器模块中,便于在其它工程项目中使用。
下图是系统框图,PLL时钟模块(PLL)为各个模块提供驱动时钟,SD NAND测试数据产生模块产生测试数据写入SD NAND,写完后从SD NAND中读出数据,最终读写测试结果由LED显示模块通过控制LED灯的显示状态来指示。
SD NAND,贴片式TF卡,贴片式SD卡
顶层模块:顶层模块完成了对其它四个模块的例化,SD NAND测试数据产生模块产生的开始写入信号及数据连接至SD NAND控制器模块,数据写完后从SD NAND控制器中读出数据, 并验证数据的正确性,将验证的结果连接至LED显示模块。
PLL时钟模块:PLL时钟模块通过调用锁相环(PLL)IP核来实现,总共输出2个时钟,频率都是50Mhz,但两个时钟相位相差180度。我们知道,SD卡的SPI通信模式为CPOL=1, CPHA=1;即SPI_CLK在空闲时为高电平,数据发送是在时钟的第一个边沿,也就是SPI_CLK由高 电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。为了在程序代码中统 一使用上升沿,我们使用两个相位相差180度的时钟来对SD NAND进行操作。
SD NAND测试数据产生模块:SD NAND测试数据产生模块产生的开始写入信号和数据写入SD NAND控制器模块中,数据写完后从SD NAND控制器中读出数据,并验证数据的正确性,将验证的结果发送给LED显示模块。
SD NAND控制器模块:SD NAND控制器模块例化了SD NAND初始化模块、 SD NAND写数据模块和SD NAND读数据模块。SD NAND初始化模块完成对SD NAND的上电初始化操作;SD NAND写数据模块完成对SD NAND的写操作;SD NAND读数据模块完成对SD NAND的读操作。 由于这三个模块都操作了SD NAND的引脚信号,且这三个模块在同一时间内不会同时操作,所以此模块实现了对其它三个模块的例化以及选择SD NAND的引脚连接至其中某一个模块。
LED显示模块:LED显示模块将SD NAND测试数据产生模块输出的验证结果值, 通过控制LED灯的显示状态来指示。
SD NAND控制器部分代码如下:
module sd_ctrl_top(
input clk_ref , //时钟信号
input clk_ref_180deg, //时钟信号,与clk_ref相位相差180度
input rst_n , //复位信号,低电平有效
//SD卡接口
input sd_miso , //SD卡SPI串行输入数据信号
output sd_clk , //SD卡SPI时钟信号
output reg sd_cs , //SD卡SPI片选信号
output reg sd_mosi , //SD卡SPI串行输出数据信号
//用户写SD卡接口
input wr_start_en , //开始写SD卡数据信号
input [31:0] wr_sec_addr , //写数据扇区地址
input [15:0] wr_data , //写数据
output wr_busy , //写数据忙信号
output wr_req , //写数据请求信号
//用户读SD卡接口
input rd_start_en , //开始读SD卡数据信号
input [31:0] rd_sec_addr , //读数据扇区地址
output rd_busy , //读数据忙信号
output rd_val_en , //读数据有效信号
output [15:0] rd_val_data , //读数据
output sd_init_done //SD卡初始化完成信号
);
//wire define
wire init_sd_clk ; //初始化SD卡时的低速时钟
wire init_sd_cs ; //初始化模块SD片选信号
wire init_sd_mosi ; //初始化模块SD数据输出信号
wire wr_sd_cs ; //写数据模块SD片选信号
wire wr_sd_mosi ; //写数据模块SD数据输出信号
wire rd_sd_cs ; //读数据模块SD片选信号
wire rd_sd_mosi ; //读数据模块SD数据输出信号
//*****************************************************
//** main code
//*****************************************************
//SD卡的SPI_CLK
assign sd_clk = (sd_init_done==1'b0) ? init_sd_clk : clk_ref_180deg;
//SD卡接口信号选择
always @(*) begin
//SD卡初始化完成之前,端口信号和初始化模块信号相连
if(sd_init_done == 1'b0) begin
sd_cs = init_sd_cs;
sd_mosi = init_sd_mosi;
end
else if(wr_busy) begin
sd_cs = wr_sd_cs;
sd_mosi = wr_sd_mosi;
end
else if(rd_busy) begin
sd_cs = rd_sd_cs;
sd_mosi = rd_sd_mosi;
end
else begin
sd_cs = 1'b1;
sd_mosi = 1'b1;
end
end
//SD卡初始化
sd_init u_sd_init(
.clk_ref (clk_ref),
.rst_n (rst_n),
.sd_miso (sd_miso),
.sd_clk (init_sd_clk),
.sd_cs (init_sd_cs),
.sd_mosi (init_sd_mosi),
.sd_init_done (sd_init_done)
);
//SD卡写数据
sd_write u_sd_write(
.clk_ref (clk_ref),
.clk_ref_180deg (clk_ref_180deg),
.rst_n (rst_n),
.sd_miso (sd_miso),
.sd_cs (wr_sd_cs),
.sd_mosi (wr_sd_mosi),
//SD卡初始化完成之后响应写操作
.wr_start_en (wr_start_en & sd_init_done),
.wr_sec_addr (wr_sec_addr),
.wr_data (wr_data),
.wr_busy (wr_busy),
.wr_req (wr_req)
);
//SD卡读数据
sd_read u_sd_read(
.clk_ref (clk_ref),
.clk_ref_180deg (clk_ref_180deg),
.rst_n (rst_n),
.sd_miso (sd_miso),
.sd_cs (rd_sd_cs),
.sd_mosi (rd_sd_mosi),
//SD卡初始化完成之后响应读操作
.rd_start_en (rd_start_en & sd_init_done),
.rd_sec_addr (rd_sec_addr),
.rd_busy (rd_busy),
.rd_val_en (rd_val_en),
.rd_val_data (rd_val_data)
);
endmodule
SD NAND控制器模块输出的sd_init_done(SD NAND初始化完成信号)连接至SD NAND测试数据产生模块,只有在SD NAND初始化完成之后(sd_init_done为高电平),才能对SD NAND进行读写测试。SD NAND控制器模块将SD NAND的初始化以及读写操作封装成方便用户调用的接口,SD NAND测试数据产生模块只需对SD NAND控制器模块的用户接口进行操作即可完成对SD NAND的读写操作。
6.2、仿真结果
一般的测试中,我们都需要先进行仿真来观察时序等测试行为。此次实验由于找不到好的SD NAND的Verilog模型,所以仿真测试略。
6.3、实验结果
上文已经说了常用的相机中的TF卡与工业级的SD NAND(贴片式T卡)的区别,所以本次实验我选用的是深圳雷龙公司的一款SD NAND产品----CSNP32GCR01-AOW。
SD NAND,贴片式TF卡,贴片式SD卡
这是一家专业做存储产品的公司,NAND Flash是其主要产品。 该公司专注NAND Flash设计研发13年,在这一块可以说是相当专业。如果你对NAND Flash仍有疑惑的问题,或者你想在你的设计中使用NAND Flash产品,都可以直接联系:深圳市雷龙发展有限公司
实验结果其实没什么好看的,LED灯常量表明说明从SD NAND读出的512个字节(256个16位数据) 与写入的数据相同,SD NAND读写测试程序下载验证成功。
PS:有个小细节可以说下,雷龙公司的SD NAND开发板还是蛮用心的,封装都是标准的Micro SD的封装,只要你的FPGA开发板上有SD卡座,就可以直接插上使用了,即插即用十分方便,有心了。
SD NAND,贴片式TF卡,贴片式SD卡
SD NAND,贴片式TF卡,贴片式SD卡
————————————————
【本文转载自CSDN,作者:孤独的单刀】
亲爱的卡友们,如果看完文章之后还是有疑惑或不懂的地方,请联系我们,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,深圳市雷龙发展专注存储行业13年,专业提供小容量存储解决方案。
七.SDIO外设结构体
其实前面关于SDIO寄存器的讲解已经比较详细了,这里再借助于关于SDIO结构体再进行总结一遍。
标准库函数对 SDIO 外设建立了三个初始化结构体,分别为 SDIO 初始化结构体SDIO_InitTypeDef、SDIO 命令初始化结构体 SDIO_CmdInitTypeDef 和 SDIO 数据初始化结
构体 SDIO_DataInitTypeDef。这些结构体成员用于设置 SDIO 工作环境参数,并由 SDIO 相应初始化配置函数或功能函数调用,这些参数将会被写入到 SDIO 相应的寄存器,达到配置 SDIO 工作环境的目的。
至于为什么需要一个命令结构体与数据结构体,就是为了方便我们配置SDIO关于寄存器位,因为发送命令或者数据需要很多参数配置。
1.SDIO初始化结构体
SDIO 初始化结构体用于配置 SDIO 基本工作环境,比如时钟分频、时钟沿、数据宽度等等。它被 SDIO_Init 函数使用。
1.png
1) SDIO_ClockEdge:主时钟 SDIOCLK 产生 CLK 引脚时钟有效沿选择,可选上升沿或下降沿。
2.png
2) SDIO_ClockBypass:时钟分频旁路使用,可选使能或禁用,如果使能旁路,SDIOCLK (72MHZ )直接驱动 CLK 线输出时钟(不满足最高25HZ的要求),如果禁用,使用 SDIO_CLKCR 寄存器的 CLKDIV 位值分频 SDIOCLK,然后输出到 CLK 线。一般选择禁用时钟分频旁路。
3.png
3) SDIO_ClockPowerSave:节能模式选择,可选使能或禁用,它设定 SDIO_CLKCR 寄存器的 PWRSAV 位的值。如果使能节能模式,CLK 线只有在总线激活时才有时钟输出;如果禁用节能模式,始终使能 CLK 线输出时钟。
4.png
4) SDIO_BusWide:数据线宽度选择,可选 1 位数据总线、4 位数据总线或 8 为数据总线,系统默认使用 1 位数据总线,操作 SD 卡时在数据传输模式下一般选择 4 位数据总线。它设定 SDIO_CLKCR 寄存器的 WIDBUS 位的值。
5.png
5) SDIO_HardwareFlowControl:硬件流控制选择,可选使能或禁用,它设定SDIO_CLKCR 寄存器的 HWFC_EN 位的值。硬件流控制功能可以避免 FIFO 发送上溢和下溢错误。
6.png
6) SDIO_ClockDiv:时钟分频系数,它设定 SDIO_CLKCR 寄存器的 CLKDIV 位的值,设置 SDIOCLK 与 CLK 线输出时钟分频系数:
CLK 线时钟频率=SDIOCLK/([CLKDIV+2])。
7.png
2.SDIO命令初始化结构体
8.png
1) SDIO_Argument:作为命令的一部分发送到卡的命令参数,它设定 SDIO 参数寄存器(SDIO_ARG)的值。
9.png
(2) SDIO_CmdIndex:命令号选择,它设定 SDIO 命令寄存器(SDIO_CMD)的 CMDINDEX位的值。
10.png
(3) SDIO_Response:响应类型,SDIO 定义两个响应类型:长响应和短响应。根据命令号选择对应的响应类型。SDIO 定义了四个 32 位的 SDIO 响应寄存器(SDIO_RESPx,x=1…4),短响应只用SDIO_RESP1,长响应使用4个(SDIO_RESPx,x=1…4)。
11.png
1)命令响应寄存器
12.png
2)SDIO响应寄存器1~4
13.png
4) SDIO_Wait:等待类型选择,有三种状态可选,一种是无等待状态,超时检测功能启动,一种是等待中断,另外一种是等待传输完成。
14.png
5) SDIO_CPSM:命令路径状态机控制,可选使能或禁用 CPSM。它设定 SDIO_CMD 寄存器的 CPSMEN 位的值15.png
只要我们使能的了命令状态机,则下面发送命令和接收响应的过程中的状态转换就不用我们管了
16.png
当我们要发送命令,我们只需要配置这个命令初始化结构体的成员,然后调用下图这个函数,则我们配置的参数写入对应的寄存器位中。
17.png
3.SDIO数据初始化结构体
18.png
1) SDIO_DataTimeOut:设置数据传输以卡总线时钟周期表示的超时周期,它设定 SDIO数据定时器寄存器(SDIO_DTIMER)的值。在 DPSM 进入 Wait_R 或繁忙状态后开始递减,直到 0 还处于以上两种状态则将超时状态标志置 1(详情前面的数据通道小节)。
19.png
2) SDIO_DataLength:设置传输数据长度。
20.png
3) SDIO_DataBlockSize:设置数据块大小,有多种尺寸可选,不同命令要求的数据块可能不同。
21.png
4) SDIO_TransferDir:数据传输方向,可选从主机到卡的写操作,或从卡到主机的读操作。
22.png
5) SDIO_TransferMode:数据传输模式,可选数据块或数据流模式。对于 SD 卡操作使用数据块类型。
23.png
6) SDIO_DPSM:数据路径状态机控制,可选使能或禁用 DPSM。它设定 SDIO_DCTRL寄存器的 DTEN 位的值。要实现数据传输都必须使能 SDIO_DPSM。24.png
与命令一样使能了数据路径状态机,就不用高那么多麻烦的状态转换了
八.SD卡读写测试实验
我们平时使用的SD 卡都是已经包含有文件系统的,一般不会使用本实验的操作方式读写 SD 卡,但是对学习SD卡的驱动原理非常重要!!!
本实验是进行 SD卡最底层的数据读写操作,直接使用 SDIO 对 SD 卡进行读写,会损坏 SD 卡的文件系统,导致数据丢失,所以做这个实验之前需要备份SD卡数据。
主要是学习SD卡的卡识别过程,以及数据传输工过程,其实就是完全依照前面的两个流程图来实现代码的。
卡识别模式流程图25.png
数据传输流程图
26.png
1.硬件设计
原理图:
27.png
实物图:
28.png
我这里用的是CS创世的贴片式SD卡,也称之为SD NAND , 内部存储单元架构为SLC,适合存代码。直接上板时相比于拔插式SD卡在抗震和抗PIN氧化方面更有优势,对于缩小整板体积也有一定帮助。
在这里插入图片描述
详情请参考:雷龙官网
30.png
2.代码讲解
先看主函数:
31.png
32.png
SD_Terst函数:
33.png
我们主要讲解的就是SD卡的初始化
34.png
SD_Init()函数:
/**
* 函数名:SD_Init
* 描述:初始化SD卡,使卡处于就绪状态(准备传输数据)
* 输入:无
* 输出:-SD_Error SD卡错误代码
* 成功时则为 SD_OK
* 调用:外部调用
*/SD_Error SD_Init(void){
/*重置SD_Error状态*/
SD_Error errorstatus = SD_OK;
NVIC_Configuration();
/* SDIO 外设底层引脚初始化 */
GPIO_Configuration();
/*对SDIO的所有寄存器进行复位*/
SDIO_DeInit();
/*上电并进行卡识别流程,确认卡的操作电压*/
errorstatus = SD_PowerON();
/*如果上电,识别不成功,返回“响应超时”错误 */
if (errorstatus != SD_OK)
{
/*!< CMD Response TimeOut (wait for CMDSENT flag) */
return(errorstatus);
}
/*卡识别成功,进行卡初始化*/
errorstatus = SD_InitializeCards();
if (errorstatus != SD_OK) //失败返回
{
/*!< CMD Response TimeOut (wait for CMDSENT flag) */
return(errorstatus);
}
/* 配置SDIO外设
* 上电识别,卡初始化都完成后,进入数据传输模式,提高读写速度
*/
/* SDIOCLK = HCLK, SDIO_CK = HCLK/(2 + SDIO_TRANSFER_CLK_DIV) */
SDIO_InitStructure.SDIO_ClockDiv = SDIO_TRANSFER_CLK_DIV;
/*上升沿采集数据 */
SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;
/* Bypass模式使能的话,SDIO_CK不经过SDIO_ClockDiv分频 */
SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable;
/* 若开启此功能,在总线空闲时关闭sd_clk时钟 */
SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
/* 暂时配置成1bit模式 */
SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;
/* 硬件流,若开启,在FIFO不能进行发送和接收数据时,数据传输暂停 */
SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
SDIO_Init(&SDIO_InitStructure);
if (errorstatus == SD_OK)
{
/* 用来读取csd/cid寄存器 */
errorstatus = SD_GetCardInfo(&SDCardInfo);
}
if (errorstatus == SD_OK)
{
/* 通过cmd7,rca选择要操作的卡 */
errorstatus = SD_SelectDeselect((uint32_t) (SDCardInfo.RCA << 16));
}
if (errorstatus == SD_OK)
{
/* 最后为了提高读写,开启4bits模式 */
errorstatus = SD_EnableWideBusOperation(SDIO_BusWide_4b);
}
return(errorstatus);}
接下来逐段代码来分析一下:
35.png
errorstatus其实是一个SD_Error类型的枚举变量,SD_Error 是
列举了控制器可能出现的错误、比如 CRC 校验错误、CRC 校验错误、通信等待超时、FIFO 上溢或下溢、擦除命令错误等等。这些错误类型部分是控制器系统寄存器的标志位,部分是通过命令的响应内容得到的,如果是SD_OK则代表没有发送错误,
36.png
配置SDIO中断:
37.png
38.png
SDIO 外设底层引脚初始化
39.png
40.png
复位所有SDIO寄存器
41.png
42.png
重点来了:调用SD_PowerON()进入卡识别模式
43.png
/*
* 函数名:SD_PowerON
* 描述:确保SD卡的工作电压和配置控制时钟
* 输入:无
* 输出:-SD_Error SD卡错误代码
* 成功时则为 SD_OK
* 调用:在 SD_Init() 调用
*/SD_Error SD_PowerON(void){
SD_Error errorstatus = SD_OK;
uint32_t response = 0, count = 0, validvoltage = 0;
uint32_t SDType = SD_STD_CAPACITY;
/********************************************************************************************************/
/* 上电初始化
* 配置SDIO的外设
* SDIOCLK = HCLK, SDIO_CK = HCLK/(2 + SDIO_INIT_CLK_DIV)
* 初始化时的时钟不能大于400KHz
*/
/* HCLK = 72MHz, SDIOCLK = 72MHz, SDIO_CK = HCLK/(178 + 2) = 400 KHz */
SDIO_InitStructure.SDIO_ClockDiv = SDIO_INIT_CLK_DIV;
SDIO_InitStructure.SDIO_ClockEdge = SDIO_ClockEdge_Rising;
/* 不使用bypass模式,直接用HCLK进行分频得到SDIO_CK */
SDIO_InitStructure.SDIO_ClockBypass = SDIO_ClockBypass_Disable;
/* 空闲时不关闭时钟电源 */
SDIO_InitStructure.SDIO_ClockPowerSave = SDIO_ClockPowerSave_Disable;
/* 初始化的时候暂时先把数据线配置成1根 */
SDIO_InitStructure.SDIO_BusWide = SDIO_BusWide_1b;
/* 失能硬件流控制 */
SDIO_InitStructure.SDIO_HardwareFlowControl = SDIO_HardwareFlowControl_Disable;
SDIO_Init(&SDIO_InitStructure);
/* 开启SDIO外设的电源 */
SDIO_SetPowerState(SDIO_PowerState_ON);
/* 使能 SDIO 时钟 */
SDIO_ClockCmd(ENABLE);/********************************************************************************************************/
/* 下面发送一系列命令,开始卡识别流程
* CMD0: GO_IDLE_STATE(复位所以SD卡进入空闲状态)
* 没有响应
*/
SDIO_CmdInitStructure.SDIO_Argument = 0x0;
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_GO_IDLE_STATE;
/* 没有响应 */
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_No;
/* 关闭等待中断 */
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
/* CPSM在开始发送命令之前等待数据传输结束 */
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
/* 检测是否正确接收到cmd0 */
errorstatus = CmdError();
/* 命令发送出错,返回 */
if (errorstatus != SD_OK)
{
/* CMD Response TimeOut (wait for CMDSENT flag) */
return(errorstatus);
}/********************************************************************************************************/
/* CMD8: SEND_IF_COND
* 发送 CMD8 检查SD卡的电压操作条件
*
* 参数: - [31:12]: 保留 (要被设置为 '0')
* - [11:8] : 支持的电压 (VHS) 0x1 (范围: 2.7-3.6 V)
* - [7:0]: 校验模式 (推荐 0xAA)
* 响应类型: R7
*/
/* 接收到命令sd会返回这个参数 */
SDIO_CmdInitStructure.SDIO_Argument = SD_CHECK_PATTERN;
SDIO_CmdInitStructure.SDIO_CmdIndex = SDIO_SEND_IF_COND;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
/*检查是否接收到命令*/
errorstatus = CmdResp7Error();
/* 有响应则card遵循sd协议2.0版本 */
if (errorstatus == SD_OK)
{
/* SD Card 2.0 ,先把它定义会sdsc类型的卡 */
CardType = SDIO_STD_CAPACITY_SD_CARD_V2_0;
/* 这个变量用作ACMD41的参数,用来询问是sdsc卡还是sdhc卡 */
SDType = SD_HIGH_CAPACITY;
}
else /* 无响应,说明是1.x的或mmc的卡 */
{
/* 发命令 CMD55 */
SDIO_CmdInitStructure.SDIO_Argument = 0x00;
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
errorstatus = CmdResp1Error(SD_CMD_APP_CMD);
}
/* CMD55
* 发送cmd55,用于检测是sd卡还是mmc卡,或是不支持的卡
* CMD 响应: R1
*/
SDIO_CmdInitStructure.SDIO_Argument = 0x00;
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
/* 是否响应,没响应的是mmc或不支持的卡 */
errorstatus = CmdResp1Error(SD_CMD_APP_CMD); /********************************************************************************************************/
/* 若 errorstatus 为 Command TimeOut, 说明是MMC 卡
* 若 errorstatus 为 SD_OK ,说明是SD card: SD 卡 2.0 (电压范围不匹配)
* 或 SD 卡 1.x
*/
if (errorstatus == SD_OK) //响应了cmd55,是sd卡,可能为1.x,可能为2.0
{
/*下面开始循环地发送sdio支持的电压范围,循环一定次数*/
/* SD CARD
* 发送 ACMD41 SD_APP_OP_COND ,带参数 0x80100000
*/
while ((!validvoltage) && (count < SD_MAX_VOLT_TRIAL))
{
/* 在发送ACMD命令前都要先向卡发送CMD55
* 发送 CMD55 APP_CMD , RCA 为 0
*/
SDIO_CmdInitStructure.SDIO_Argument = 0x00;
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_APP_CMD;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
errorstatus = CmdResp1Error(SD_CMD_APP_CMD);
if (errorstatus != SD_OK)
{
return(errorstatus);
}
/* ACMD41
* 命令参数由支持的电压范围及HCS位组成,HCS位置一来区分卡是SDSC还是SDHC
* 0:SDSC
* 1:SDHC
* 响应:R3,对应的是OCR寄存器
*/
SDIO_CmdInitStructure.SDIO_Argument = SD_VOLTAGE_WINDOW_SD | SDType;
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SD_APP_OP_COND;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
errorstatus = CmdResp3Error();
if (errorstatus != SD_OK)
{
return(errorstatus);
}
/* 若卡需求电压在SDIO的供电电压范围内,会自动上电并标志pwr_up位
* 读取卡寄存器,卡状态
*/
response = SDIO_GetResponse(SDIO_RESP1);
/* 读取卡的ocr寄存器的pwr_up位,看是否已工作在正常电压 */
validvoltage = (((response >> 31) == 1) ? 1 : 0);
count++; /* 计算循环次数 */
}
if (count >= SD_MAX_VOLT_TRIAL) /* 循环检测超过一定次数还没上电 */
{
errorstatus = SD_INVALID_VOLTRANGE; /* SDIO不支持card的供电电压 */
return(errorstatus);
}
/*检查卡返回信息中的HCS位*/
/* 判断ocr中的ccs位 ,如果是sdsc卡则不执行下面的语句 */
if (response &= SD_HIGH_CAPACITY)
{
CardType = SDIO_HIGH_CAPACITY_SD_CARD; /* 把卡类型从初始化的sdsc型改为sdhc型 */
}
}/* else MMC Card */
return(errorstatus); }
1.配置SDIO初始化结构体**
44.png
配置 SDIO_InitStructure 结构体变量成员并调用 SDIO_Init 库函数完成 SDIO 外设的基本配置,注意此处的 SDIO 时钟分频,由于处于卡识别阶段,其时钟不能超过 400KHz。45.png
2.发送CMD0命令:要SD卡回到空闲状态
46.png
47.png
那些检测标志全是来源与下图:
48.png
3.发送CMD8: 用来识别不同版本的卡和检测卡是否能在主机提供的电压下工作。
如果发送CMD8无响应:
1.电压不匹配的 2.0 以上 SD 卡
2.1.0 的 SD 卡
3.不是 SD 卡
如果发送CMD8有响应:
电压匹配的 2.0 以上 SD 卡(就是我们即将要使用的SD卡)
49.png
4.使用 ACMD41 命令判断卡的具体类型。因为是 A 类命令,所以在发送 ACMD41之前必须先发送 CMD55,CMD55 命令的响应类型的 R1。如果 CMD55 命令都没有响应说明是 MMC 卡或不可用卡。在正确发送 CMD55 之后就可以送ACMD41,并根据响应判断卡类型,ACMD41 的响应号为 R3,CmdResp3Error 函数用于检测命令正确发送并带有超时检测功能,但并不具备响应内容接收功能,需要在判定命令正确发送之后调用 SDIO_GetResponse 函数才能获取响应的内容。
实际上,在有响应时,SDIO 外设会自动把响应存放在 SDIO_RESPx 寄存器中,SDIO_GetResponse 函数只是根据形参返回对应响应寄存器的值。通过判定响应内容值即可确定 SD 卡类型。
50.png
51.png
总结:执行 SD_PowerON 函数无错误后就已经确定了 SD 卡类型,并说明卡和主机电压是匹配的,SD 卡处于卡识别模式下的准备状态。退出 SD_PowerON 函数返回SD_Init 函数,执行接下来代码。
执行 SD_PowerON 函数没有错误后:SD 卡处于卡识别模式下的准备状态
52.png
53.png
SD_InitializeCards()函数:
/*
* 函数名:SD_InitializeCards
* 描述:初始化所有的卡或者单个卡进入就绪状态
* 输入:无
* 输出:-SD_Error SD卡错误代码
* 成功时则为 SD_OK
* 调用:在 SD_Init() 调用,在调用power_on()上电卡识别完毕后,调用此函数进行卡初始化
*/SD_Error SD_InitializeCards(void){
SD_Error errorstatus = SD_OK;
uint16_t rca = 0x01;
if (SDIO_GetPowerState() == SDIO_PowerState_OFF)
{
errorstatus = SD_REQUEST_NOT_APPLICABLE;
return(errorstatus);
}
/* 判断卡的类型 */
if (SDIO_SECURE_DIGITAL_IO_CARD != CardType)
{
/* Send CMD2 ALL_SEND_CID
* 响应:R2,对应CID寄存器
*/
SDIO_CmdInitStructure.SDIO_Argument = 0x0;
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_ALL_SEND_CID;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Long;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
errorstatus = CmdResp2Error();
if (SD_OK != errorstatus)
{
return(errorstatus);
}
/* 将返回的CID信息存储起来 */
CID_Tab[0] = SDIO_GetResponse(SDIO_RESP1);
CID_Tab[1] = SDIO_GetResponse(SDIO_RESP2);
CID_Tab[2] = SDIO_GetResponse(SDIO_RESP3);
CID_Tab[3] = SDIO_GetResponse(SDIO_RESP4);
}/********************************************************************************************************/
if ( (SDIO_STD_CAPACITY_SD_CARD_V1_1 == CardType)
||(SDIO_STD_CAPACITY_SD_CARD_V2_0 == CardType)
||(SDIO_SECURE_DIGITAL_IO_COMBO_CARD == CardType)
||(SDIO_HIGH_CAPACITY_SD_CARD == CardType) ) /* 使用的是2.0的卡 */
{
/* Send CMD3 SET_REL_ADDR with argument 0
* SD Card publishes its RCA.
* 响应:R6,对应RCA寄存器
*/
SDIO_CmdInitStructure.SDIO_Argument = 0x00;
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SET_REL_ADDR;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Short;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
/* 把接收到的卡相对地址存起来 */
errorstatus = CmdResp6Error(SD_CMD_SET_REL_ADDR, &rca);
if (SD_OK != errorstatus)
{
return(errorstatus);
}
}/********************************************************************************************************/
if (SDIO_SECURE_DIGITAL_IO_CARD != CardType)
{
RCA = rca;
/* Send CMD9 SEND_CSD with argument as card's RCA
* 响应:R2对应寄存器CSD(Card-Specific Data)
*/
SDIO_CmdInitStructure.SDIO_Argument = (uint32_t)(rca << 16);
SDIO_CmdInitStructure.SDIO_CmdIndex = SD_CMD_SEND_CSD;
SDIO_CmdInitStructure.SDIO_Response = SDIO_Response_Long;
SDIO_CmdInitStructure.SDIO_Wait = SDIO_Wait_No;
SDIO_CmdInitStructure.SDIO_CPSM = SDIO_CPSM_Enable;
SDIO_SendCommand(&SDIO_CmdInitStructure);
errorstatus = CmdResp2Error();
if (SD_OK != errorstatus)
{
return(errorstatus);
}
CSD_Tab[0] = SDIO_GetResponse(SDIO_RESP1);
CSD_Tab[1] = SDIO_GetResponse(SDIO_RESP2);
CSD_Tab[2] = SDIO_GetResponse(SDIO_RESP3);
CSD_Tab[3] = SDIO_GetResponse(SDIO_RESP4);
}/********************************************************************************************************/
/*全部卡初始化成功 */
errorstatus = SD_OK;
return(errorstatus);}
1.判断 SDIO 电源是否启动,如果没有启动电源返回错误。
54.png
2.发送CMD2命令 :是用于通知所有卡通过 CMD 线返回 CID 值,执行 CMD2 发送之后就可以使用 CmdResp2Error 函数获取 CMD2 命令发送情况,发送无错误后即可以使用 SDIO_GetResponse 函数获取响应内容,它是个长响应,我们把 CMD2 响应内容存放在 CID_Tab 数组内。55.png
3.发送CMD3命令,用于指示 SD 卡自行推荐 RCA 地址,CMD3 的响应为 R6 类型,CmdResp6Error 函数用于检查 R6 响应错误,它有两个形参,一个是命令号,这里为 CMD3,另外一个是 RCA 数据指针,这里使用 rca变量的地址赋值给它,使得在 CMD3 正确响应之后 rca 变量即存放 SD 卡的 RCA。56.png
CmdResp6Error 函数通用会对每个错误位进行必要的检测,如果发现有错误存在则直接返回对应错误类型。
57.png
执行完CmdResp6Error 函数之后返回到 SD_InitializeCards 函数中,如果判断无错误说明此刻 SD 卡已经处于数据传输模式。
58.png
4.发送 CMD9 给指定 RCA 的 SD 卡使其发送返回其 CSD 寄存器内容,这里的 RCA就是在 CmdResp6Error 函数获取得到的 rca。最后把响应内容存放在 CSD_Tab 数组中。59.png
在这里插入图片描述
执行 SD_InitializeCards 函数无错误后 SD 卡就已经处于数据传输模式下的待机状态,退出 SD_InitializeCards 后会返回前面的 SD_Init 函数,执行接下来代码,以下是 SD_Init 函数的后续执行过程:
60.png
1) 重新配置 SDIO 外设,提高时钟频率,之前的卡识别模式都设定 CMD 线时钟为小于 400KHz,进入数据传输模式可以把时钟设置为小于 25MHz,以便提高数据传输速率。
61.png
(2) 调用 SD_GetCardInfo 函数获取 SD 卡信息,它需要一个指向 SD_CardInfo 类型变量地址的指针形参,这里赋值为 SDCardInfo 变量的地址。SD 卡信息主要是 CID和 CSD 寄存器内容,这两个寄存器内容在 SD_InitializeCards 函数中都完成读取过程并将其分别存放在 CID_Tab 数组和 CSD_Tab 数组中,SD_GetCardInfo 函数只是简单的把这两个数组内容整合复制到 SDCardInfo 变量对应成员内。正确执行 SD_GetCardInfo 函数后,SDCardInfo 变量就存放了 SD 卡的很多状态信息,这在之后应用中使用频率是很高的。
62.png
结构体类型定义:有 SD_CSD、SD_CID、SD_CardStatus 以及 SD_CardInfo。SD_CSD 定义了 SD 卡的特定数据(CSD)寄存器位,一般提供 R2 类型的响应可以获取得到 CSD 寄存器内容。SD_CID 结构体类似 SD_CSD 结构体,它定义 SD 卡CID 寄存器内容,也是通过 R2 响应类型获取得到。SD_CardStatus 结构体定义了SD 卡状态,有数据宽度、卡类型、速度等级、擦除宽度、传输偏移地址等等 SD卡状态。SD_CardInfo 结构体定义了 SD 卡信息,包括了 SD_CSD 类型和 SD_CID类型成员,还有定义了卡容量、卡块大小、卡相对地址 RCA 和卡类型成员。
63.png
主要是存储卡的容量,卡的大小,RCA地址,卡的类型(这些是关键信息,由命令响应返回然后存入这个结构体中)
64.png
65.png
66.png
3) 调用 SD_SelectDeselect 函数用于选择特定 RCA 的 SD 卡,它实际是向 SD 卡发送CMD7。执行之后,卡就从待机状态转变为传输模式,可以说数据传输已经是万事俱备了
67.png
68.png
70.png
4) 扩展数据线宽度,之前的所有操作都是使用一根数据线传输完成的,使用 4 根数据线可以提高传输性能,调用可以设置数据线宽度,函数只有一个形参,用于指定数据线宽度。
71.png
至此,SD_Init 函数已经全部执行完成。如果程序可以正确执行,接下来就可以进行SD 卡读写以及擦除等操作。
72.png
SD_EraseTest()函数
73.png
SD_Erase()函数:
74.png
75.png
1) 检查 SD 卡是否支持擦除功能,如果不支持则直接返回错误。为保证擦除指令正常进行,要求主机一个遵循下面的命令序列发送指令:CMD32->CMD33->CMD38。如果发送顺序不对,SD 卡会设置 ERASE_SEQ_ERROR 位到状态寄存器
76.png
77.png
2) SD_Erase 函数发送 CMD32 指令用于设定擦除块开始地址,在执行无错误后发送CMD33 设置擦除块的结束地址。
78.png
3) 发送擦除命令 CMD38,使得 SD 卡进行擦除操作。SD 卡擦除操作由 SD 卡内部控制完成,不同卡擦除后是 0xff 还是 0x00 由厂家决定。擦除操作需要花费一定时间,这段时间不能对 SD 卡进行其他操作。
79.png
4) 通过 IsCardProgramming 函数可以检测 SD 卡是否处于编程状态(即卡内部的擦写状态),需要确保 SD 卡擦除完成才退出 SD_Erase 函数。IsCardProgramming 函数先通过发送CMD13 命令 SD 卡发送它的状态寄存器内容,并对响应内容进行分析得出当前 SD 卡的状态以及可能发送的错误。80.png
数据写入操作
81.png
82.png
83.png
SD_WriteBlock 函数用于向指定的目标地址写入一个块的数据,它有三个形参,分别为指向待写入数据的首地址的指针变量、目标写入地址和块大小。块大小一般都设置为512 字节。SD_WriteBlock 写入函数的执行流程如下:
1) SD_WriteBlock 函数开始时将 SDIO 数据控制寄存器 (SDIO_DCTRL)清零,复位之前的传输设置。
在这里插入图片描述
2) 对 SD 卡进行数据读写之前,都必须发送 CMD16 指定块的大小,对于标准卡,要写入BlockSize 长度字节的块;对于 SDHC 卡,写入固定为 512 字节的块。接下来就可以发送块写入命令 CMD24 通知 SD 卡要进行数据写入操作,并指定待写入数据的目标地址。
在这里插入图片描述
84.png
3) 利用 SDIO_DataInitTypeDef 结构体类型变量配置数据传输的超时、块数量、数据块大小、数据传输方向等参数并使用 SDIO_DataConfig 函数完成数据传输环境配置。
85.png
4) 调用 SDIO_ITConfig 函数使能 SDIO 数据结束传输结束中断,传输结束时,会跳转到SDIO 的中断服务函数运行。
5)SD_DMA_TxConfig 函数,配置使能 SDIO 数据向 SD 卡的数据传输的DMA 请求,为使 SDIO 发送 DMA 请求,需要调用
SDIO_DMACmd 函数使能。对于高容量的 SD 卡要求块大小必须为 512 字节,SDIO 外设会自动生成 DMA 发送请求,将指定数据使用 DMA 传输写入到 SD 卡内。
普通模式需要自己去处理那些溢出什么的太麻烦了,用DMA传输数据就好了
86.png
DMA外设配置(不清楚的参考:DMA外设详解):
87.png
88.png
写入操作等待函数
SD_WaitWriteOperation 函数用于检测和等待数据写入完成,在调用数据写入函数之后一般都需要调用,SD_WaitWriteOperation 函数适用于单块及多块写入函数。
89.png
SDIO 中断服务函数
在进行数据传输操作时都会使能相关标志中断,用于跟踪传输进程和错误检测。
SD_ProcessIRQSrc 函数首先判断全局变量 StopCondition 变量是否为 1,该全局变量在SDIO 的多块读写函数中被置 1(前面分析的单块读写函数中 StopCondition 均为 0),因为根据 SD 卡的要求,多块读写命令由 CMD12 结束,SD 卡在接收到该命令时才停止多块的传输,此处正是根据 StopCondition 的情况控制是否发送 CMD12 命令,它发送命令时直接采用往寄存器写入命令和参数的方式。
90.png
91.png
92.png
调用库函数 SD_DMAEndOfTransferStatus 一直检测 DMA 的传输完成标志,当 DMA 传输结束时,该函数会返回 SET 值。另外,while 循环中的判断条件使用的TransferEnd 和 TransferError 是全局变量,它们会在 SDIO 的中断服务函数根据传输情况被设置,传输结束后,根据 TransferError 的值来确认是否正确传输,若不正确则直接返回错
误代码。SD_WaitWriteOperation 函数最后是清除相关标志位并返回错误。
数据读取操作
同向 SD 卡写入数据类似,从 SD 卡读取数据可分为单块读取和多块读取。这里仅介绍单块读操作函数,多块读操作类似。
这一部分自己看代码吧,操作差不多,已经人麻了太多了。
93.png94.png
还有多块读取与多块写入,其实是一样的,只不过传输结束需要发送CMD12来结束传输。
总结:代码太多了,但是核心的东西已经讲完了,自己去看代码悟一下,其实前面的理论部分懂了,代码部分是完全按照理论来走的,只不过多了一点点细节,就这样咯,那些边边角角留给你们。
3.实验结果
在这里插入图片描述95.png
96.png
【本文转载自CSDN,作者:rivencode】
全文目录内容分为三篇【上/中/下】原文链接跳转如下:
SD NAND 的 SDIO在STM32上的应用详解(上篇): http://www.longsto.com/news/58.html
SD NAND 的 SDIO在STM32上的应用详解(中篇): http://www.longsto.com/news/59.html
SD NAND 的 SDIO在STM32上的应用详解(下篇): http://www.longsto.com/news/60.html
在芯片供应链紧张和客户订单急速增加的情况下,许多原本单价几块钱的芯片,价格普遍上涨了10倍、20倍甚至更多。为了缓解缺芯潮,深圳市雷龙发展推出基于北京君正产品的高性能多核异构跨界处理器X2000和低功耗物联网处理器X1600主控方案。
为什么需要X2000/X1600?雷龙发展为你解答,提供原厂技术支持.
君正X2000独有三核XBurst架构,兼容MIPS;内置DDR,降低整体成本;集成丰富软硬件,开发简易;尺寸小至6*8mm;提供官方技术支持&完整方案。其继承和发展了君正芯片低功耗的技术特点,芯片典型功耗<400mW,具备出色算力和微控制器的实时控制等特点,特别适用于各类消费、商业的嵌入式应用领域。如,智能商业、智能物联网、高端智能穿戴、音视频编解码、生物特征和图像识别等。
X1600拥有双核XBurst结构,兼容MIPS架构;典型功耗低至120mW,内置LPDDR2内存,降低整体成本;强大的互联能力、丰富的人机接口及工业控制专用模块和接口使得工程师开发简易。产品集成了高性能微处理器、微控制器内核及控制总线接口,具有应用面广、功耗低、尺寸小的特点。非常适用于各类消费、商业和工业控制的嵌入式应用领域。如基于二维码的智能商业、智能物联网、高端智能穿戴、生物特征和图像识别等。
X2000/X1600主要技术特点
X1600独特的双核结构:
XBurst@1+XBurst@0结构;大核擅长计算,小核擅长实时控制。
XBurst@是北京君正完全自主知识产权的32位RISCCPU内核,兼容MIPS架构。内核包含硬件浮点运算器、内存管理器。
丰富的信息安全功能:内置真随机数发生器;支持RSA-2048/AES-256/MD5/SHA/SHA2加密算法
集成的内存:片上内置32/64MByte LPDDR2。
强大的互联能力:网口、USB2.0 OTG、SPI(主从独立接口)。
工业控制专用模块和接口:CAN2.0B控制器、CDBUS。
丰富的人机接口:各种图像传感器、显示器、存储器和数据通信接口。
低功耗:典型运行功耗120mW,典型休眠功耗1.5mW。
X1600的芯片结构图
SD NAND,贴片式TF卡,贴片式SD卡
X2000独特的三核结构:双核XBurst@2+XBurst@0结构;主核采用最新一代高性能处理器内核XBurst@2,小核擅长实时控制。XBurst@是北京君正完全自主知识产权的32位RISCCPU内核,兼容MIPS架构。内核包含128-bitSIMD扩展指令、硬件浮点运算单元、内存管理单元。
SD NAND,贴片式TF卡,贴片式SD卡
丰富的信息安全功能:内置真随机数发生器;支持AES-256/RAS-2048/MD5/SHA/SHA2加密算法。
集成的内存:片上内置128/256MByte LPDDR2/3。
强大的互联能力:千兆网口,支持IEEE1588-2002标准。
出色的多媒体能力:VPU支持H.264编解码,分辨率达1080p@30fps;双ISP,支持双摄同步。
丰富的接口:各种音视频\显示器\存储器和数据通信接口。
X2000的芯片结构图
SD NAND,贴片式TF卡,贴片式SD卡
X2000/X1600应用场景丰富
1、搭载X2000的3D人脸可视猫眼智能锁
SD NAND,贴片式TF卡,贴片式SD卡
3D人脸可视猫眼智能锁搭载有北京君正的X2000芯片,君正X2000芯片拥有超高效率,支持SmartH.264编码引擎,全实时性能;支持低功耗快速启动,前端误报过滤算法;支持200万高清分辨率,采用新一代ISP降噪技术。典型200万编码场景芯片功耗低于300mW,非常适合用来做高性价比的低功耗摄像头方案,帮助企业和用户在享受到超高性能的同时也节约了一大笔额外投入。
2、搭载君正X2000处理器的低功耗人脸识别智能门锁方案
SD NAND,贴片式TF卡,贴片式SD卡
智能门锁市场存量大,增长快,潜力大,作为智能家居的入口被市场普遍看好。最近两年人脸识别解锁方案越来越多,大都是基础的双目方案,功能和产品同质化严重。市场对于集成度高,效果好,功耗低的方案需求越来越紧迫。先智电子基于君正X2000系列的双目近红外人脸识别模组SG4898智能锁方案:具有识别安全性高、识别速度快、识别角度大、准确率高的、可拓展性强等优势。可帮助客户快速的将产品导入量产和打开市场。
3、基于君正X2000芯片的3D工业相机量产方案
随着3D机器视觉应用场景的不断扩大,出现了越来越多的超低成本应用新需求,产品的价格和功能需求正好介于当前的3D工业相机和消费类3D产品之间。图漾科技发布的这款基于君正X2000芯片的3D工业相机TM460是首款基于TOF的新产品,面向成本敏感的海量行业应用市场。它可以为行业和用户提供使用价值、降低部署成本。
亲,如果你在网站上没找到想要的信息可以联系我们,我们提供原厂技术支持,并提供君正集成电路完整解决方案,大大降低你的开发难度及开发时间,让你比同行更快一步,更好的解决方案都在电话里:13691982107(微信同号)。
大家都知道MCU是一种"麻雀"虽小,却"五脏俱全"的主控。它的应用领域非常广泛,小到手机手表,大到航空航天的设备上都会用到MCU.市面上目前几个主流厂商有意法半导体(其中最经典的一款就是STM32系列)、TI、NXP、Microchip、瑞萨等等。
那关于MCU的存储方面,以前基本上用内置的E2PROM,或者是外置的NOR Flash 就可以了。但随着物联网的兴起,MCU的应用越来越广泛了,逐渐的MCU会涉及到大容量的存储需求,用来存储音频,图片(GUI)、视频缓存、协议栈等等。我们知道MCU为了功耗,牺牲了很多性能,如果让MCU直接管理NAND Flash的话,复杂的驱动软件就会大量占用MCU的处理器资源,MCU没法干别的了。
那传统的E2PROM和NOR Flash就不够用了。这个时候MCU可能就需要用到NAND Flash了。但MCU采用NAND Flash,面临着新的挑战:
1、MCU主流厂商ST、TI、NXP、Microchip、瑞萨等基本都没有针对NAND Flash提供官方驱动,即使零星的系列有,但支持列表中的NAND Flash好多都停产了。
2、如果自己编写驱动。又要面对很多头疼的问题:1,使用NAND Flash要进行坏块管理,也需要做EDC/ECC等操作;
3、不同品牌之间的NAND Flash由于内部Block大小,page页的大小,时序等参数不同,都需要重新调试驱动;
4、即使理论上的功能都实现了,但大家都知道MCU为了低功耗,性能上做了妥协的。针对这么复杂的驱动程序,MCU也有心无力,让人感觉是小马拉大车。
那么针对MCU需要使用大容量的存储需求,有没有一种简单易用、稳定可靠的NAND Flash产品呢?答案是有,让我们隆重介绍一下SD NAND,也称之为贴片式T卡,贴片式TF卡,贴片式SD卡,贴片式内存卡,贴片式闪存卡,贴片式卡,贴片式U盘,贴片式UDP等等。
简单来说它的架构如下图。内部使用寿命最长、性能最稳定的SLC NAND Flash晶圆,擦写次数可以达到10万次。内置了特定的Flash控制器和针对NAND Flash管理的Firmware,硬件对外采用最为通用的SD接口,(MCU几乎都带有SD接口)。
那么SD NAND这个架构,带来了那些好处呢?
第一,兼容性强。基本上客户主控能用TF卡和SD卡,就能够使用SD NAND.如果换了新的主控,只要新主控有SD接口,基本上就能使用SD NAND Flash。
第二,尺寸小,焊接稳定。是LGA-8的封装,6x8mm的尺寸。PIN少,尺寸小,既能节约PCB板的面积,降低成本,还能让最终产品做的更小。
第三,容量合适。目前量产容量有128MB、512MB,4GB。后期会推出8GB等更高的容量,客户可根据需求选择适宜的容量,合理降低成本,使产品性价比最大化。
第四,简单易用。SD NAND内置坏块管理,平均读写,动态和静态的EDC/ECC算法等等,除了让产品的质量更稳定,更好的延长寿命,减少CPU的负荷。让针对NAND Flash的操作,都交给SD NAND,MCU可以不用再管了。
第五,使用寿命长,性能稳定。SLC NAND 是NAND Flash中使用寿命最长,性能最稳定的类型。可达10万次擦写寿命,让SD NAND十分的耐操。
CS(创世)SD NAND可以免驱动使用(所以也称不用写驱动NAND Flash)。相比较eMMC, CS(创世)SD NAND pin脚更少(方便焊接);容量更小(可以帮助客户降低成本); 擦写寿命更长;尺寸更小(占用PCB面积只有eMMC的1/3);节省PCB板层数(2层板即可使用)。
标准SDIO接口,兼容SPI/SD/eMMC接口,兼容各大MCU平台;内置EDC/ECC,坏块管理,垃圾回收算法;可机贴,锁定晶圆和控制器,一致性高;内置SLC晶圆,10W次擦写寿命,通过1万次随机掉电测试,支持工业级温度-40°~+85°。主要解决了主控(比如STM32系列的MCU单片机 )使用 SLC NAND FLASH,SPI NAND FLASH,eMMC等需要自己管理NAND FLASH的问题。让产品的质量更稳定,更好的延长产品的寿命。让MCU不再为管理NAND Flash而费神。
SD NAND 应用场景
· 替代 Nor Flash >> 1Gb SD NAND 与 256Mb Nor 价格相近 。
· 替代 SPI NAND >> 更快的读写速度,且内嵌坏块管理算法 。
· 替代 Micro SD >> 更小的尺寸、更好的可靠性。
SD NAND应用领域
物联网, 智能穿戴,音频播放器, 机器人,智能音箱,智能面板(HMI),移动支付,智能眼镜(AR),智能家居,医疗设备,轨道交通,人脸识别,3D打印机。
SD NAND合作主控
ST、TI、NXP、Atmel、君正、新唐、MTK、安霸、全志、建荣、杰理、钜力等平台。
CS创世合作客户
中国中车,中国航天科技集团,比亚迪,清华大学,糖猫,西门子,vtech等代表型客户。
CS创世增值服务
为了方便用户更快的改板,CS创世专门为客户提供配套的测试板/测试座,方便客户在开发板上验证功能,如果客户不会焊接,CS创世还会为客户提供焊接好的SD NAND测试板,客户拿到SD NAND后可直接测试无需自己焊接,非常的方便。
CS创世的优势
1. CS创世有Flash控制器软硬件开发的能力,可快速响应市场的需求;
2. CS创世有畅通的上游产业链的支持,确保稳定的Wafer供应;
3. CS创世有高品质封装和测试的配套,保证高品质的产出。
4. CS创世内部固件可定制。
5. CS创世提供原厂技术支持,STM32参考例程。
6. 交期快(针对前期的小批量,我们有足够的库存)。针对工业、医疗、车载、电力等行业客户,我们优先保障供货,免除您的后顾之忧。
综上所述,MCU使用了CS创世 SD NAND之后,MCU这匹小马可以欢快的奔腾了。把针对NAND Flash管理的大车,放心的交给SD NAND,可以看到针对MCU如何选择大容量存储NAND Flash,SD NAND是不二选择,简直就是"郎才女貌"。
PS. 如果因为某些原因暂时无法升级SD NAND 时,也可以考虑下列高性价比 NOR FLASH,目前有8MB(64Mbit)、16MB(128Mbit)容量可供选择,有兴趣的朋友可以跳转到产品详情页链接查看:http://www.longsto.com/product/44.html
欢迎光临,如果看完文章之后还是有疑惑或不懂的地方,请联系我们,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,深圳市雷龙发展专注存储行业13年,专业提供小容量存储解决方案。
在国内市场经济进入常态化的同时,各行业进入平稳增长的新常态,为了追求更大的利润,很多企业对于户外广告需求越来越大,力求通过户外广告来获得更大的收益。
其中户外LED广告屏已经占了户外广告的半壁江山,以其独特的显示效果替换了无数的广告招牌,目前新安装的户外广告中85%都会选择LED广告屏,可见市场前景广阔。LED广告屏安装方式有很多种,可挂墙安装、高炮立柱安装、吊装、镶嵌式安装等等。
前段时间小编遇到一个哭笑不得的趣事,有一个广西公安局的LED显示屏因为突然断电,以致数据缺失,结果显示成了(广西八女尸),这可是着实吓坏了不止小编在内的一个人,通过供应商的及时修复,虽然解决了问题,不过因为数据丢失的原因,闹出了一个这样的大乌龙笑话;小编也是替这个单位捏了一把汗....。图片就不上了,避嫌避嫌。
这不,刚遇到这样哭笑不得的事情,小编就遇到了一位做户外LED广告屏的客户,他最近比较烦,因为该客户收到一些反馈和投诉,让他非常头痛。
原来普遍的户外LED广告屏,由于功耗特别大,基本都是没有电池的,都是外接电源。相反,我们经常用到的手机是有电池的,即使突然断电对器件和数据方面都是没有影响的。而户外LED广告牌则不然,如果突然断电,加上没有电池缓冲,如果Flash此时正在读或者写的话,对它的冲击是非常大的,会导致Flash里面的数据丢失和不完整。
不用写驱动程序自带坏块管理的NAND Flash(贴片式TF卡),尺寸小巧,简单易用,兼容性强,稳定可靠,固件可定制,LGA-8封装,标准SDIO接口,兼容SPI/SD/eMMC接口,兼容各大MCU平台,可替代普通TF卡/SD卡,尺寸6x8mm毫米,内置SLC晶圆擦写寿命10万次,通过1万次随机掉电测试耐高低温,支持工业级温度-40°~+85°,机贴手帖都非常方便,速度级别Class10(读取速度23.5MB/S写入速度12.3MB/S)标准的SD2.0协议普通的SD卡可直接驱动,支持TF卡启动的SOC都可以用SD NAND,提供STM32参考例程及原厂技术支持,主流容量:128MB/512MB/4GB,比TF卡稳定,比eMMC便宜,样品免费试用。
很多广告主找他“反馈”,就是因为户外LED广告屏突然的断电,导致内部的存储芯片数据丢失。影响了广告主们的广告和品牌效果。才不断的找他投诉。因为突然的断电,广告主们为什么这么大反应呢?
1.一旦断电,第一就是要及时安排维修师傅过去,进行高空作业的进行维护和修理,人工和时间方面,都需要浪费很多成本。
2.品牌传播影响:一旦出问题,不显示和错误显示,就会影响广告主的品牌宣传效果,如果再闹出乌龙事件……。因此这个客户咨询到雷龙,是否有一种带掉电保护的NANDFlash。可以避免出现上面的情况。
而恰巧,我司旗下刚好有一款带掉电保护的Flash产品——SDIONANDFlash,由于内置了控制器和管理固件,即使在突然断电的情况下,也能完美的保证Flash内的数据完整性。这样遇到突然断电的情况,不需要付出人力和时间成本去维修,也能避免乌龙事件的发生带来的影响,无论是对户外LED广告屏的厂商,还是广告主都有提升品牌的作用。
而且我们带掉电保护的NAND FLASH除了内置控制器外,还有内置坏块管理,EDC/ECC,让产品的稳定性更上一个台阶。
K9F系列的是SLC结构的三星的系列NAND Flash 2.K9G系列的是MCL结构的NAND Flash
首先是存取次数。MLC架构理论上只能承受约1万次的数据写入,而SLC架构可承受约10万次,是MLC的10倍。这个1万次指的是数据写入次数,而非数据写入加读取的总次数。数据读取次数的多寡对闪存寿命有一定影响,但绝非像写入那样严重。
其次是读取和写入速度。这里仍存在认识上的误区,所有闪存芯片读取、写入或擦除数据都是在闪存控制芯片下完成的,闪存控制芯片的速度决定了闪存里数据的读取、擦除或是重新写入的速度。SLC技术被开发的年头远早于MLC技术,与之相匹配的控制芯片技术上已经非常成熟。
第三是功耗。SLC架构由于每Cell仅存放1bit数据,故只有高和低2种电平状态,使用1.8V的电压就可以驱动。
而MLC架构每Cell需要存放多个bit,即电平至少要被分为4档(存放2bit),所以需要有3.3V及以上的电压才能驱动。第四是出错率。在一次读写中SLC只有0或1两种状态,这种技术能提供快速的程序编程与读取,简单点说每Cell就像我们日常生活中使用的开关一样,只有开和关两种状态,非常稳定,就算其中一个Cell损坏,对整体的性能也不会有影响。
在一次读写中MLC有四种状态(以每Cell存取2bit为例),这就意味着MLC存储时要更精确地控制每个存储单元的充电电压,读写时就需要更长的充电时间来保证数据的可靠性。
它已经不再是简单的开关电路,而是要控制四种不同的状态,这在产品的出错率方面和稳定性方面有较大要求,而且一旦出现错误,就会导致2倍及以上的数据损坏,所以MLC对制造工艺和控制芯片有着更高的要求。
第五是制造成本。MLC技术原来每Cell仅存放1bit数据,而现在每Cell能存放2bit甚至更多数据,这些都是在存储体体积不增大的前提下实现的,所以相同容量大小的MLC NAND Flash制造成本要远低于SLC NAND Flash。
亲爱的卡友们,如果看完文章之后还是有疑惑或不懂的地方,请联系我们,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,深圳市雷龙发展专注存储行业13年,专业提供小容量存储解决方案。
*为便于理解并省去容量单位转换的麻烦,以下容量单位均使用Byte单位(128Mbit=16MByte)
前言:
NOR FLASH 是市场上两种主要的非易失闪存技术之一。Intel于1988年首先开发出NOR Flash 技术(实际上是东芝的富士雄率先开发出来的),彻底改变了原先由EPROM(Erasable Programmable Read-Only-Memory电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)一统天下的局面。紧接着,1989年,东芝公司发表了NAND Flash 结构,强调降低每比特的成本,有更高的性能,并且像磁盘一样可以通过接口轻松升级。NOR Flash 的特点是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。NOR 的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响到它的性能。NAND的结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于Flash的管理需要特殊的系统接口。通常读取NOR的速度比NAND稍快一些,而NAND的写入速度比NOR快很多,在设计中应该考虑这些情况。
正文:
随着物联网的兴起,MCU的应用也越来越广泛了,以前基本上用内置的EEPROM或者外置小容量NOR Flash就可以满足大部分需求,随着技术发展和应用要求的提高,逐渐的MCU需要实现的功能也越来越多,实现更多功能的同时需要存储的数据量也在增大,比如系统增大、存储音频、图片(GUI)、视频缓存、协议栈等等…
一般情况下NOR FLASH的用户在容量不够用时直接升级为更高一级容量的NOR FLASH 就可以了,不过也有二般情况,由于NOR的单元结构相对较大的原因,当容量达到一定程度时性价比会异常的低,结合生产工艺和目前的市场情况来看,16MB是一个分水岭,比16MB NOR Flash大一级的32MB NOR Flash 的价格相对于16MB NOR Flash 高出一大截,甚至比128MB的NAND Flash还要贵,雪上加霜的是这货供应状况还不佳,即使能接受32MB NOR Flash的价格并且把方案也开发好了,前期调试和试产都通过了,等到正式量产的时候买不到货… 就可能会错过整机产品销售的最佳时机。
这个时候有人会说:这些我都知道啊!我也想用NAND Flash啊!不过我的MCU不!支!持!NAND Flash啊!难不成我还要换平台从头再开发?
非也,今时不同往日,有个叫SD NAND的东东可供选择,NAND 架构、SD协议,只要是支持SD2.0 协议的MCU均可以使用。正常情况下使用SPI 模式,如果需要更快的速度并且IO口够用时可以使用SD模式。内置ECC、坏块管理、均衡擦写等等功能,这意味着用户不需要额外写驱动来管理NAND ,当然性能弱的MCU也做不到^^
由于SD NAND存储单元使用的是NAND 架构,所以NAND 持有的基础特性也继承了下来,SD NAND在这个基础上进一步做了优化,使得易用性和应用兼容性上大大提升。
我们先看一看NOR 与 NAND的区别都有哪些。
1.NOR Flash支持随机访问,所以支持XIP(execute In Place),NAND Flash需要按块进行读取,所以不支持XIP 。
2.NAND FLASH理论读取速度与NOR Flash相近,实际情况会根据接口不同有些差异。
3.NOR 与 NAND 写入前都需要先擦除,NOR在擦除时以64~128KB的块进行,执行一个写入/擦除操作的时间约5s,NAND在擦除时以8~32KB的块进行,执行一个写入/擦除操作的时间约4ms。
4.NAND 理论最大擦除次数比NOR多
5.NOR 驱动比NAND简单,NAND FLASH需要通过专门的NFI(NAND FLASH Interface)与Host端进行通信,驱动相对复杂。
6.所有Flash 都会有位反转的问题,NAND 位反转概率要比NOR高,NAND Flash 必须要使用ECC。
7.NAND的单元尺寸几乎是NOR器件的一半,所以NAND成本更低。
总结: NOR 与 NAND 各有特点,应用场景与应用难度也不同,SD NAND 在保留了NAND架构优质特性的同时改进了不足之处,内置的控制器能自行管理NAND Flash,用户无需在外部处理ECC和进行坏块管理,免去了MTD层,用户不需要写繁琐的驱动代码。这些特性也使得NOR用户升级NAND 成为可能。
PS. 除了SD NAND 之外还有一种次选升级方案,那就是使用TF卡,不过这种解决方案需要看具体应用环境。SD NAND 与TF卡对比资料可以参考下列文章,希望大家能找到适合自己的产品。
亲爱的卡友们,如果看完文章之后还是有疑惑或不懂的地方,请联系我们,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,深圳市雷龙发展专注存储行业13年,专业提供小容量存储解决方案。
*为便于理解并省去容量单位转换的麻烦,以下容量单位均使用Byte单位(128Mbit=16MByte)
前言:
NOR FLASH 是市场上两种主要的非易失闪存技术之一。Intel于1988年首先开发出NOR Flash 技术(实际上是东芝的富士雄率先开发出来的),彻底改变了原先由EPROM(Erasable Programmable Read-Only-Memory电可编程序只读存储器)和EEPROM(电可擦只读存储器Electrically Erasable Programmable Read - Only Memory)一统天下的局面。紧接着,1989年,东芝公司发表了NAND Flash 结构,强调降低每比特的成本,有更高的性能,并且像磁盘一样可以通过接口轻松升级。NOR Flash 的特点是芯片内执行(XIP ,eXecute In Place),这样应用程序可以直接在Flash闪存内运行,不必再把代码读到系统RAM中。NOR 的传输效率很高,在1~4MB的小容量时具有很高的成本效益,但是很低的写入和擦除速度大大影响到它的性能。NAND的结构能提供极高的单元密度,可以达到高存储密度,并且写入和擦除的速度也很快。应用NAND的困难在于Flash的管理需要特殊的系统接口。通常读取NOR的速度比NAND稍快一些,而NAND的写入速度比NOR快很多,在设计中应该考虑这些情况。
正文:
随着物联网的兴起,MCU的应用也越来越广泛了,以前基本上用内置的EEPROM或者外置小容量NOR Flash就可以满足大部分需求,随着技术发展和应用要求的提高,逐渐的MCU需要实现的功能也越来越多,实现更多功能的同时需要存储的数据量也在增大,比如系统增大、存储音频、图片(GUI)、视频缓存、协议栈等等…
一般情况下NOR FLASH的用户在容量不够用时直接升级为更高一级容量的NOR FLASH 就可以了,不过也有二般情况,由于NOR的单元结构相对较大的原因,当容量达到一定程度时性价比会异常的低,结合生产工艺和目前的市场情况来看,16MB是一个分水岭,比16MB NOR Flash大一级的32MB NOR Flash 的价格相对于16MB NOR Flash 高出一大截,甚至比128MB的NAND Flash还要贵,雪上加霜的是这货供应状况还不佳,即使能接受32MB NOR Flash的价格并且把方案也开发好了,前期调试和试产都通过了,等到正式量产的时候买不到货… 就可能会错过整机产品销售的最佳时机。
这个时候有人会说:这些我都知道啊!我也想用NAND Flash啊!不过我的MCU不!支!持!NAND Flash啊!难不成我还要换平台从头再开发?
非也,今时不同往日,有个叫SD NAND的东东可供选择,NAND 架构、SD协议,只要是支持SD2.0 协议的MCU均可以使用。正常情况下使用SPI 模式,如果需要更快的速度并且IO口够用时可以使用SD模式。内置ECC、坏块管理、均衡擦写等等功能,这意味着用户不需要额外写驱动来管理NAND ,当然性能弱的MCU也做不到^^
由于SD NAND存储单元使用的是NAND 架构,所以NAND 持有的基础特性也继承了下来,SD NAND在这个基础上进一步做了优化,使得易用性和应用兼容性上大大提升。
我们先看一看NOR 与 NAND的区别都有哪些。
1.NOR Flash支持随机访问,所以支持XIP(execute In Place),NAND Flash需要按块进行读取,所以不支持XIP 。
2.NAND FLASH理论读取速度与NOR Flash相近,实际情况会根据接口不同有些差异。
3.NOR 与 NAND 写入前都需要先擦除,NOR在擦除时以64~128KB的块进行,执行一个写入/擦除操作的时间约5s,NAND在擦除时以8~32KB的块进行,执行一个写入/擦除操作的时间约4ms。
4.NAND 理论最大擦除次数比NOR多
5.NOR 驱动比NAND简单,NAND FLASH需要通过专门的NFI(NAND FLASH Interface)与Host端进行通信,驱动相对复杂。
6.所有Flash 都会有位反转的问题,NAND 位反转概率要比NOR高,NAND Flash 必须要使用ECC。
7.NAND的单元尺寸几乎是NOR器件的一半,所以NAND成本更低。
总结: NOR 与 NAND 各有特点,应用场景与应用难度也不同,SD NAND 在保留了NAND架构优质特性的同时改进了不足之处,内置的控制器能自行管理NAND Flash,用户无需在外部处理ECC和进行坏块管理,免去了MTD层,用户不需要写繁琐的驱动代码。这些特性也使得NOR用户升级NAND 成为可能。
PS. 除了SD NAND 之外还有一种次选升级方案,那就是使用TF卡,不过这种解决方案需要看具体应用环境。SD NAND 与TF卡对比资料可以参考下列文章,希望大家能找到适合自己的产品。
亲爱的卡友们,如果看完文章之后还是有疑惑或不懂的地方,请联系我们,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,深圳市雷龙发展专注存储行业13年,专业提供小容量存储解决方案。
K9F系列的是SLC结构的三星的系列NAND Flash 2.K9G系列的是MCL结构的NAND Flash
首先是存取次数。MLC架构理论上只能承受约1万次的数据写入,而SLC架构可承受约10万次,是MLC的10倍。这个1万次指的是数据写入次数,而非数据写入加读取的总次数。数据读取次数的多寡对闪存寿命有一定影响,但绝非像写入那样严重。
其次是读取和写入速度。这里仍存在认识上的误区,所有闪存芯片读取、写入或擦除数据都是在闪存控制芯片下完成的,闪存控制芯片的速度决定了闪存里数据的读取、擦除或是重新写入的速度。SLC技术被开发的年头远早于MLC技术,与之相匹配的控制芯片技术上已经非常成熟。
第三是功耗。SLC架构由于每Cell仅存放1bit数据,故只有高和低2种电平状态,使用1.8V的电压就可以驱动。
而MLC架构每Cell需要存放多个bit,即电平至少要被分为4档(存放2bit),所以需要有3.3V及以上的电压才能驱动。第四是出错率。在一次读写中SLC只有0或1两种状态,这种技术能提供快速的程序编程与读取,简单点说每Cell就像我们日常生活中使用的开关一样,只有开和关两种状态,非常稳定,就算其中一个Cell损坏,对整体的性能也不会有影响。
在一次读写中MLC有四种状态(以每Cell存取2bit为例),这就意味着MLC存储时要更精确地控制每个存储单元的充电电压,读写时就需要更长的充电时间来保证数据的可靠性。
它已经不再是简单的开关电路,而是要控制四种不同的状态,这在产品的出错率方面和稳定性方面有较大要求,而且一旦出现错误,就会导致2倍及以上的数据损坏,所以MLC对制造工艺和控制芯片有着更高的要求。
第五是制造成本。MLC技术原来每Cell仅存放1bit数据,而现在每Cell能存放2bit甚至更多数据,这些都是在存储体体积不增大的前提下实现的,所以相同容量大小的MLC NAND Flash制造成本要远低于SLC NAND Flash。
SD NAND,贴片式TF卡,贴片式SD卡
最近在跟小伙伴沟通当中,有人提到了曾经的tSD和qSD产品,我们的同事作为曾经的参与者,相当惊讶。居然还有人记得这么古老的这么一个产品,在这里简单的跟大家聊一下。
tSD和qSD的架构是控制器+TLC NAND Flash晶圆,当初是为了用户更快的享受到TLC NAND晶圆的价格红利(8年前)。
tSD和qSD的封装形式有 BGA和TSOP两种,那个时候也有人称之为TSOP/BAG封装的SD卡/TF卡。
tSD和qSD的主流容量是8GB和16GB。
但是后来,由于各种原因,这两款产品相继退出市场,如今CS创世 SD NAND也被一些小伙伴们简称为:贴片式TF卡,贴片式SD卡,贴片式T卡,那么CS创世 SD NAND和tSD/qSD有什么相同和不同的呢?
简单来说相同的,它们的架构都是一个控制器+ NAND Flash晶圆,对外都是SD接口。
不同的有:
1、内部晶圆不同,CS创世 SD NAND使用的SLC NAND晶圆,擦写寿命10W次。tSD/qSD是使用TLC晶圆,擦写寿命是500-1000次。
2、容量不同,CS创世 SD NAND容量 128MB/512MB为主。tSD/qSD容量是8GB和16GB为主。
3、尺寸和封装不同。CS创世 SD NAND WSON-8 6*8mm 封装,体积小方便焊接。tSD/qSD有两种封装,BGA 153个球 11.5*13mm,TSOP 48封装, 12*20mm。
4、稳定性,CS创世 SD NAND的控制器是最新,内部是SLC NAND。tSD/qSD内部是TLC NAND Flash晶圆,只适合对价格很敏感的消费类电子产品。
CS品牌SD NAND, TF卡,eMMC,TSOP48(tSD/qSD同样封装对比图.png需要资料搜索官网【深圳雷龙发展】
亲爱的卡友们,如果看完文章之后还是有疑惑或不懂的地方,请联系我们,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,雷龙发展专注存储行业13年,专业提供小容量闪存解决方案。
SD NAND,贴片式TF卡,贴片式SD卡
SD NAND与eMMC优劣势对比
最近我们接触到一些客户,本来客户计划使用eMMC,但总觉得哪里不满意。后来跟客户做了深入沟通。你们真实的想要什么样的eMMC呢?他们给出的答案有:尺寸最小的eMMC; 最方便焊接的eMMC; 最小容量的eMMC; pin脚最少的eMMC; 功耗最低的eMMC; 擦写寿命最长的eMMC; 使用SLC NAND 晶圆的eMMC; 性能最稳定的eMMC等。
我们根据客户的要求进行了分析,觉得CS创世 SD NAND更适合这些客户。CS创世 SD NAND是迷你型eMMC; 6*8mm 尺寸小巧; 容量最小128MB,成本更优; 8pin脚,方便焊接; 内置SLC晶圆,10万次擦写寿命; 兼容SDIO,即贴即用; SD NAND和 eMMC在架构上,类似亲兄弟,都是内置NAND Flash晶圆+NAND Flash控制器+Firmware。
关于CS创世 SD NAND详细信息可以参考链接:http://www.longsto.com/product/31.html。那SD NAND和eMMC又有哪些不一样呢?在这里把CS创世 SD NAND和eMMC特性列出来:(加微信交流:13691982107)
可以看到客户有如下需求时,选择SD NAND会比eMMC更合适一些:
1:需要芯片尺寸小。贴片式SD卡是 6*8mm;eMMC是11.5*13mm;
关于它们的尺寸大小和封装,给大家看一张这个产品实物图的对比(从左往右)(加微信交流:13691982107)
2:要求小容量。SD NAND是128MB-4GB;eMMC容量≥16GB;
3:要求擦写寿命长,耐擦写。SD NAND是内置SLC NAND Flash晶圆,擦写次数可以达到5~10万次; eMMC使用MLC晶圆,擦写寿命3千次 (非主流),TLC晶圆,擦写寿命一般是500次左右(主流)。
4:要求方便焊接,pin脚少的。 SD NAND LGA-8封装,机贴手帖都方便; eMMC是153 Ball,BGA封装,焊接难度加大了不少。
5: 客户采用的CPU本身不支持eMMC接口,又需要大容量存储。这点在MCU平台上经常会碰到。这时候CS创世 SD NAND是不二选择 。
6:对PCB板层数要求比较少。很多客户做一些类似玩具,小家电等产品。基本上2层板就够用了。如果这个时候使用eMMC,那PCB板至少要变成4层。会增加硬件的布线难度和PCB的成本。
那什么情况下使用eMMC比较合适呢?
1,容量需求比较大。>= 8GB时。
2,主控支持eMMC。
3,PCB板面积够大且层数> 4层。使用eMMC,需要预留11.5*13mm的空间‘PCB至少4层板,需要埋盲孔;BGA 153个ball,0.5mm的pin间距。
想了解CS创世 SD NAND更多信息,请点击链接:http://www.longsto.com/product/31.html。
亲爱的卡友们,欢迎光临雷龙官网,如果看完文章之后还是有疑惑或不懂的地方,请联系我们,自己去理解或猜答案是件很累的事,请把最麻烦的事情交给我们来处理,术业有专攻,闻道有先后,雷龙发展专注存储行业13年,专业提供小容量闪存解决方案。
页次: 1