目录
一、SD卡协议原理介绍
1、SD卡简介
下列内容参考百度百科。
SD存储卡(Secure Digital Memory Card)是一种基于半导体快闪存储器的新一代高速存储设备。SD存储卡的技术是从MMC卡(MultiMedia Card格式上发展而来,在兼容SD存储卡基础上发展了SDIO(SD Input/ Output)卡,此兼容性包括机械,电子,电力,信号和软件,通常将SD、SDIO卡俗称SD存储卡。
SD卡具有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性,它被广泛地应用于便携式装置上,例如数码相机、平板电脑和多媒体播放器等。
SD卡的结构能保证数字文件传送的安全性,也很容易重新格式化,所以有着广泛的应用领域。音乐、电影等多媒体文件都可以方便地保存到SD卡中。目前市场上SD卡的品牌很多诸如:SANDISK、Kingmax、Panasonic和Kingston。
SD卡作为一种新型的存储设备,具有以下特点:
●高存储容量,最常用的容量:8GB、16GB、32GB、128GB、256GB等。
●高速数据传送;最大读写速率为100MB/s。
●体积轻小,便于携带,具有很强的抗冲击能力。
2、SDIO设备分类
MMC卡可以说是SD卡的前身,现阶段已经用得很少。SD I/O卡本身不是用于存储的卡,它是指利用SDIO传输协议的一种外设。比如Wi-Fi Card,它主要是提供Wi-Fi功能,有些Wi-Fi模块是使用串口或者SPI接口进行通信的,但Wi-Fi SDIO Card是使用SDIO接口进行通信的。并且一般设计SD I/O卡是可以插入到SD的插槽。CE-ATA是专为轻薄笔记本硬盘设计的硬盘高速通讯接口。
目前SDIO协议提供的SD卡规范版本最新是4.01版本,但STM32F42x系列(F1系列也一样)控制器只支持SD卡规范版本2.0,即只支持标准容量SD和高容量SDHC标准卡,不支持超大容量SDXC标准卡,所以可以支持的最高卡容量是32GB。
3、SD卡物理结构
一般SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器 5个部分。
SD卡接口除了保留MMC卡的7针外,还在两边加多了2针,作为数据线。
在SD卡3.0规范中,SD卡的理论最大容量可达2TB,理论最大读写速度可达104MB/s(在最新的4.10规范中,理论最大读写速度已提高到312MB/s)。
SD卡主要分为四部分组成:外部引脚、内部寄存器、接口控制器和内部存储介质。
引脚
SD卡主要引脚和功能描述如下:
-
CLK:时钟信号,控制器或者SD卡在每个时钟周期传输一个命令位或数据位,在SD总线的默认速度模式下频率可在0~25MHz之间变化,SD卡的总线管理器可以不受任何限制的自由产生0~25MHz的频率,在UHS-I速度模式下,时钟频率最高可达208M。
-
CMD:命令和响应复用引脚,命令是由控制器发给SD卡,可以是从控制器到单个SD卡,也可以是到SD总线上所有卡;响应是存储卡对控制器发送的命令应答,应答可以来自单卡或所有卡。
-
DAT0~3:数据线,数据可以从卡传向控制器也可以从控制器传向卡。
4、SD卡寄存器
寄存器及功能描述如下:
-
OCR(Operating Conditions Register)寄存器:32位的操作条件寄存器主要存储了VDD电压范围,SD卡操作电压范围为2~3.6V。
-
CID(Card IDentification Register)寄存器:卡识别码寄存器,长度为16个字节,存储SD卡唯一标识号,该号在卡生产厂家编程后无法修改。
-
CSD(Card-Specific Data Register)寄存器:卡特性数据寄存器,包含了访问该卡数据时的必要配置信息。
-
SCR(SD Card Configuration Register)寄存器:SD卡配置寄存器(SCR),提供了SD卡的一些特殊特性在这张卡内,长度为64位,这个寄存器内容由制造商在生产厂内设置。
-
RCA(Relative Card Address)寄存器:卡相对地址寄存器是一个16位可写的地址寄存器,控制器可通过地址选择对应地址的SD卡。
-
DSR(Driver Stage Register)寄存器:驱动级寄存器,属于可选寄存器,用于配置卡的驱动输出。
5、SD模式
驱动模式
SD卡有两种驱动模式:SPI模式与SDIO模式。它们所使用的接口信号是不同的。在SPI模式下,只会用到SD卡的4根信号线,即CS、DI、SCLK与DO(分别是SD卡的片选、数据输入、时钟与数据输出)。 [4]
传输模式
SD卡共支持三种传输模式:SPI模式(独立序列输入和序列输出),1位SD模式(独立指令和数据通道,独有的传输格式),4位SD模式(使用额外的针脚以及某些重新设置的针脚。支持四位宽的并行传输)。
SD卡三种模式的针脚定义:
针脚 | 4位SD模式 | 1位SD模式 | SPI模式 | |||
名称 | 描述 | 名称 | 描述 | 名称 | 描述 | |
1 | CD/DAT3 | 卡监测/数据位3 | CD | 卡监测 | CS | 芯片选择 |
2 | CMD | 命令/回复 | CMD | 命令/回复 | DI | 数据输入 |
3 | VSS1 | 地 | VSS1 | 地 | VSS1 | 地 |
4 | VCC | 电源 | VCC | 电源 | VCC | 电源 |
5 | CLK | 时钟 | CLK | 时钟 | CLK | 时钟 |
6 | VSS2 | 地 | VSS2 | 地 | VSS2 | 地 |
7 | DAT0 | 数据位0 | DAT | 数据位 | DO | 数据输出 |
8 | DAT1 | 数据位1 | RSV | 保留 | RSV | 保留 |
9 | DAT2 | 数据位2 | RSV | 保留 | RSV | 保留 |
低速卡通常支持0~400千比特/秒数据传输率,采用SPI和1位SD传输模式。高速卡支持0~100兆比特/秒数据传输率,采用4位SD传输模式;支持0–25兆比特/秒,采用SPI和1位SD模式。
针对制造商、销售商和主机适配器生产商需要缴纳SD/SDIO授权费,每年1000美元外加1500美元的会员费。但SDIO卡和MMC适配器生产商无需授权费。MMC卡使用7针接口,SD卡和SDIO卡采用了9针接口。
更多的关于SD卡协议原理及其介绍可参照资料:
二、 实现对SD卡的数据读取
1、硬件准备
SD卡模块及SD卡
STM32F103最小板:
2、芯片模块与SD卡模块连线
stm32 | SD卡模块 |
---|---|
PA4 | SDCS |
PA5 | SCK |
PA7 | MOSI |
PA6 | MISO |
VCC | VCC |
GND | GND |
3、HAL库文件配置
打开stm32CubeMX,选择STM32F103C8t6芯片,配置相应文件。
选择文件的保存位置,及工程命名,完成。
4、代码编辑及改写
这里推荐直接打开源码,因为后面需要添加一些文件,以及相应函数的修改。
main函数:
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_SPI1_Init();
MX_FATFS_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1); //enable uart
printf(" main \r\n");
Get_SDCard_Capacity(); //得到使用内存并选择格式化
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
WritetoSD(WriteBuffer,sizeof(WriteBuffer));
HAL_Delay(500);
WriteBuffer[0] = WriteBuffer[0] +10;
WriteBuffer[1] = WriteBuffer[1] +10;
write_cnt ++;
while(write_cnt > 10)
{
printf(" while \r\n");
HAL_Delay(500);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
这里就不过多展示代码,后面我会给出完整的工程代码。可以参考里面的内容
5、结果展示
我们可以看出,当烧录完毕后,插入串口,会开始进行SD文件读取。
用读卡器读取SD卡,打开SD卡文件,查看其中的内容。
STm
三、相关问题说明及解决办法
1、SD卡初始化失败
当我们烧录好文件时,连接硬件至电脑串口,会发现一直出现初始化失败,导致的原因是stm32芯片的供电不足,导致SD卡模块无法正常工作。
解决办法:将stm32与SD卡模块都接上5v的电压,可以采用传统非type-c接口手机充电器对STm32供电,SD卡模块接STM32的5v引脚;也可以采用多个串口模块,对SD卡和stm32芯片分别供电。
2、无反应(长时间处于main)
与上面不同,当一直处于main状态时,可能出现的原因为连接没有接好,或者是由于代码的原因,代码中会对SD卡进行格式化,有可能便是正处于格式化的过程中,这个过程一般比较长。不过以我的亲身经历来看,多半还是电压的问题,你需要重新检查你模块的电压。
3、成功运行,但文本显示乱码
当我们成功运行时,打开生成的hello文件,发现会出现乱码
将上面的sizeof改为strlen。
若不想出现显示的序号,直接将上面的WriteBuffer函数注释掉即可。
四、总结
本次实验在原理上并没有多难,但难的是硬件模块的实现,做了很多次尝试,每次都是以失败告终,也是折磨了我很久,但后来还是坚持不懈,将实验完成。
这里再次提醒,一定要注意硬件的线路连接问题,真的是很影响心态。最后,祝好运。
五、参考资料
https://blog.csdn.net/m0_53089598/article/details/121985861
https://blog.csdn.net/qq_46467126/article/details/122033766
完整工程链接:
链接:https://pan.baidu.com/s/1uYg6ZmgeD-HkZS05dq9Chw
提取码:flma