STM32CubeMx之SD卡驱动

发布时间:2024-02-26  

1.SD卡简介

SD存储卡(Secure Digital Memory Card)是一种基于半导体快闪存储器的新一代高速存储设备。SD存储卡的技术是从MMC卡(MultiMedia Card)格式上发展而来,在兼容SD存储卡基础上发展了SDIO(SD Input/ Output)卡,此兼容性包括机械,电子,电力,信号和软件,通常将SD、SDIO卡俗称SD存储卡。
SD卡具有高记忆容量、快速数据传输率、极大的移动灵活性以及很好的安全性,它被广泛地应用于便携式装置上,例如数码相机、平板电脑和多媒体播放器等。
SD卡支持两种总线方式:SD方式与SPI方式。其中 SD 方式采用 6 线制,使用 CLK、 CMD、 DAT0~DAT3进行数据通信。而SPI方式采用4线制,使用CS、CLK、DataIn、DataOut 进行数据通信。
SD 方式时的数据传输速度与SPI方式要快,STM32F103ZE自带SDIO接口驱动,4位模式最高速度可达24MHZ,8位总线模式下可达48MHZ,本章节将介绍如何使用HAL库完成对SD卡驱动。

poYBAGKUkkOAUvPKAAdF1sfJl-s520.png

2.SDIO简介

SD/SDIO MMC卡主机模块(SDIO)在AHB外设总线和多媒体卡(MMC)、 SD存储卡、 SDIO卡和CE-ATA设备间提供了操作接口。
SDIO的主要功能如下:

  • 与多媒体卡系统规格书版本4.2全兼容。支持三种不同的数据总线模式:1位(默认)、 4位和8位。

  • 与较早的多媒体卡系统规格版本全兼容(向前兼容)。

  • 与较早的多媒体卡系统规格版本全兼容(向前兼容)。

  • 与SD存储卡规格版本2.0全兼容。

  • 与SD I/O卡规格版本2.0全兼容,支持良种不同的数据总线模式:1位(默认)和4位。

  • 完全支持CE-ATA功能(与CE-ATA数字协议版本1.1 全兼容)。

  • 8位总线模式下数据传输速率可达48MHz。

3.硬件接口

poYBAGKUkreAAZPmAADMCPgiZv4597.png

引脚 SDIO SPI
SDIO_D2(PC10) 数据线
SDIO_D3(PC11) 数据线 SPI_CS 片选
SDIO_CMD(PD2) 控制线 SPI_MOSI主机输出
SDIO_SCK(PC12) 时钟 SPI_SCK时钟线
SDIO_D0(PC8) 数据线 SPI_MISO主机输入
SDIO_D1(PC9) 数据线

4 软件设置

pYYBAGKUk2GADFAKAAOxr3Nvv8A330.pngpYYBAGKUk3aAMuoaAACGotghO_k103.pngpYYBAGKUk4eAULqwAAG3UZDYe-4451.pngpYYBAGKUk5aAfRGeAAGC7es0Omw405.png

5 代码生成

  1.SD初始化

相关配置可参考STM32中文参考手册_V1.0第20.9.2时钟控制寄存器SDIO_CLKCR。

pYYBAGKUlAeAUdLdAAD5zhx1dpA160.pngpYYBAGKUlBSAGM-pAASjbdVzaks545.png

2.SD读写扇区函数

为了方便后续FATFS文件系统移植,我们这里封装两个函数SD卡写扇区和读扇区。


void SD_WriteDisk(uint8_t *buf,uint32_t sector_add,uint32_t cnt)

{

HAL_SD_WriteBlocks(&hsd,buf,sector_add,cnt,5000);//SD卡写块

while(HAL_SD_GetCardState(&hsd)!=HAL_SD_CARD_TRANSFER);//等待数据传输完成


}

void SD_ReadDisk(uint8_t *buf,uint32_t sector_add,uint32_t cnt)

{

HAL_SD_ReadBlocks(&hsd,buf,sector_add,cnt,5000);//SD卡读块

while(HAL_SD_GetCardState(&hsd)!=HAL_SD_CARD_TRANSFER);//等待数据传输完成

}

3.主函数

uint8_t buf_tx[4096]="SD卡SDIO驱动HAL库配置测试数据STM32F103ZET6  -- Ver1.0";

uint8_t buf_rx[4096];  

MX_GPIO_Init();

  MX_FSMC_Init();

  MX_SDIO_SD_Init();

  MX_USART1_UART_Init();

  MX_SPI2_Init();

  /* USER CODE BEGIN 2 */

char buff[200];

NT35310_Init();//LCD初始化

LCD_Display_Str(LCD_WIDTH/2-strlen("SD卡初始化")/2*8,20,16,(u8 *)"SD卡初始化",BLACK);

if(hsd.State!=HAL_SD_STATE_READY)

{

LCD_Display_Str(20,40,16,(u8 *)"SD Init  ERR",RED);

}

else

{

LCD_Display_Str(20,40,16,(u8 *)"SD Init  OK",RED);

LCD_Display_Str(20,60,16,(u8 *)"卡类型:",RED);

if(hsd.SdCard.CardType==CARD_SDHC_SDXC)//2.0告诉卡

{

LCD_Display_Str(20+8+strlen("卡类型:")*8,60,16,(u8 *)"SDHC",RED);

}

else if(hsd.SdCard.CardType==CARD_SDSC)//2.0普通卡

{

LCD_Display_Str(20+8+strlen("卡类型:")*8,60,16,(u8 *)"SDSC",RED);

}

snprintf(buff,sizeof(buff),"块大小: %d byten",hsd.SdCard.BlockSize);

LCD_Display_Str(20,80,16,(u8 *)buff,RED);

snprintf(buff,sizeof(buff),"卡容量大小: %.2f GBn",(hsd.SdCard.BlockNbr>>11)/1024.0);

LCD_Display_Str(20,100,16,(u8 *)buff,RED);

}

LCD_Display_Str(LCD_WIDTH/2-strlen("SD数据读写测试")/2*8,130,16,(u8 *)"SD数据读写测试",BLACK);

SD_WriteDisk(buf_tx,100,2);

LCD_Display_Str(20,150,16,(u8 *)"SD写数据: OK",RED);

SD_ReadDisk(buf_rx,100,3);

LCD_Display_Str(20,170,16,(u8 *)"SD读数据: OK",RED);

LCD_Display_Str(20,190,16,(u8 *)"数据内容:",RED);

LCD_Display_Str(20,210,16,(u8 *)buf_rx,BLUE);

poYBAGKUlFeAKyj0AANc1ge4mgQ884.png

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>