SD卡数据读取

目录

一安装 Altium Designer18 并用其绘制 stm32 最小系统的电路原理图

1.下载与安装

2.文件配置

​ 3.绘制 stm32 最小系统的电路原理图

3.1绘制前目标

3.2创建工程

3.3元件库

3.4绘制开始

3.5绘制结果

4 SD卡原理图

5.最终原理图STM32C8T6+SD

二、掌握SD卡协议原理,用STM32F103完成对SD卡的数据读取(fat文件模式)。

sd卡协议

1.stm32cube配置 

 2.文件工程配置

3.效果展示

参考链接:


一安装 Altium Designer18 并用其绘制 stm32 最小系统的电路原理图

1.下载与安装

网盘下载地址:百度网盘 请输入提取码 提取码:luha

解压后

 

 

2.文件配置

 打开下载的 AltiumDesigner 软件,选择 license ,选择文件进行保存,如下:

 

完成

 3.绘制 stm32 最小系统的电路原理图

3.1绘制前目标

使用 Altium Designer 绘制一个 stm32 最小系统的电路原理图。

何为stm32 最小系统的电路原理图
最小系统为单片机工作的最低要求,不含外设控制,原理简单,分析最小系统是嵌入式入门的基础。
stm32 最小系统的电路原理图如下,我们的目标就是绘制出下面的原理图。

最小系统主要有电源,时钟,调试,复位,以及控制芯片五大部分组成。


3.2创建工程

点击 File -> New -> Project -> PCD Project,新建一个 PCD 工程,得到如下界面:

右击 PCD_Project1.PrjPCB,选择 Add New to Project -> Schematic,新建一个原理图,等待加载完毕后,得到如下界面:

 

3.3元件库

下载链接 :元件库.zip_免费高速下载|百度网盘-分享无限制 (baidu.com)

提取码:luha

将三个元件库加入到里面

 

3.4绘制开始

 打开的元件库里找到 stm32f103c8t6 芯片,并双击打开,然后点击左将元件放在中间

引脚连接

 

将所有引脚都延长,可以复制粘贴(选中之后可以使用 ctrl + c 复制,ctrl + v 粘贴,按空格可以每90°旋转器件)。最终效果如下:
 然后选择这个

 选中后,按下TAB键,编辑名称

选择下面的元件

3.5绘制结果

STM32芯片

R:Miscellaneous Devices LC.IntLib 元件库中搜索 0805 10k 

 

指示灯

R:Miscellaneous Devices LC.IntLib 元件库中搜索 0805 1k
D:Miscellaneous Devices LC.IntLib 元件库中搜索 0603

stm32 去耦电路
C:Miscellaneous Devices LC.IntLib 元件库中搜索 0805 100nf 

 晶振电路
Y:Miscellaneous Devices.IntLib 元件库中搜索 XTAL
C:Miscellaneous Devices LC.IntLib 元件库中搜索 0805 22pf

 复位电路
S:Miscellaneous Devices.IntLib 元件库中搜索 SW-PB
C:Miscellaneous Devices LC.IntLib 元件库中搜索 0805 1uf

降压电路
AMS1117:stm32f103c8t6 最小系统.SchLib 元件库中 

 下载方式选择及程序烧录接口
P:Miscellaneous Connectors.IntLib 元件库中搜索 MHDR

 输入、输出电源
J:base.SchLib 元件库中搜索 USB micro

排针
P:Miscellaneous Connectors.IntLib 元件库中搜索 MHDR1X16

4 SD卡原理图

5.最终原理图STM32C8T6+SD

 

二、掌握SD卡协议原理,用STM32F103完成对SD卡的数据读取(fat文件模式)。

sd卡协议

下图是SD卡的体系架构,可以看到内部包含了一系列的寄存器:

SD Memory Card Architecture

各个寄存器的详细信息如下:

SD Memory Card Registers

SD配置寄存器提供SD卡的特殊特性信息,其大小为64位。该寄存器由厂商编程,主机不能对它进行编程。

SD存储卡(Secure Digital Memory Card)是一种基于半导体快闪存储器的新一代高速存储设备。SD存储卡的技术是从MMC卡(MultiMedia Card格式上发展而来,在兼容SD存储卡基础上发展了SDIO(SD Input/ Output)卡,此兼容性包括机械,电子,电力,信号和软件,通常将SD、SDIO卡俗称SD存储卡

一张SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器5 个部分。
存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输;
电源检测单元保证SD卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位;
卡及接口控制单元控制SD卡的运行状态,它包括有8个寄存器;
接口驱动器控制 SD 卡引脚的输入输出。

驱动模式
SD卡有两种驱动模式:SPI模式与SDIO模式。它们所使用的接口信号是不同的。在SPI模式下,只会用到SD卡的4根信号线,即CS、DI、SCLK与DO(分别是SD卡的片选、数据输入、时钟与数据输出)。

传输模式
SD卡共支持三种传输模式:SPI模式(独立序列输入和序列输出),1位SD模式(独立指令和数据通道,独有的传输格式),4位SD模式(使用额外的针脚以及某些重新设置的针脚。支持四位宽的并行传输)。

FATFS 是一个通用的文件系统(FAT/exFAT)模块,用于在小型嵌入式系统中实现FAT文件系统。 FatFs 组件的编写遵循ANSI C(C89),完全分离于磁盘 I/O 层,因此不依赖于硬件平台。它可以嵌入到资源有限的微控制器中,如 8051, PIC, AVR, ARM, Z80, RX等等,不需要做任何修改。

FATFS提供了以下文件访问函数:
f_open - 打开/创建文件
f_close - 关闭打开的文件
f_read - 从文件中读取数据
f_write - 将数据写入文件
f_lseek - 移动读/写指针,扩展大小
f_truncate - 截断文件大小
f_sync - 刷新缓存的数据
f_forward - 将数据转发到流
f_expand - 为文件分配连续块
f_gets - 读取字符串
f_putc - 写一个字符
f_puts - 编写字符串
f_printf - 编写格式化字符串
f_tell - 获取当前读/写指针
f_eof - 测试文件结尾
f_size - 获取尺寸
f_error - 测试错误

1.stm32cube配置 

我用的这个芯片

 勾选

sys配置 

 配置PA4

SPI1

 USART1

 时钟配置

最后一步 

 2.文件工程配置

将这两个文件放在本目录下

 打开文件

修改main,添加头文件

 添加下面代码

HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1); 	//enable uart	

	printf(" mian \r\n");

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


		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_diskio.c文件

1.添加头文件 #include "diskio.h" /* Declarations of disk functions */

#include "SDdriver.h"

2.将下面代码放在指定位置,修改函数内容:USER_initialize、USER_status、USER_read、USER_write、USER_ioctl

 uint8_t res;
	res = SD_init();//SD_Initialize() 
		 	if(res)//STM32 SPI的bug,在sd卡操作失败的时候如果不执行下面的语句,可能导致SPI读写异常
			{
				SPI_setspeed(SPI_BAUDRATEPRESCALER_256);
				spi_readwrite(0xff);//提供额外的8个时钟
				SPI_setspeed(SPI_BAUDRATEPRESCALER_2);
			}
	if(res)return  STA_NOINIT;
	else return RES_OK; //初始化成功

 switch (pdrv)
	{
		case 0 :
			return RES_OK;
		case 1 :
			return RES_OK;
		case 2 :
			return RES_OK;
		default:
			return STA_NOINIT;
	}

 uint8_t res;
	if( !count )
	{    
		return RES_PARERR;  /* count不能等于0,否则返回参数错误 */
	}
	switch (pdrv)
	{
		case 0:
		    res=SD_ReadDisk(buff,sector,count);	 
				if(res == 0){
					return RES_OK;
				}else{
					return RES_ERROR;
				}                                               
		default:
			return RES_ERROR;
	}

uint8_t  res;
	if( !count )
	{    
		return RES_PARERR;  /* count不能等于0,否则返回参数错误 */
	}
	switch (pdrv)
	{
		case 0:
		    res=SD_WriteDisk((uint8_t *)buff,sector,count);
				if(res == 0){
					return RES_OK;
				}else{
					return RES_ERROR;
				}                                                
		default:return RES_ERROR;
	}

 

 DRESULT res;
	 switch(cmd)
	    {
		    case CTRL_SYNC:
						SD_CS(1);
						do{
							HAL_Delay(20);
						}while(spi_readwrite(0xFF)!=0xFF);
						res=RES_OK;
						SD_CS(0);
		        break;	 
		    case GET_SECTOR_SIZE:
		        *(WORD*)buff = 512;
		        res = RES_OK;
		        break;	 
		    case GET_BLOCK_SIZE:
		        *(WORD*)buff = 8;
		        res = RES_OK;
		        break;	 
		    case GET_SECTOR_COUNT:
		        *(DWORD*)buff = SD_GetSectorCount();
		        res = RES_OK;
		        break;
		    default:
		        res = RES_PARERR;
		        break;
	    }
		return res;

可以直接下载我后面参考博客的代码。

3.效果展示

连接串口

查看写入的文件

参考链接:

(31条消息) STM32用cube配置FATFS模式下SPI读写SD卡_Drive World的博客-CSDN博客

(31条消息) 安装 Altium Designer18 并用其绘制 stm32 最小系统的电路原理图_L-GRAZY的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值