Altium Designer 18电路原理图绘制&STM32F103 完成对SD卡的数据读取


Altium Designer 18电路原理图绘制&STM32F103 完成对SD卡的数据读取

  • Altium Designer 18电路原理图绘制&STM32F103 完成对SD卡的数据读取
  • 一、题目内容
  • 二、SD卡协议原理
  • 1、SD卡介绍
  • 2、物理结构&寄存器
  • 3、SD卡操作模式
  • 4、SD卡初始化(SPI)
  • 5、SD卡读取和写入(SPI)
  • 三、SD卡实验过程及实验结果
  • 1、前期准备
  • 2、连线
  • 3、HAL库的配置
  • 4、代码
  • 5、实验结果
  • 四、安装Altium Designer 18
  • 五、原理图绘制
  • 1、新建工程
  • 2、下载元件库
  • 3、绘制原理图
  • 六、绘制STM32+SD卡原理图
  • 1、SD卡模块
  • 2、SD卡模块原理图
  • 3、实验成果
  • 七、实验总结
  • 八、参考资料


一、题目内容

  1. 掌握电路原理图绘制。安装Altium Designer 18,学习使用Altium Designer绘制一个stm32最小系统的电路原理图,并在此基础上完成STM32+SD卡 的系统原理图设计。(该系统的PCB图的绘制不做要求,凭个人兴趣选做)
  2. 掌握SD卡协议原理,用STM32F103完成对SD卡的数据读取(fat文件模式)。

二、SD卡协议原理

1、SD卡介绍

很多单片机系统都需要大容量存储设备,以存储数据。目前常用的有 U 盘,FLASH 芯片,SD 卡等。他们各有优点,综合比较,最适合单片机系统的莫过于 SD 卡了,它不仅容量可以做到很大(32GB 以上),支持 SPI/SDIO 驱动,而且有多种体积的尺寸可供选择(标准的 SD 卡尺寸,以及 TF 卡尺寸等),能满足不同应用的要求。
只需要少数几个 IO 口即可外扩一个高达 32GB 以上的外部存储器,容量从几十 M 到几十G 选择尺度很大,更换也很方便,编程也简单,是单片机大容量外部存储器的首选。

2、物理结构&寄存器

一般SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器 5个部分。

物理结构:

ESP32无法读取SD卡 esp32连接sd卡_stm32


ESP32无法读取SD卡 esp32连接sd卡_ESP32无法读取SD卡_02


存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输;

电源检测单元保证 SD 卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位;

卡及接口控制单元控制 SD 卡的运行状态,它包括有 8 个寄存器;

接口驱动器控制 SD 卡引脚的输入输出。

SD卡寄存器

D卡总共有8个寄存器,用于设定或表示SD卡信息。

这些寄存器只能通过对应的命令访问,SDIO定义64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。

ESP32无法读取SD卡 esp32连接sd卡_单片机_03


SD卡引脚功能详述

ESP32无法读取SD卡 esp32连接sd卡_arm_04

3、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类,下表为几个比较重要的命令:

ESP32无法读取SD卡 esp32连接sd卡_stm32_05

4、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),在完成了初始化之后,就可以开始读写数据了。

5、SD卡读取和写入(SPI)

SD卡读取:
1、发送CMD17;
2、接收卡响应R1;
3、接收数据起始令牌0XFE;
4、接收数据;
5、接收2个字节的CRC,如果不使用CRC,这两个字节在读取后可以丢掉。
6、禁止片选之后,发多8个CLK;
SD卡写入:
1、发送CMD24;
2、接收卡响应R1;
3、发送写数据起始令牌0XFE;
4、发送数据;
5、发送2字节的伪CRC;
6、禁止片选之后,发多8个CLK;

三、SD卡实验过程及实验结果

1、前期准备

SD卡模块及SD卡

ESP32无法读取SD卡 esp32连接sd卡_单片机_06


内部结构:

ESP32无法读取SD卡 esp32连接sd卡_arm_07


ESP32无法读取SD卡 esp32连接sd卡_原理图_08

2、连线

ESP32无法读取SD卡 esp32连接sd卡_原理图_09


ESP32无法读取SD卡 esp32连接sd卡_arm_10

3、HAL库的配置

这里是网盘地址:
链接:https://pan.baidu.com/s/1KNBN-y2esPHLJWBjv6IiRw
提取码:1234

4、代码

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 */
}

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);
		}

这里我们看下write_cnt初始定义的值,计算写入次数循环要求。

(在main.c文件头部)

从0开始,write_cnt=0,因此要写入超过11次,之后不再写入内容。

ESP32无法读取SD卡 esp32连接sd卡_arm_11


写入函数WritetoSD

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);		 //取消挂载
}

从写入函数中,我们可以知道,针对SD卡文件的每个步骤,我们都进行了相应的字段输出,来具体判断究竟进行到了什么地步。

ESP32无法读取SD卡 esp32连接sd卡_ESP32无法读取SD卡_12


这可以更改输入我们想要的内容。

5、实验结果

编译成功

ESP32无法读取SD卡 esp32连接sd卡_stm32_13


烧录

ESP32无法读取SD卡 esp32连接sd卡_arm_14


初始化

ESP32无法读取SD卡 esp32连接sd卡_stm32_15


实验成果

ESP32无法读取SD卡 esp32连接sd卡_stm32_16

四、安装Altium Designer 18

介绍:

Altium Designer 在单一设计环境中集成板级和FPGA系统设计、基于FPGA和分立处理器的嵌入式软件开发以及PCB版图设计、编辑和制造。并集成了现代设计数据管理功能,使得Altium Designer成为电子产品开发的完整解决方案,一个既满足当前,也满足未来开发需求的解决方案。

安装Altium Designer18:

ESP32无法读取SD卡 esp32连接sd卡_原理图_17


以管理员运行

ESP32无法读取SD卡 esp32连接sd卡_ESP32无法读取SD卡_18


选择汉语

ESP32无法读取SD卡 esp32连接sd卡_原理图_19


ESP32无法读取SD卡 esp32连接sd卡_ESP32无法读取SD卡_20


ESP32无法读取SD卡 esp32连接sd卡_arm_21


ESP32无法读取SD卡 esp32连接sd卡_原理图_22


打开Crack文件夹,复制shfolder.dll文件到Altium Designer的安装目录下

ESP32无法读取SD卡 esp32连接sd卡_单片机_23


打开Altium Designer 软件,选择license,选择文件并打开

ESP32无法读取SD卡 esp32连接sd卡_arm_24


成功注册

ESP32无法读取SD卡 esp32连接sd卡_原理图_25


点击设置,勾选Use localized resources,点击OK,重启Altium Designer,汉化成功

ESP32无法读取SD卡 esp32连接sd卡_单片机_26


安装完成

五、原理图绘制

因为我们是第一次进行绘制,所以我们先可以在网上找现成的原理图进行模仿。
网盘链接(淘宝商家):https://pan.baidu.com/share/init?surl=ipHs1nPdf6Xq3H_OH5j7DA
提取码:7hqu

1、新建工程

点击File->New->Project->PCD Project,新建工程

ESP32无法读取SD卡 esp32连接sd卡_ESP32无法读取SD卡_27


右击PCD_Project1.PrjPCB,选择Add New to Project->Schematic,新建原理图。

ESP32无法读取SD卡 esp32连接sd卡_ESP32无法读取SD卡_28

2、下载元件库

这里有别人的网盘:https://pan.baidu.com/s/1jiJAqjsCjWf41C5edIP7Ww 提取码:1521

添加

ESP32无法读取SD卡 esp32连接sd卡_ESP32无法读取SD卡_29

ESP32无法读取SD卡 esp32连接sd卡_原理图_30

3、绘制原理图

在元件库中找到stm32f103c8t6芯片,双击打开,将元件放在中间

ESP32无法读取SD卡 esp32连接sd卡_stm32_31


点击放置线延长管脚,左键在起始和终点各点击一下连接,右键释放掉

(可使用 ctrl + c 复制,ctrl + v 粘贴,按空格可每90°旋转器件)

ESP32无法读取SD卡 esp32连接sd卡_arm_32


点击Net Label放置网络编号,按tab键进入设置窗口,编辑编号名称,回车退出编辑框,再左键放下

ESP32无法读取SD卡 esp32连接sd卡_ESP32无法读取SD卡_33


这就是连接完的成果

六、绘制STM32+SD卡原理图

1、SD卡模块

SD卡模块说明

ESP32无法读取SD卡 esp32连接sd卡_单片机_34


内部结构

ESP32无法读取SD卡 esp32连接sd卡_arm_35


ESP32无法读取SD卡 esp32连接sd卡_arm_36


ESP32无法读取SD卡 esp32连接sd卡_单片机_37

2、SD卡模块原理图

ESP32无法读取SD卡 esp32连接sd卡_原理图_38


根据SD卡模块的设计,可以知道各管脚连线如下:

ESP32无法读取SD卡 esp32连接sd卡_stm32_39


绘制

点击右上角的Libraries,选择下载的元件库并寻找器件

AMS1117:stm32f103c8t6 最小系统.SchLib 元件库中

P:Miscellaneous Connectors.IntLib 元件库中搜索 MHDR

C:Miscellaneous Devices LC.IntLib元件库中搜索 0805 100uF

ESP32无法读取SD卡 esp32连接sd卡_单片机_40


ESP32无法读取SD卡 esp32连接sd卡_arm_41

3、实验成果

ESP32无法读取SD卡 esp32连接sd卡_stm32_42

七、实验总结

通过这次实验我们可以学习Altium Designer 18的一些基本操作,然后还有SD卡的相关知识,在实验过程中还是遇到了一些问题但是,通过老师、同学还有网上的博客得到了解决,总之这次实验收获还是挺大的。