看到一篇写的比较好的笔记,分享给大家
一、sd卡概述
1、定义
2、容量等级
3、sd卡框图
4、sd卡与tf卡的区别
二、 sd卡内部结构
1、 sd卡内部结构简图
2、 存储阵列结构图
3、buffer
4、“存储阵列block”--最小的存储单元
5、sd卡的特殊功能寄存器
三、sdio接口
四、sd卡协议的核心--数据读、写、擦除
1、sd卡写数据块
2、sd卡读数据块
3、擦除sd卡
五、sd卡物理层协议
1、接口
2、命令格式
3、响应格式
4、sd卡的工作状态
5、sd卡的两种状态信息
六、stm32与sd卡相配的外设--sdio适配器
1、sdio adapter 结构图
2、命令状态机(cpsm)
3、数据通道状态机(dpsm)
4、sdio的fifo
5、sdio的特殊功能寄存器
七、sd卡编程
1、sd卡编程的内容
2、sd卡初始化
3、读sd卡的一个块
4、写sd卡的一个块
八、sd卡疑惑
1、sd卡擦除后,其中的内容是0,还是1 ?
2、在sdio_dctrl中设置传输block的要求
3、stm32固件库“stm32_eval_sdio_sd.c version v4.5.0”偶遇bug
4、sd卡写block是怎样进行的?
九、sd卡参数测试
一、sd卡概述
1、定义
sd卡(安全数码卡),是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(外语缩写pda)和多媒体播放器等。
2、容量等级
容量等级 容量范围 磁盘格式
sd 上限至2gb fat 12, 16
sdhc 2gb至 32gb fat 32
sdxc 32gb至2tb exfat
3、sd卡框图
引脚说明:
4、sd卡与tf卡的区别
tf卡又名micro sd卡,个头是比sd卡的1/4还小,可以通过“tf转sd卡套”转换成sd卡。
详细区别参考:sd卡与tf卡的区别
二、 sd卡内部结构
(摘自sandisk secure digital card product manual version 1.9)
1、 sd卡内部结构简图
由sd卡控制器和存储阵列组成,sd卡与外界的通讯接口是sd bus或者spi bus。
2、 存储阵列结构图
block:
读写时的单元(数据传输单元),它的单位是“字节”。
sector:
如果csd寄存器erase_blk_en = 0时,sector是最小的擦除单元,它的单位是“块”。sector的值等于csd寄存器中的sector_size的值+1。
wp group:
最小的写保护单元,它的单位是“扇区”。
3、buffer
sd card的buffer最大容量定义在csd寄存器的read_bl_len和write_bl_len。它们的值是一样的,而且有可能超过512字节,尽管这样block还是要设置成512字节,因为512字节是数据边界(这句话不是太理解)。也就是sd卡上有数据传输缓冲器buffer,不同的产品可能不一样,但是在使用时要将buffer设置成512字节。
4、“存储阵列block”--最小的存储单元
资料上的block通通指的是数据传输时的最小单元,定义这个数值是为了数据传输、crc校验等。
存储阵列通常采用nandflash的结构,显然不能按字节存取,而这里讨论的“存储阵列block”就是指这个概念。可惜的是目前,我还没有找到资料讨论这个问题,所以这一章节是笔者自己的推测。
据我推测存储阵列block应该是512byes,因为众多的数据都围绕着512bytes在转。比如说最小的擦除单元是512byes,最小的读写单位应该被设置成512bytes,那么有理由推测是这个数值。
5、sd卡特殊功能寄存器
cid:宽度128位,卡标识号
rca:宽度16位,卡相对地址,在初始化的时候确定
csd:宽度128位,卡描述数据:卡操作条件的信息
scr:宽度64位,sd卡配置寄存器:sd卡特定信息数据
ocr:宽度32位,操作条件寄存
三、sdio接口
四、sd卡协议之数据读、写、擦除
1、sd卡写数据块
执行写数据块命令(cmd24-27) 时,主机把一个或多个数据块从主机传送到卡中,同时在每个数据块的末尾传送一个crc码。主机传送数据,sd卡接收数据并将数据保存在buffer中,累计接收数据达到block长度的时候,sd卡把接下来的数据当做crc校验码,并且开始数据校验。如果crc校验错误,卡通过sdio_d 线指示错误,传送的数据被丢弃而不被写入,所有后续(在多块写模式下)传送的数据块将被忽略。
如果主机传送部分数据而累计的数据长度未与数据块对齐,当不允许块错位( 未设置csd的参数write_blk_misalign),卡将在第一个错位的块之前检测到块错位错误( 设置状态寄存器中的address_error 错误位) 。当主机试图写一个写保护区域时,写操作也会被中止,此时卡会设置wp_violation位。
数据块block的最大长度定义在csd中的write_bl_len,但是在数据传输时应该用cmd16指令将其设置为512byets,不去在意write_bl_len是1024或者2048bytes。
另外需要注意的是,block的长度设置还要参考csd寄存器的write_bl_partial。当write_bl_partial为0时,那么么办法block只能设置为512bytes;如果write_bl_partial=1,那么允许将block设置成更小的块,比如说一个字节。协议是这样规定的,但是据我分析如果这样的话sd卡的制作会非常复杂(写入的单位可以是字节),价格也会很高。笔者测试了自己的sd卡,write_bl_partial 等于0,也就是不支持“块部分写”功能。
2、sd卡读数据块
在读数据块模式下,数据传输的基本单元是数据块block。为保证数据传输的正确,传输一个数据块blcok后都有一个crc校验码。笔者认为主机在累计接收到block长度数据后,软件可以把接下来的数据当做crc校验码,并且进行校验。
block的最大值在csd中(read_bl_len) 给出了定义,但是在数据传输时应该用cmd16指令将其设置为512byets,不去在意read_bl_len是1024或者2048bytes。
如果csd寄存器中的read_bl_partial等于1,可以传送的较小数据块,较小数据块是指开始和结束地址完全包含在一个物理块中。事实上,协议规定read_bl_partial永远等于1,也就说在任何sd卡上都允许“读部分块”,读的块的最小字节是1bytes。使用这种功能,可以通过cmd16命令设置更小的block(比如说等于128)。读取的这128字节必须在512bytes边界内,不能跨越边界(其实因为存储阵列是以512bytes为单位的,读取“部分块”只能在一个块内,不允许跨块读)。
3、擦除sd卡
csd寄存器erase_blk_en决定了sd卡的最小擦除单位。
当erase_blk_en等于0的时候,主机擦除的最小单位是扇区。比如一个sector包含32个block,擦除时的起始地址是5,而结束地址是40,那么实际擦除的块是从0到63。
当erase_blk_en等于1的时候,主机擦除的最小单位是512 byetes。比如擦除时的起始地址是5,而结束地址是40,那么实际擦除的块就是从5到40。
五、sd卡物理层协议
sd卡的协议相对于spi、i2c等协议的存储器来说相对复杂,包含sd卡物理层(机械封装、管脚、芯片结构、命令集等)、sd卡接口(sdio)、sd主机控制器,甚至是软件设计的流程,都进行了详细的规定。
1、接口
① sdio接口
clk 时钟同步线
cmd 命令信号线,主机发出的命令以及从机对命令的响应都是通过这条线进行传输
dat[3:0] 表示4条数据线,主机和从机的数据都是从这四条数据线上传输
② spi接口
2、命令格式
3、响应格式
以r1为例
4、sd卡的工作状态
5、sd卡的两种状态信息
① card status
执行命令过程中的状态信息,比如地址不对齐错误、块长度错误、卡锁、ecc校验错误等等
② sd status
sd卡的专有特征,编程中不经常涉及。这个状态值有512位,不是通过命令线传送给主机,而是通过数据线。
六、stm32与sd卡相配的外设--sdio适配器
1、sdio adapter 结构图
2、命令状态机(cpsm)
当发送命令和接收响应时,启动cpsm状态机。
3、数据通道状态机
当传输数据时,启动数据通道状态机。
4、fifo
有关fifo的资料参考:异步fifo的fpga实现
数据fifo(先进先出)子单元是一个具有发送和接收单元的数据缓冲区。
fifo包含一个每字32位宽、共32个字的数据缓冲区,和发送与接收电路。因为数据fifo工作在ahb 时钟区域(hclk/2),所有与sdio时钟区域(sdioclk)连接的信号都进行了重新同步。依据txact和rxact标志,可以关闭fifo、使能发送或使能接收。txact和rxact 由数据通道子单元设置而且是互斥的:
─ 当 txact 有效时,发送 fifo 代表发送电路和数据缓冲区
─ 当 rxact 有效时,接收 fifo 代表接收电路和数据缓冲区
5、sdio的特殊功能寄存器
sdio电源控制寄存器(sdio_power)
sdio时钟控制寄存器(sdio_clkcr) : 时钟选择、分频
sdio参数寄存器(sdio_arg)
sdio命令寄存器(sdio_cmd):控制发送命令
sdio命令响应寄存器(sdio_respcmd):包含响应命令中的命令索引
sdio响应1..4寄存器(sdio_respx):包含响应命令中的卡状态信息
sdio数据定时器寄存器(sdio_dtimer)
sdio数据长度寄存器(sdio_dlen):读或者写的长度,通常是是512的倍数
sdio数据控制寄存器(sdio_dctrl):控制数据的读写方向、使能传输等信息
sdio数据计数器寄存器(sdio_dcount):当dpsm状态机从idle state切换到wait_r或者wait_s状态时,sdio_len的数值加载到该寄存器中
sdio状态寄存器(sdio_sta)
sdio清除中断寄存器(sdio_icr)
sdio中断屏蔽寄存器(sdio_mask)
sdio fifo计数器寄存器(sdio_fifocnt):当sdio_dctrl中的dten使能,并且dpsm处于idle state时,sdio_len/4的数值加载到该寄存器中
sdio数据fifo寄存器(sdio_fifo):读写数据缓冲fifo
七、sd卡编程
sd卡的编程在stm32官方固件库中就有例程,而且野火开发板对该例程进行了中文注释,不必再把源码贴入。这里着重讲一下sd卡编程流程,主要包含sd卡初始化、sd卡读、sd卡写、sd卡擦除。
1、sd卡编程的内容
sd卡主要就是用来存储数据的,所以核心就是读写。为了实现这个目标,必须实现响应的驱动。
配置过程中,不仅要设置好sd控制器,还需要将sd卡设置到合适的状态。在读取状态的时候,不仅涉及到sd控制器的状态,还涉及到sd卡的状态。
2、sd卡初始化
① stm32外设sdio初始化
端口配置、端口时钟、sdio时钟、dma2时钟使能
sdio寄存器复位
设置时钟sdio_ck为400khz以下,设置数据线宽度,开启时钟、开启sdio电源
② sd卡上电初始化
上电初始化流程如上图所示,笔者认为官方库提供的例程没有完全按照这个流程图的指示去做。事实上,官方库的程序只做了如上图红色方框内的流程,之外的没涉及。
cmd0命令复位所有的卡。
sd协议规定:在初始化的时候,使用acmd41之前,必须先使用cmd8命令。而且acmd41命令属于应用命令,在使用之前需要先发送命令cmd55。
cmd8命令是为了核查电源是否匹配。acmd41命令不断询问sd卡是否支持主机提供的电压,并且询问sd卡是否上电完成进入准备状态。acmd41命令还能询问sd卡的类型(sdsc、sdhc)。
③卡进一步核查、获取卡信息
发送命令cmd2,以获取cid信息。
发送命令cmd3,以获取rca相对地址,可以通过多次发送cmd3获取不同的rca值,但是只有最后一次的才是有效的rca地址。
发送命令cmd9,以获取csd寄存器。
④ 设置sdio工作在数据传输模式
设置sdio的时钟为24mhz、数据线宽度为4位。
通过sd_getcardinfo函数将之前得到cid、csd处理成卡的信息。
通过cmd7命令选择匹配地址的卡,而取消选择其他的卡。
至此,初始化完成。
3、读sd卡的一个块
数据控制寄存器(sdio_dctrl)清零
发送命令cmd16,设置sd卡的block大小
调用函数sdio_dataconfig设置sdio数据传输方式
发送命令cmd17,读单个块
sdio数据传输结束中断使能
sdio的dma传输功能使能
dma设置,并使能
4、写sd卡的一个块
数据控制寄存器(sdio_dctrl)清零
发送命令cmd16,设置sd卡的block大小
发送命令cmd24,写单个块
调用函数sdio_dataconfig设置sdio数据传输方式
sdio数据传输结束中断使能
dma设置,并使能
使能sdio的dma传输功能
八、sd卡疑惑
1、sd卡擦除后,其中的内容是0,还是1 ?
the data at the card after an erase operation is either '0' or '1', depends on the card vendor.the scr register bit data_stat_after_erase (bit 55) defines whether it is '0' or '1'.(摘自《sd specifications_part_1_physical_layer_specification_ver3.00_final_090416.pdf》)
也就是说这是芯片厂商生产工艺决定的,可以通过scr寄存器的 data_stat_after_erase位得知。
2、在sdio_dctrl中设置传输block的要求
block大小决定了主机在发送数据时,发送到什么程度时开始发送crc校验码;而在接收数据时,在接收到什么程度时开始把sd卡的数据作为crc校验码并进行校验。block还可能影响着其他的时序。在stm32的sdio寄存器组中,sdio_dctrl中的位段dblocksize决定主机block大小。
在摘自《simplified_sd_host_controller_spec.pdf》的引文中,提到这样的配置要求:主机的block一定要与sd卡设置的block一样大小,这显然是必要的。我们经常设置sd卡的block大小是512bytes,所以设置dblocksize为9(2^9 = 512)。
3、stm32固件库“stm32_eval_sdio_sd.c version v4.5.0”偶遇bug
参考网页:http://www.cprogramdevelop.com/3742318/
4、sd卡写block是怎样进行的?
写sd卡的单位是block(512bytes),再写之前要先整块擦除,然后才能写。
在多块写操作中,可以在发送多块写命令cmd25之前,有选择性的先发送命令acmd23设置预擦除。怎样理解呢?
既然是有选择性的,也可以不发送acmd23命令。在多块写的过程中,由于sd卡事先不知道你要写入几个块(cmd25命令只告诉sd卡要写入的起始地址),所以写入的过程是:根据需要判断要写一个块时,先擦除然后再写,再判断是否要写入下一个块,如果是就再擦除再写。
倘若发送acmd23命令就不一样了,adm23命令会在写命令cmd25生效之前,告诉sd卡准备写入的块数n。这样当cmd25命令生效的时候,sd卡会一次性先将这n个块都擦除,然后再一个块一个块写。由于擦除操作比较集中,所以整个多块写操作更节省时间。
九、sd卡参数测试
使用野火开发板配套例程做测试,笔者测试用的sd卡是金士顿的2g内存块,打印sd卡的参数信息如下:
card type is :1
manufacturerid is :2
card device size is :3795
card block size is :1024
card device size multiplier is :7
card capacity is :1990197248
the maximum read date block length is :1024
partial blocks for write allowed is :0
the maximum write date block length is :1024
erase single block enable is :1
erase sector size is :127
write protect group size is :0
rca is :4660
card type:1 sdsc卡版本2.0
card device size: c_size(csd),为3795
card block size:max read data block length(read_bl_len(csd)) ,为1024 bytes
card device size multiplier is: c_size_mult(csd),为7
card capacity:1990197248 bytes
计算方法(摘自《simplified_physical_layer_spec.pdf》):
memory capacity = blocknr * block_len
blocknr = (c_size+1) * mult (c_size <= 4096)
mult = 2^(c_size_mult+2) (c_size_mult < 8)
block_len = 2^read_bl_len, (read_bl_len < 12)
注意:sdsc最大为2gb。
the maximum read date block length:read_bl_len(csd) ,为1024 bytes
partial blocks for write allowed:write_bl_partial(csd),为不支持
the maximum write date block length:write_bl_len(csd) ,为1024 bytes
erase single block enable:erase_blk_en(csd),为1,支持单块擦除
erase sector size:sector_size(csd),实际扇区擦除的block数为(sector_size+1),为128 blocks
write protect group size:wp_grp_size(csd),实际保护的扇区数为(wp_grp_size+1),为1 sector
rca: sd卡相对地址为4660
E4356A天天有现货AgilentE4356A直流电源
ZigBee与其它短距离无线通信技术比较
一加7 Pro将采用三星QHD+AMOLED屏幕刷新率为90Hz
聚合物基SAW器件在各种应用中的潜力
随身wifi功能是什么?怎么使用?
详解STM32之SD卡
影响磁性元器件发展六大产业发展的机遇与存在哪些挑战
自动化的今生与未来是怎么样的?
硕数物联科技COM-IMX6UL(L)主板介绍
势不可挡?韩媒曝光,苹果iPhone8将改用OLED 面板!
物联网方案分享之电梯物联网系统
物联网技术与智能电网的融合发展将在电网建设中发挥着重要作用
将50V的直流电压降到40V,有什么办法?
细说高通发展史—崛起、鼎盛与隐忧
小区测产系统目前已广泛应用于农作物的产量测量
中国PCB行业市场规模竞争格局研究预测
诺基亚800真三防手机首售,通过军工级电子装备测试标准
智能卡全通道式激光标识系统可以实现不同数据的喷印?
爆料称三星Note系列旗舰或将正式完结
21W AB类音频放大器电路设计