SD卡文件读取

一、SD卡介绍

1.简介

SD存储卡是一种基于半导体快闪记忆器的新一代记忆设备,由于它体积小、数据传输速度快、可热插拔等优良的特性,被广泛地于便携式装置上使用,例如数码相机、平板电脑和多媒体播放器等。

2.结构

SD卡接口除了保留MMC卡的7针外,还在两边加多了2针,作为数据线。
在SD卡3.0规范中,SD卡的理论最大容量可达2TB,理论最大读写速度可达104MB/s(在最新的4.10规范中,理论最大读写速度已提高到312MB/s)。
SD卡主要分为四部分组成:外部引脚、内部寄存器、接口控制器和内部存储介质。
引脚
SD卡主要引脚和功能描述如下:
CLK:时钟信号,控制器或者SD卡在每个时钟周期传输一个命令位或数据位,在SD总线的默认速度模式下频率可在0~25MHz之间变化,SD卡的总线管理器可以不受任何限制的自由产生0~25MHz的频率,在UHS-I速度模式下,时钟频率最高可达208M。
CMD:命令和响应复用引脚,命令是由控制器发给SD卡,可以是从控制器到单个SD卡,也可以是到SD总线上所有卡;响应是存储卡对控制器发送的命令应答,应答可以来自单卡或所有卡。
DAT0~3:数据线,数据可以从卡传向控制器也可以从控制器传向卡。 [3]
寄存器
寄存器及功能描述如下:
OCR(Operating Conditions Register)寄存器:32位的操作条件寄存器主要存储了VDD电压范围,SD卡操作电压范围为2~3.6V。
CID(Card IDentification Register)寄存器:卡识别码寄存器,长度为16个字节,存储SD卡唯一标识号,该号在卡生产厂家编程后无法修改。
CSD(Card-Specific Data Register)寄存器:卡特性数据寄存器,包含了访问该卡数据时的必要配置信息。
SCR(SD Card Configuration Register)寄存器:SD卡配置寄存器(SCR),提供了SD卡的一些特殊特性在这张卡内,长度为64位,这个寄存器内容由制造商在生产厂内设置。
RCA(Relative Card Address)寄存器:卡相对地址寄存器是一个16位可写的地址寄存器,控制器可通过地址选择对应地址的SD卡。
DSR(Driver Stage Register)寄存器:驱动级寄存器,属于可选寄存器,用于配置卡的驱动输出。
接口控制器
主要用于对内部存储核心进行控制和管理,通过接收用户对其发送的命令来进行控制和设置,并根据命令作出响应,然后执行响应的数据读写等操作。
内部存储介质
数据记忆存储的Flash块。

二、实验过程

1.主函数

int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */
  

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_SPI1_Init();
  MX_FATFS_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
	
	HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1); 	//enable uart	

	printf(" mian \r\n");

	Get_SDCard_Capacity();	//得到使用内存并选择格式化



  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {		
		WritetoSD(WriteBuffer,sizeof(WriteBuffer));			
		HAL_Delay(500);
		WriteBuffer[0] = WriteBuffer[0] +0;
		WriteBuffer[1] = WriteBuffer[1] +1;
		write_cnt ++;		
		while(write_cnt > 10)
		{	
			printf(" while \r\n");
			HAL_Delay(500);
		}			
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

2.SD卡写入函数

void WritetoSD(BYTE write_buff[],uint8_t bufSize)
{
	FATFS fs;
	FIL file;
	uint8_t res=0;
	UINT Bw;	
	
	res = SD_init();		//SD卡初始化
	
	if(res == 1)
	{
		printf("SD卡初始化失败! \r\n");		
	}
	else
	{
		printf("SD卡初始化成功! \r\n");		
	}
	
	res=f_mount(&fs,"0:",1);		//挂载
	
//	if(test_sd == 0)		//用于测试格式化
	if(res == FR_NO_FILESYSTEM)		//没有文件系统,格式化
	{
//		test_sd =1;				//用于测试格式化
		printf("没有文件系统! \r\n");		
		res = f_mkfs("", 0, 0);		//格式化sd卡
		if(res == FR_OK)
		{
			printf("格式化成功! \r\n");		
			res = f_mount(NULL,"0:",1); 		//格式化后先取消挂载
			res = f_mount(&fs,"0:",1);			//重新挂载	
			if(res == FR_OK)
			{
				printf("SD卡已经成功挂载,可以进进行文件写入测试!\r\n");
			}	
		}
		else
		{
			printf("格式化失败! \r\n");		
		}
	}
	else if(res == FR_OK)
	{
		printf("挂载成功! \r\n");		
	}
	else
	{
		printf("挂载失败! \r\n");
	}	
	
	res = f_open(&file,SD_FileName,FA_OPEN_ALWAYS |FA_WRITE);
	if((res & FR_DENIED) == FR_DENIED)
	{
		printf("卡存储已满,写入失败!\r\n");		
	}
	
	f_lseek(&file, f_size(&file));//确保写词写入不会覆盖之前的数据
	if(res == FR_OK)
	{
		printf("打开成功/创建文件成功! \r\n");		
		res = f_write(&file,write_buff,bufSize,&Bw);		//写数据到SD卡
		if(res == FR_OK)
		{
			printf("文件写入成功! \r\n");			
		}
		else
		{
			printf("文件写入失败! \r\n");
		}		
	}
	else
	{
		printf("打开文件失败!\r\n");
	}	
	
	f_close(&file);						//关闭文件		
	f_mount(NULL,"0:",1);		 //取消挂载
	
}


3.接线

CS—— PB0
SCK ——PA5
MISO ——PA6
MOSI—— PA7

三丶实验结果

SD卡中生成一个新的hello.txt文件
内容如下
在这里插入图片描述
更改写入内容
在这里插入图片描述
效果
在这里插入图片描述

四、注意事项

1.确保SD格式化成FAT文件模式
2.单片机的供电和SD卡模块的供电最好是5V,不然可能带不动
3.杜邦线连接要尽可能的短
4.连接最好紧一点,有时候稍微松一点就不行
5.可能要等一会才初始化成功,别急

五、参考

https://blog.csdn.net/m0_58414679/article/details/122036435?spm=1001.2014.3001.5501

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值