使用STM32在SPI模式下读写SD卡
代码分享
链接: https://pan.baidu.com/s/1AhzP3XglmqDT-m0MhBYUDA
提取码: ebig
一、SD卡
Micro SD卡(原名:Trans-flash Card(TF卡))是由SanDisk公司发明的一种极细小的闪存卡。
它主要应用于手机,且是功能机必搭存储卡,又因其拥有体积极小的优点,随着不断提升的容量,它慢慢开始在GPS设备、便携式音乐播放器和一些闪存盘中使用。
SD 卡主要引脚和功能描述如下:
CLK:时钟信号,控制器或者 SD 卡在每个时钟周期传输一个命令位或数据位,在 SD 总线的默认速度模式下频率可在0~25MHz 之间变化,SD 卡的总线管理器可以不受任何限制的*产生0~25MHz 的频率,在 UHS-I 速度模式下,时钟频率最高可达208M。
CMD:命令和响应复用引脚,命令是由控制器发给 SD 卡,可以是从控制器到单个 SD 卡,也可以是到 SD 总线上所有卡;响应是存储卡对控制器发送的命令应答,应答可以来自单卡或所有卡。
DAT0~3:数据线,数据可以从卡传向控制器也可以从控制器传向卡。
SD卡的管脚定义和Micro SD(TF)卡的管脚定义是不一样的。
SD卡:1-data3,2-cmd,3-vss,4-vdd,5-clk,6-vss,7-data0,8-data1,9-data2.
TF卡(SD模式):1-data2,2-data3,3-cmd,4-vdd,5-clk,6-vss,7-data0,8-data1
TF卡(SPI模式):1-rsv,2-cs,3-di,4-vdd,5-sclk,6-vss,7-do,8-rsv
寄存器及功能描述如下:
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)寄存器:驱动级寄存器,属于可选寄存器,用于配置卡的驱动输出。
接口控制器:主要用于对内部存储核心进行控制和管理,通过接收用户对其发送的命令来进行控制和设置,并根据命令作出响应,然后执行响应的数据读写等操作。
内部存储介质:数据记忆存储的 Flash 块。
SD 卡 (Secure Digital Memory Card)中文翻译为安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用,例如数码相机、个人数码助理(PDA)和多媒体播放器等。SD卡由日本松下、东芝及美国SanDisk 公司于1999年8月共同开发研制。大小犹如一张邮票的SD记忆卡,重量只有2克,但却拥有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性。
SD卡一般支持2种操作模式:
1,SD卡模式;
2,SPI模式;
主机可以选择以上任意一种模式同SD卡通信,SD卡模式允许4线的高速数据传输。SPI模式允许简单的通过SPI接口来和SD卡通信,这种模式同SD卡模式相比就是丧失了速度。
二、实验操作
1.在stm32cubemx建立工程
2.根据上面的原理图连接硬件
stm32 | Micro SD |
---|---|
GND | GND |
5V | VCC |
GPIOA4 | CS |
GPIOA5 | SCK |
GPIOA6 | MISO |
GPIOA7 | MOSI |
建议STM32核心板和Micro都接5V的电压
3.keil编译和烧录
三、实验结果
下面是我得到的结果哦
这时候用一个读卡器将SD卡连接到我们的电脑上,就可以在里面发现一个hello.txt文件,里面就是你写入的东西。
发现后面是乱码哦,
看代码主函数
将main函数里面的
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);
}
}
得到没有乱码的结果
总结
怎么说呢,这次实验硬件连接真的太容易接触不良了,实验10次,9次接触不良,好不容易出了结果,结果是有乱码,离了个大谱
参考文献
STM32在SPI模式下读写SD卡
Micro SD
STM32用cube配置FATFS模式下SPI读写SD卡