【嵌入式20】STM32F103完成对SD卡的数据读取详细操作 |
您所在的位置:网站首页 › sd卡读写权限在哪里设置 › 【嵌入式20】STM32F103完成对SD卡的数据读取详细操作 |
本文主要利用STM32F103完成对SD卡的数据读取,介绍该实验的详细操作
一、题目要求二、SD卡协议原理1、SD卡简述2、SD卡物理结构3、SD卡寄存器4、SD卡操作模式5、SD卡初始化(SPI模式)6、SD卡读取与写入(SPI模式)
三、实验操作1、硬件准备2、连线3、HAL库配置4、代码分析5、实验结果分析
四、SD卡累计写入及速率分析1、题目要求2、硬件准备3、实验操作
五、总结
一、题目要求
掌握SD卡协议原理,用STM32F103完成对SD卡的数据读取(fat文件模式)。 二、SD卡协议原理 1、SD卡简述很多单片机系统都需要大容量存储设备,以存储数据。目前常用的有 U 盘,FLASH 芯片,SD 卡等。他们各有优点,综合比较,最适合单片机系统的莫过于 SD 卡了,它不仅容量可以做到很大(32GB 以上),支持 SPI/SDIO 驱动,而且有多种体积的尺寸可供选择(标准的 SD 卡尺寸,以及 TF 卡尺寸等),能满足不同应用的要求。 只需要少数几个 IO 口即可外扩一个高达 32GB 以上的外部存储器,容量从几十 M 到几十G 选择尺度很大,更换也很方便,编程也简单,是单片机大容量外部存储器的首选。 2、SD卡物理结构一般SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器 5个部分。
SD卡总共有8个寄存器,用于设定或表示SD卡信息。 这些寄存器只能通过对应的命令访问,SDIO定义64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。 名称bit宽度描述CID128卡识别号(Card identification number):用来识别的卡的个体号码(唯一的)RCA16相对地址(Relative card address):卡的本地系统地址,初始化时,动态地由卡建议,主机核准DSR16驱动级寄存器(Driver Stage Register):配置卡的输出驱动CSD128卡的特定数据(Card Specific Data):卡的操作条件信息SCR64SD配置寄存器(CD Configuration Register):SD卡特殊特性信息OCR32操作条件寄存器(Operation conditiongs register)SSR512SD状态(SD Status):SD卡专有特征的信息CSR32卡状态(Card Status):卡状态信息 4、SD卡操作模式SD卡一般都支持 SDIO 和 SPI 这两种接口。 其中SD卡模式的信号线有:CLK、CMD、DAT0-DAT3,6根线。 SPI模式的信号线有:CS、CLK、MISO(DATAOUT)、MOSI(DATAIN),4根线。 SD卡的命令格式:命令CMD0就是0,CMD16就是16,以此类推。 SD卡的命令总共有12类,下表为几个比较重要的命令: 命令参数回应描述CMD0(0X00)NONER1复位SD卡CMD8(0X08)VHS+Check PatternR7发送接口状态命令CMD9(0X09)NONER1读取卡特定数据寄存器CMD10(0X0A)NONER1读取卡标志数据寄存器CMD16(0X10)块大小R1设置块大小(字节数)CMD17(0X11)地址R1读取一个块的数据CMD24(0X18)地址R1写入一个块的数据CMD41(0X29)NONER3发送给主机容量支持信息和激活卡初始化过程CMD55(0X37)NONER1告诉SD卡,下一个是特定应用命令CMD58(0X3A)NONER3读取OCR寄存器 5、SD卡初始化(SPI模式)SPI操作模式下:在SD卡收到复位命令时,CS为有效电平(低电平),则SPI模式被启用,在发送CMD之前要先发送74个时钟,64个为内部供电上升时间,10个用于SD卡同步;之后才能开始CMD操作,在初始化时CLK时钟不能超过400KHz。 1、初始化与SD卡连接的硬件条件(MCU的SPI配置,IO口配置); 2、上电延时(>74个CLK); 3、复位卡(CMD0),进入IDLE状态; 4、发送CMD8,检查是否支持2.0协议; 5、根据不同协议检查SD卡(命令包括:CMD55、CMD41、CMD58和CMD1等); 6、取消片选,发多8个CLK,结束初始化 这样我们就完成了对SD卡的初始化,注意末尾发送的8个CLK是提供SD卡额外的时钟,完成某些操作。通过SD卡初始化,我们可以知道SD卡的类型(V1、V2、V2HC或者MMC),在完成了初始化之后,就可以开始读写数据了。 6、SD卡读取与写入(SPI模式)1、发送CMD17; 2、接收卡响应R1; 3、接收数据起始令牌0XFE; 4、接收数据; 5、接收2个字节的CRC,如果不使用CRC,这两个字节在读取后可以丢掉。 6、禁止片选之后,发多8个CLK; 以上就是一个典型的读取SD卡数据过程,SD卡的写于读数据差不多,写数据通过CMD24来实现,具体过程如下: 1、发送CMD24; 2、接收卡响应R1; 3、发送写数据起始令牌0XFE; 4、发送数据; 5、发送2字节的伪CRC; 6、禁止片选之后,发多8个CLK; 以上就是一个典型的写SD卡过程。 三、实验操作 1、硬件准备SD卡模块及SD卡 因为STM32要连接SD卡模块,所以我们要进行相应配置。 完整工程代码如下(hal库版本) 链接:https://pan.baidu.com/s/1YxLpaIM6HMQ4d_9yh4M4ww 提取码:276d 针对main主函数进行分析 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(" main \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] +10; WriteBuffer[1] = WriteBuffer[1] +10; 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 */ }说明: 从写入函数中,我们可以知道,针对SD卡文件的每个步骤,我们都进行了相应的字段输出,来具体判断究竟进行到了什么地步。 5、实验结果分析最开始,要么初始化失败,要么没反应,要么初始化成功之后没反应,各种情况吧。 就很秃然
但是左侧出现了乱码情况,因此对主函数进行修改 然后分析一下串口收到的内容: 可以证明,确实写入次数超过11次后,会不断返回while值,而txt文本里有11行内容,之后也不会再写入了。 四、SD卡累计写入及速率分析 1、题目要求在SD卡创建一个test-speed.txt文件,循环(不加延时)分批一次写入256字节,累计写入不少于64KB字节;然后读取此文件数据,通过串口显示出来。分析写入和读取的速率。 2、硬件准备闪迪16GB的SD卡(下图介绍了市面产品的读写测试数据)
因为要分批一次写入256个字节,也就是128个字,除了最开始用序号标识写入次数,内容都是一致的,随便找一些内容放上就好。 目的要累计写入超过64KB字节,1KB=1024bytes,64KB=65536bytes,每次写入256bytes,那么至少要写入65536/256=256次才可以。 修改内容及文件名 char SD_FileName[] = "test-speed.txt"; uint8_t WriteBuffer[] = "001君不见黄河之水天上来奔流到海不复回君不见高堂明镜悲白发朝如青丝暮成雪人生得意须尽欢莫使金樽空对月天生我材必有用千金散尽还复来烹羊宰牛且为乐会须一饮三百杯岑夫子丹丘生将进酒杯莫停与君歌一曲请君为我倾耳听钟鼓馔玉不足贵但愿长醉不复醒古来圣贤皆寂寞\r\n";修改序号的循环,使之能够最少从001到999 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |