STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记 您所在的位置:网站首页 sd和spi STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记

STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记

2023-07-25 18:28| 来源: 网络整理| 查看: 265

前言

        很多单片机不带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卡。

  2.工作模式

        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模式下的硬件连接方式。

二、编程前的准备工作   1.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,对应的组合就是如下四种:

 

  2.常用命令简介

        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 实验室设备网 版权所有