stm32 sd

本文详细介绍了SD卡在STM32平台上的操作流程,包括初始化、擦除、写入和读取数据的过程。从SD卡的硬件初始化到数据的读写,深入解析了每个步骤涉及的命令和函数调用,如BSP_SD_Init、HAL_SD_Init、sendCMD等,以及如何通过配置SDIO进行数据传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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作为命令参数,取消所有选中

                */

 

                

 

                  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值