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卡驱动。
SD/SDIO MMC卡主机模块(SDIO)在AHB外设总线和多媒体卡(MMC)、 SD存储卡、 SDIO卡和CE-ATA设备间提供了操作接口。
SDIO的主要功能如下:
引脚 | 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) | 数据线 |
相关配置可参考STM32中文参考手册_V1.0第20.9.2时钟控制寄存器SDIO_CLKCR。
为了方便后续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);//等待数据传输完成
}
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 byte\n",hsd.SdCard.BlockSize);
LCD_Display_Str(20,80,16,(u8 *)buff,RED);
snprintf(buff,sizeof(buff),"卡容量大小: %.2f GB\n",(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);
全部0条评论
快来发表一下你的评论吧 !