STM32F103C8T6+SD/Micro TF卡+SFATS+软SPI+硬SPI

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/pang9998/article/details/85940453

使用环境(蓝色粗体字为特别注意内容)
1、软件环境:Keil MDK 5.15
2、硬件环境:STM32F103C8T6最小系统,Micro TF卡

在一个项目中需要用到SD卡,于是在某宝买了一块Micro TF卡插槽,SPI驱动:

貌似不用那个小芯片好像可以用IO口直接驱动TF卡,不知道那个小芯片干嘛用的,也没工夫去追究了,废话少说,先来看接线:

TF卡模块   STM32单片机
GND     ->    GND
CS      ->    PB12/SPI2_NSS
SCK     ->    PB13/SPI2_SCK
MISO    ->    PB14/SPI2_MISO
MOSI    ->    PB15/SPI2_MOSI


关于CS/NSS管脚,即我们熟知的片选信号,作为主设备NSS管脚为高电平,从设备NSS管脚为低电平。

一开始为了性能考虑,打算使用硬件SPI2,后来发现速度太快了,SD/TF卡的速度跟不上,调了半天调不出来,必须降低APB总线速率:

//配置APB1(PCLK1)钟=AHB 1/2时钟

 RCC_PCLK2Config(RCC_HCLK_Div4); //72/4=18MHz ,会降低总线频率,导致串口不正常!慎用!

但是总线速率一下降,延时函数,串口通信函数都会受影响,于是考虑使用两种方式实现即硬件SPI+软件模拟SPI。

最终使用软件模拟SPI并且移植SFATS,读取2G的SD卡成功,

 

main函数如下 

/*******************************************************************************
  * @file    SDFatFS/source/main.c
  * @author  Pang
  * @version V1.0.2
  * @date    1/1/2019
  * @brief
  ******************************************************************************/

#include "common.h"
#include "led.h"
#include "delay.h"
#include "usart_printf.h"


char path[10] = "0:";// SD卡根目录
FATFS fs;

char wbuff[] = "This is FATFS function test\r\n * f_open\r\n * f_write\r\n * f_close\r\n";
char wbuff2[512 * 26];

// *******************************************************************************
// Function Name  : main
// Description    :
// Input          : None
// Output         : None
// Return         : None
// *******************************************************************************
int main(void)
{
	u16 i, j;
	LED_Init();
	Hardware_Configuration();

	ffext_mount(0, &fs);

	ffext_scanfiles (path);

	for(i = 0; i < 26; i++)
	{
		for(j = 0; j < 512; j++)
		{
			wbuff2[i * 512 + j] = 'A' + i;
		}
	}

	ffext_read("0:/test/test.ini", wbuff2, (512 * 26), FA_OPEN_ALWAYS | FA_READ);
	ffext_write("0:/test/out.ini", wbuff2, (512 * 26), FA_OPEN_ALWAYS | FA_WRITE);
	printu(">%s", wbuff2);
	// ffext_write("0:CardInfo.txt", wbuff, sizeof(wbuff)-1, FA_OPEN_ALWAYS | FA_WRITE);
	// ffext_write("0:ffext2.ini", wbuff2, (512*26), FA_OPEN_ALWAYS | FA_WRITE);

	for(i = 0; i < 26; i++)
	{
		for(j = 0; j < 512; j++)
		{
			wbuff2[i * 512 + j] = 0;
		}
	}
	ffext_read("0:ffext2.ini", wbuff2, (512 * 26), FA_OPEN_ALWAYS | FA_READ);
	ffext_write("0:ffext1.txt", wbuff2, (512 * 26), FA_OPEN_ALWAYS | FA_WRITE);

	while (1)
	{

	}
}

 

展开阅读全文

没有更多推荐了,返回首页