用STM32F103 完成对SD卡的数据读取

目录

一、SD卡读写模块

二、SPI协议

三、代码分析

四、接线

五、总结


一、SD卡读写模块

        SD卡读写是指单片机读写SD卡/TF卡。SD卡是一种低电压的flash闪存产品,有标准的MMC/SPI两种操作模块。对于MMC操作模式,读写速度快,控制信号线多,操作复杂,对于SPI操作模块,速度慢,线少,操作相对简单。

关于SD卡读写模块在百度百科有更详细的解释:​​nullicon-default.png?t=LA92https://baike.baidu.com/item/SD%E5%8D%A1%E8%AF%BB%E5%86%99%E6%A8%A1%E5%9D%97/1455469?fr=aladdin链接如上,我在此不再赘述。

二、SPI协议

SD卡也是通过SPI协议进行通信,关于SPI协议的解释如下:

        SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如AT91RM9200。

在百度百科有关于SPI协议更详细的解释:

SPI(SPI协议)_百度百科 (baidu.com)icon-default.png?t=LA92https://baike.baidu.com/item/SPI/53075243?fr=aladdin链接如上,在此我不再过多赘述。

三、代码分析

主函数

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(" mian \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] +0;
        WriteBuffer[1] = WriteBuffer[1] +1;
        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卡写入函数

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

程序首先进行相关初始化,完成后输出mian,之后进行SD卡格式化,成功后进入循环,进入SD卡读写函数,先后进行SD卡的初始化,挂载,创文件,写入,写入超过10次,输出while

四、接线

SD卡 STM32 
      CS         PB0
SCK PA5
MISO PA6
MOSI PA7

五、总结

本次实验内容较多,本篇博客内容较清晰,如有不足请指出

版权声明:本文为CSDN博主「毛哥的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/afadgfansfa/article/details/122142775

目录

一、SD卡读写模块

二、SPI协议

三、代码分析

四、接线

五、总结


一、SD卡读写模块

        SD卡读写是指单片机读写SD卡/TF卡。SD卡是一种低电压的flash闪存产品,有标准的MMC/SPI两种操作模块。对于MMC操作模式,读写速度快,控制信号线多,操作复杂,对于SPI操作模块,速度慢,线少,操作相对简单。

关于SD卡读写模块在百度百科有更详细的解释:​​nullicon-default.png?t=LA92https://baike.baidu.com/item/SD%E5%8D%A1%E8%AF%BB%E5%86%99%E6%A8%A1%E5%9D%97/1455469?fr=aladdin链接如上,我在此不再赘述。

二、SPI协议

SD卡也是通过SPI协议进行通信,关于SPI协议的解释如下:

        SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如AT91RM9200。

在百度百科有关于SPI协议更详细的解释:

SPI(SPI协议)_百度百科 (baidu.com)icon-default.png?t=LA92https://baike.baidu.com/item/SPI/53075243?fr=aladdin链接如上,在此我不再过多赘述。

三、代码分析

主函数

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(" mian \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] +0;
        WriteBuffer[1] = WriteBuffer[1] +1;
        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卡写入函数

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

程序首先进行相关初始化,完成后输出mian,之后进行SD卡格式化,成功后进入循环,进入SD卡读写函数,先后进行SD卡的初始化,挂载,创文件,写入,写入超过10次,输出while

四、接线

SD卡 STM32 
      CS         PB0
SCK PA5
MISO PA6
MOSI PA7

五、总结

本次实验内容较多,本篇博客内容较清晰,如有不足请指出

版权声明:本文为CSDN博主「毛哥的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/afadgfansfa/article/details/122142775

生成海报
点赞 0

毛哥的博客

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

关于MIPI的D-PHY硬件总结

前言 MIPI(Mobile Industry Processor Interface)是由ARM, ST ,TI等公司成立的一个联盟,目的是确定并推动移动应用处理器接口的开放性标准,为移动应用处理器的标准硬件和软件

按键消抖+点亮led灯

前言 本课程是按键消抖的一个扩展内容,主要是通过实验观察按键消抖和不消抖的一个区别。 一、按键消抖 按键抖动:按键抖动通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时,由于机械触点

阿尔法系统时钟和外设时钟

一、系统时钟 1.时钟树 I.MX6U 的系统主频为 528MHz,但是默认情况下内部 boot rom 会将 I.MX6U 的主频设置为396MHz I.MX6U-ALPHA 开发板的系统时钟来源于两部分: 3