基于stm32f103
基于零死角玩转STM32---F103指南者
简介
1.SD 卡总共有 8 个寄存器,用于设定或表示 SD 卡信息。
2.SD卡的寄存器不能像STM32那样访问,而是利用命令
访问,SDIO 定义了 64 个命令。SD 卡接收到命令后,根据命令要求对 SD 卡内部寄存器进行修改,程序控制中只需要发送组合命令
就可以实现 SD 卡的控制以及读写操作。
总线
1.SD 卡一般都支持 SDIO 和 SPI 这两种接口。另外,STM32F42x系列控制器的 SDIO是不支持 SPI 通信模式的,如果需要用到 SPI 通信只能使用 SPI 外设。
2.SD 卡使用 9-pin 接口通信,其中 3 根电源线
、1 根时钟线
、1 根命令线
和 4 根数据线
.
CLK
:时钟线,由 SDIO 主机产生,即由 STM32 控制器输出;
CMD
:命令控制线,SDIO 主机通过该线发送命令控制 SD 卡,如果命令要求 SD 卡提供应答(响应),SD 卡也是通过该线传输应答信息;
D0-3
:数据线,传输读写数据;SD 卡可将 D0 拉低表示忙状态;
VDD、VSS1、VSS2
:电源和地信号。
SD 卡操作过程会使用两种不同频率的时钟同步数据,一个是识别卡阶段时钟频率 FOD,最高为 400kHz,另外一个是数据传输模式下时钟频率 FPP,默认最高为 25MHz,如果通过相关寄存器配置使 SDIO 工作在高速模式,此时数据传输模式最高频率为 50MHz
总线协议
SDIO 不管是从主机控制器向 SD 卡传输,还是 SD 卡向主机控制器传输都只以 CLK 时钟线的上升沿为有效.
SD 总线通信是基于命令和数据传输的。通讯由一个起始位("0"),由一个停止位("1")终止。SD 通信一般是主机发送一个命令(Command)
,从设备在接收到命令后作出响应(Response)
,如有需要会有数据(Data)传输参与。
SD 数据是以(Black)
形式传输,数据块长度一般为 512 字节,数据可以从主机到卡,也可以是从卡到主机。
STM32 控制器可以控制使用单线
或 4 线
传输。
命令和响应
一个完整的 SD 卡操作过程是:主机(单片机等)发起"命令",SD 卡根据命令的内容决定是否发送响应信息及数据等,如果是数据读/写操作,主机还需要发送停止读/写数据的命令来结束本次操作,这意味着主机发起命令指令后,SD 卡可以没有响应、数据等过程,这取决于命令的含义。
命令格式
SD 命令格式固定为 48bit,都是通过 CMD 线连续传输的(数据线不参与)
SD 命令的组成如下:
起始位和终止位
:命令的主体包含在起始位与终止位之间,它们都只包含一个数据位,起始位为 0,终止位为 1。
传输标志
:用于区分传输方向,该位为 1 时表示命令,方向为主机传输到 SD卡,该位为 0 时表示响应,方向为 SD 卡传输到主机。命令主体内容包括命令、地址信息/参数和 CRC 校验三个部分。
命令号
:它固定占用 6bit,所以总共有 64 个命令(代号:CMD0~CMD63),每个命令都有特定的用途,部分命令不适用于 SD 卡操作,只是专门用于 MMC 卡或者SD I/O 卡。
地址/参数
:每个命令有 32bit 地址信息/参数用于命令附加内容,例如,广播命令没有地址信息,这 32bit 用于指定参数,而寻址命令这 32bit 用于指定目标 SD 卡的地址。
CRC7 校验
:长度为 7bit 的校验位用于验证命令传输内容正确性,如果发生外部干扰导致传输数据个别位状态改变将导致校准失败,也意味着命令传输失败,SD卡不执行命令。
也就是说,在clk的上升沿,按照一定的规律发送CMD命令就可以发送可识别的SD卡命令
外设SDIO
STM32 控制器有一个 SDIO,由两部分组成:SDIO 适配器和 AHB 接口。
SDIO 适配器提供 SDIO 主机功能,可以提供 SD 时钟、发送命令和进行数据传输。AHB 接口用于控制器访问 SDIO 适配器寄存器并且可以产生中断和 DMA 请求信号。
SDIO由两部分组成 使用两个时钟信号
SDIO 使用两个时钟信号,一个是 SDIO 适配器时钟(SDIOCLK=HCLK=72MHz),另外一个是AHB总线时钟的二分频(HCLK/2,一般为 36MHz)。适配器寄存器和 FIFO使用 AHB总线一侧的时钟(HCLK/2),控制单元、命令通道和数据通道使用 SDIO 适配器一侧的时钟(SDIOCLK)。
SDIO 的数据 FIFO 寄存器(SDIO_FIFO)
数据 FIFO 寄存器包括接收和发送 FIFO,他们由一组连续的32个地址上的 32 个寄存器组成。
CPU 可以使用 FIFO 读写多个操作数。例如我们要从 SD 卡读数据,就必须读 SDIO_FIFO 寄存器,要写数据到 SD 卡,则要写 SDIO_FIFO 寄存器。
SDIO 将这 32 个地址分为 16 个一组,发送接收各占一半。而我们每次读写的时候,最多就是读取发送 FIFO 或写入接收 FIFO 的一半大小的数据,也就是 8 个字(32 个字节),这里特别提醒,我们操作 SDIO_FIFO(不论读出还是写入)必须是以 4 字节对齐的内存进行操作,否则将导致出错!