SD初始化-> SD擦除数据->SD写数据->SD读数据-> SD读写数据比较。
1. sd初始化 BSP_SD_Init();
1.1 BSP_SD_MspInit
CLK,引脚,DMA初始化
1.2 HAL_SD_Init
1.2.1 SDIO_Init
SD功能初始化,CLK, 位宽, 流控等初始化
1.2.2 SD_PowerON
> send CMD0 ,NO RESP
> send CMD8 ,RESP7
> send ACMD41 with Argument 0x80100000, first send CMD55 ; 知道卡的容量大小类型。
1.2.3 SD_InitCard
> send CMD2,get CID info from RESP1/2/3/4, CID[4];
> send CMD3, get SD卡的RCA值
> send CMD9, 读取CSD寄存器获取卡的相关信息
。get Card CLASS and CSD parameters,其中CLASS可以知道卡支持的命令。
> send CMD7, sel and desel cmd.
> SDIO_Init ; 为什么还需要初始化。。-> 配置高速时钟,准备数据传输。
/*
以下内容摘抄与别处,未在stm32 库中发现:
> 发送CMD55+ACMD51读取SCR寄存器,SD卡可以通过该值获得位宽,如果是MMC卡则需要使用主线测试来确定卡的位宽。
> SD卡发送CMD55+ACMD6配置为4bit数据传输模式(根据SCR读出来的值确定),MMC卡发送CMD6来设置位宽
> 发送CMD7,使能SD卡,使其进入传输状态),接着发送CMD16设置块大小(根据前面读取的CSD信息确定)。
> 把命令参数设置为0,再次发送CMD7,取消选中所有卡。
*/
2. SD擦除 BSP_SD_Erase(BLOCK_START_ADDR, NUM_OF_BLOCKS);
> send CMD32, ERASE_GROUP_START
> send CMD33, erase_group_end
> send CMD38 erase select data area
3. SD 写数据 BSP_SD_WriteBlocks
> send CMD16 ,set block size
> if (block_num > 1) send CMD25,write multi block ; else send CMD24, write single block
> config SD DPSM for data transfer,write SDIOx->DCTRL register
> write block in polling mode
。SDIO_WriteFIFO,write data to SDIO Tx FIFO
> send CMD12 to stop block data transfer
4. SD 读数据
/*
以下内容摘抄与别处,未在stm32 库中发现
> 发送CMD7,以卡的相对地址为参数,选中该卡,并使其进入Tran状态
*/
> send CMD16 ,set block size
> if (block_num > 1) send CMD18,read multi block ; else send CMD17, read single block
> read data from read FIFO in polling mode
> send CMD12,stop data transfer
> empty fifo and clear all static flags
/*
以下内容摘抄与别处,未在stm32 库中发现
> 发送CMD7,以0作为命令参数,取消所有选中
*/