打印
[应用相关]

使用CubeMX配置SDIO的4bit模式,对TF卡进行测试

[复制链接]
1502|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
使用CubeMX配置SDIO的4bit模式,对TF卡进行测试
沙发
EDA设计爱好者|  楼主 | 2018-9-19 17:32 | 只看该作者
描述:使用STM32CubeMX,配置SDIO的4bit模式,对SD卡进行读写测试。
SDIO只支持SD模式,而不支持SPI模式。
SDIO支持MMC,CE-ATA,SD,SDIO等存储卡。

使用特权

评论回复
板凳
EDA设计爱好者|  楼主 | 2018-9-19 17:32 | 只看该作者
而SD存储卡则分为SD1.X和2.0(SDSC、SDHC标准和高容量两种)。这些信息可以使用SDIO读SD卡寄存器而实现。
我们常用的3个寄存器为OCR,CID,CSD,用不同的命令来读这三个寄存器,这三个寄存器作为命令响应返回给主机,其中有长响应和短响应。

使用特权

评论回复
地板
EDA设计爱好者|  楼主 | 2018-9-19 17:33 | 只看该作者
在SDIO选项里,习惯性开启全局中断和DMA使能:

使用特权

评论回复
5
EDA设计爱好者|  楼主 | 2018-9-19 17:33 | 只看该作者
初始化SDIO:MX_SDIO_SD_Init();//这个函数由CubeMX生成并调用


下面的部分为新手经常缺少的操作,我看过的多数资料都没有提及:

为了保证SDIO正常工作,我们还要添加两个函数来初始化。这两个函数CubeMX没有生成调用,需要我们自己添加。
• HAL_SD_Init(&hsd, &SDCardInfo);
• HAL_SD_WideBusOperation_Config(&hsd, SDIO_BUS_WIDE_4B);

使用特权

评论回复
6
EDA设计爱好者|  楼主 | 2018-9-19 17:33 | 只看该作者
在bsp_driver_sd.c这个文件夹下面,BSP_SD_Init这个函数里就包括有以上提到的两句初始化代码。
所以实际在main函数中的用户代码段中调用该函数,既可配置成功,又没有重新添加代码的烦恼。

注:
我个人觉得上面的方法涉及到底层的函数,不是最合适的解决办法,我的解决方法是使用:
HAL_StatusTypeDef status = HAL_SD_Init(&hsd);
只需要上面这个一个函数就可以实现上面的功能,亲测有效。

使用特权

评论回复
7
EDA设计爱好者|  楼主 | 2018-9-19 17:34 | 只看该作者
介绍HAL_SD_Init的用法
这个函数用来初始化SD卡,CubeMX之所以没有生成这个函数的调用,具体原因不清楚。

使用特权

评论回复
8
EDA设计爱好者|  楼主 | 2018-9-19 17:34 | 只看该作者
如何检测SD卡是否在卡槽:
一、通过检测卡槽的CD引脚(通过电平或者中断方式)

使用特权

评论回复
9
EDA设计爱好者|  楼主 | 2018-9-19 17:34 | 只看该作者
二、轮询,通过不断调用 state = HAL_SD_GetCardState(&hsd);,查看返回值state来确定是否有卡
(这种方式浪费CPU的资源,而且检测方法太暴力了,推荐使用上面的方法)

到此CubeMX的配置完成,下面是测试的程序:
MX_GPIO_Init();
MX_SDIO_SD_Init();

使用特权

评论回复
10
EDA设计爱好者|  楼主 | 2018-9-19 17:34 | 只看该作者
void sd_test_thread(void *argument)
{
        HAL_StatusTypeDef status;   
       
        status = HAL_SD_Init(&hsd);
        if(status != HAL_OK)
        {
                printf("SD card initialize failed!\n");
                while(1) osDelay(1000);
        }
               
        while(1)
        {       
                HAL_SD_CardStateTypeDef state = HAL_SD_GetCardState(&hsd);
               
                if(state == HAL_SD_CARD_TRANSFER)
                {
                        HAL_SD_GetCardCID(&hsd, &SD_CardCID);
                        printf("\nInitialize SD card sucessfully!\n");
                        printf("SD card information\n");
                        printf("Capacity              :%llu\n", ((unsigned long long)hsd.SdCard.BlockSize*hsd.SdCard.BlockNbr));
                        printf("BlockSize             :%d\n", hsd.SdCard.BlockSize);
                        printf("RCA                   :%d\n", hsd.SdCard.RelCardAdd);
                        printf("CardType              :%d\n", hsd.SdCard.CardType);
                        printf("ManufacturerID        :%d\n", SD_CardCID.ManufacturerID);                       
                }
                else
                {               
                        printf("SD card initialize failed.\n");
                }       
               
                osDelay(1000);
        }       
}

使用特权

评论回复
11
幸福小强| | 2018-9-19 20:51 | 只看该作者
这个卡接口是4BIT?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

245

帖子

1

粉丝