STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记 | 您所在的位置:网站首页 › sd和spi › STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记 |
前言
很多单片机不带SDIO接口,所以在使用SD卡时必须使用SPI模式进行读写。 想做一个基于SPI的SD卡文件系统读写SD卡上的文件,再配合USB接口做一个模拟U盘。只能利用业余时间慢慢更新,也不知道能不能坚持下去。 我会把从零开始开发一个程序需要经历的过程一一的记录下来。做成一个奶妈级的单片机开发笔记。 效果演示https://www.bilibili.com/video/BV1Gb4y1m77q?share_source=copy_web 一、硬件简介 1.SD卡和MicroSD卡(TF卡)的区别 由下图可以很容易的看出TF卡只是比SD卡少了一个3脚Vss脚,其它的管脚顺序是完全一样的。MicroSD卡也叫做TF卡,为了方便描述,之后的文章中把SD卡和TF卡统称为SD卡。 SD卡有两种工作模式,SD BUS模式和SPI模式。SD BUS模式采用4个数据线和1个时钟线。而在SPI模式下,需要1个数据输出线、1个数据输入线、1个时钟线和1个片选线。 本文重点介绍SD卡的SPI工作模式,SD BUS工作模式就不做过多的阐述。 3.硬件电路SD卡只能使用3.3V的I/O电平,SPI模式下信号线要加10-100K的上拉电阻。下图是SPI模式下的硬件连接方式。 SD卡的SPI的时钟线空闲时应该为高电平,在时钟的第二边沿也就是时钟线的电平由低变高时采集数据。所以配置SPI的极性和相位时应配置成:CPOL=1,CPHA=1 。 下面简单解释一下SPI的极性和相位,感觉没必要看的可以直接跳过。 CPOL极性先说什么是SCLK时钟的空闲时刻,其就是当SCLK在发送8个bit比特数据之前和之后的状态,于此对应的,SCLK在发送数据的时候,就是正常的工作的时候,有效active的时刻了。其英文精简解释为:Clock Polarity = IDLE state of SCK。 SPI的CPOL,表示当SCLK空闲idle的时候,其电平的值是低电平0还是高电平1: CPOL=0,时钟空闲idle时候的电平是低电平,所以当SCLK有效的时候,就是高电平,就是所谓的active-high。 CPOL=1,时钟空闲idle时候的电平是高电平,所以当SCLK有效的时候,就是低电平,就是所谓的active-low。 CPHA相位首先说明一点,capture strobe = latch = read = sample,都是表示数据采样,数据有效的时刻。相位,对应着数据采样是在第几个边沿(edge),是第一个边沿还是第二个边沿,0对应着第一个边沿,1对应着第二个边沿。 CPHA=0,表示第一个边沿: 对于CPOL=0,idle时候的是低电平,第一个边沿就是从低变到高,所以是上升沿; 对于CPOL=1,idle时候的是高电平,第一个边沿就是从高变到低,所以是下降沿; CPHA=1,表示第二个边沿: 对于CPOL=0,idle时候的是低电平,第二个边沿就是从高变到低,所以是下降沿; 对于CPOL=1,idle时候的是高电平,第二个边沿就是从低变到高,所以是上升沿; 极性和相位的组合CPOL和CPHA,分别都可以是0或时1,对应的组合就是如下四种: SPI命令格式为6字节构成,高位在前(MSB)。 字节1的最高2位固定是01,低6位为命令号(CMD0就是0,CMD16就是16,以此类推);字节2-5为命令参数,有些命令是没有参数的;字节6的高7位为CRC,最低位恒为1。 下表为比较常用的几个命令。 命令参数回应描述CMD0(0X00)NONER1复位SD卡CMD8(0X08)VHS+Check PatternR7发送接口状态命令CMD9(0X09)NONER1读取卡特定数据寄存器CMD10(0X0A)NONER1读取卡标志数据寄存器CMD16(0X10)块大小R1设置块大小(字节数)CMD17(0X11)地址R1读取一个块的数据CMD24(0X18)地址R1写入一个块的数据CMD41(0X29)NONER3发送给主机容量支持信息和激活卡初始化过程CMD55(0X37)NONER1告诉SD卡,下一个是特定应用命令CMD58(0X3A)NONER3读取OCR寄存器 3.SD卡的初始化 初始化步骤1.初始化配置单片机的SPI接口和片选IO口。 2.调整SPI速度,SD卡在初始化时CLK的频率不能超过400KHz。 3.将SD卡的片选脚拉高,SD卡禁能。 4.向SD卡发送大于74个CLK的同步时钟。单片机调用SPI读或写数据的函数,向SD卡读或写10个字节就可以了,每读一个字节会产生8个CLK。 5.发送CMD0命令,使SD卡进入IDLE状态。 6.发送CMD8命令,查看SD卡类型是否为v2.0卡。 7.发送CMD55、CMD41、CMD58命令。 8.SD卡初始化完成。 三、开始编程【视频】 1.建立工程使用CubeMX建立一个工程。 视频地址: https://www.bilibili.com/video/BV1wf4y1N7SB?share_source=copy_web 2.编程前的准备工作俗话说得好,工欲善其事必先利其器,没有金刚钻不揽瓷器活。做电子开发没有好的工具或者工具不齐全是非常影响工作效率的。 https://www.bilibili.com/video/BV1HP4y1p7ZQ?share_source=copy_web 3.基础函数的编写 重定向printf函数使用printf函数时需要将重定向printf函数到对应的串口。 useprintf.c #include "usart.h" #include "stdio.h" //重写这个函数,重定向printf函数到串口 /*fputc*/ int fputc(int ch, FILE *f) { HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF); return ch; }https://www.bilibili.com/video/BV1hL411b7N4?share_source=copy_web 总结还没有写完,有空再更新。 代码部分很难用一两句文字描述清楚,打算用视频的形式进行分析。 本人不才,请多指教! |
CopyRight 2018-2019 实验室设备网 版权所有 |