Altium Designer 18电路原理图绘制&STM32F103 完成对SD卡的数据读取
Altium Designer 18电路原理图绘制&STM32F103 完成对SD卡的数据读取
一、题目内容
- 掌握电路原理图绘制。安装Altium Designer 18,学习使用Altium Designer绘制一个stm32最小系统的电路原理图,并在此基础上完成STM32+SD卡 的系统原理图设计。(该系统的PCB图的绘制不做要求,凭个人兴趣选做)
- 掌握SD卡协议原理,用STM32F103完成对SD卡的数据读取(fat文件模式)。
二、SD卡协议原理
1、SD卡介绍
很多单片机系统都需要大容量存储设备,以存储数据。目前常用的有 U 盘,FLASH 芯片,SD 卡等。他们各有优点,综合比较,最适合单片机系统的莫过于 SD 卡了,它不仅容量可以做到很大(32GB 以上),支持 SPI/SDIO 驱动,而且有多种体积的尺寸可供选择(标准的 SD 卡尺寸,以及 TF 卡尺寸等),能满足不同应用的要求。 只需要少数几个 IO 口即可外扩一个高达 32GB 以上的外部存储器,容量从几十 M 到几十G 选择尺度很大,更换也很方便,编程也简单,是单片机大容量外部存储器的首选。
2、物理结构&寄存器
一般SD卡包括有存储单元、存储单元接口、电源检测、卡及接口控制器和接口驱动器 5个部分。 物理结构: 存储单元是存储数据部件,存储单元通过存储单元接口与卡控制单元进行数据传输; 电源检测单元保证 SD 卡工作在合适的电压下,如出现掉电或上状态时,它会使控制单元和存储单元接口复位; 卡及接口控制单元控制 SD 卡的运行状态,它包括有 8 个寄存器; 接口驱动器控制 SD 卡引脚的输入输出。 SD卡寄存器 D卡总共有8个寄存器,用于设定或表示SD卡信息。 这些寄存器只能通过对应的命令访问,SDIO定义64个命令,每个命令都有特殊意义,可以实现某一特定功能,SD卡接收到命令后,根据命令要求对SD卡内部寄存器进行修改,程序控制中只需要发送组合命令就可以实现SD卡的控制以及读写操作。 SD卡引脚功能详述
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类,下表为几个比较重要的命令:
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卡 内部结构:
2、连线
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次,之后不再写入内容。 写入函数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卡文件的每个步骤,我们都进行了相应的字段输出,来具体判断究竟进行到了什么地步。 这可以更改输入我们想要的内容。
5、实验结果
编译成功 烧录 初始化 实验成果
四、安装Altium Designer 18
介绍: Altium Designer 在单一设计环境中集成板级和FPGA系统设计、基于FPGA和分立处理器的嵌入式软件开发以及PCB版图设计、编辑和制造。并集成了现代设计数据管理功能,使得Altium Designer成为电子产品开发的完整解决方案,一个既满足当前,也满足未来开发需求的解决方案。 安装Altium Designer18: 以管理员运行 选择汉语 打开Crack文件夹,复制shfolder.dll文件到Altium Designer的安装目录下 打开Altium Designer 软件,选择license,选择文件并打开 成功注册 点击设置,勾选Use localized resources,点击OK,重启Altium Designer,汉化成功 安装完成
五、原理图绘制
因为我们是第一次进行绘制,所以我们先可以在网上找现成的原理图进行模仿。 网盘链接(淘宝商家):https://pan.baidu.com/share/init?surl=ipHs1nPdf6Xq3H_OH5j7DA 提取码:7hqu
1、新建工程
点击File->New->Project->PCD Project,新建工程 右击PCD_Project1.PrjPCB,选择Add New to Project->Schematic,新建原理图。
2、下载元件库
这里有别人的网盘:https://pan.baidu.com/s/1jiJAqjsCjWf41C5edIP7Ww 提取码:1521 添加
3、绘制原理图
在元件库中找到stm32f103c8t6芯片,双击打开,将元件放在中间 点击放置线延长管脚,左键在起始和终点各点击一下连接,右键释放掉 (可使用 ctrl + c 复制,ctrl + v 粘贴,按空格可每90°旋转器件) 点击Net Label放置网络编号,按tab键进入设置窗口,编辑编号名称,回车退出编辑框,再左键放下 这就是连接完的成果
六、绘制STM32+SD卡原理图
1、SD卡模块
SD卡模块说明 内部结构
2、SD卡模块原理图
根据SD卡模块的设计,可以知道各管脚连线如下: 绘制 点击右上角的Libraries,选择下载的元件库并寻找器件 AMS1117:stm32f103c8t6 最小系统.SchLib 元件库中 P:Miscellaneous Connectors.IntLib 元件库中搜索 MHDR C:Miscellaneous Devices LC.IntLib元件库中搜索 0805 100uF
3、实验成果
七、实验总结
通过这次实验我们可以学习Altium Designer 18的一些基本操作,然后还有SD卡的相关知识,在实验过程中还是遇到了一些问题但是,通过老师、同学还有网上的博客得到了解决,总之这次实验收获还是挺大的。
八、参考资料
https://www.bilibili.com/video/BV1Ab411K7yp/?spm_id_from=333.788.videocard.0 https://www.bilibili.com/video/BV17E411x7dR?p=2 https://detail.tmall.com/item.htm?id=43580108042&spm=a1z09.2.0.0.4e1c2e8dwVFPWk&_u=e3meo26c8f82 STM32用cube配置FATFS模式下SPI读写SD卡
|