深圳市由你创科技有限公司 -- 软件行业的源头工厂

选择语言
  • 实验室自动化
  • FPGA 开发
  • 嵌入式板卡定制
  • 上位机
  • SCADA定制开发
  • 工业软件开发
  • 物联网开发
  • IT信息系统开发
  • 安卓系统开发
  • Windows系统开发
  • 鸿蒙系统开发
  • 创新研发
  • 工业互联网
  • 智慧医疗
  • 智慧城市
  • 智慧农业
  • 系统集成

24小时咨询热线:

18138869082

软件开发_上位机开发_物联网开发_APP开发_深圳软件定制开发公司 软件开发_上位机开发_物联网开发_APP开发_深圳软件定制开发公司
首页 / 新闻 / MCU驱动TF-card具体实现

MCU驱动TF-card具体实现

作者:由你创 发布时间: 2024-12-25 阅读量:52

嵌入式开发中, 经常会有主控板识别TF卡+读取数据+写入数据的 需求, 下面尽量用简介的描述详细说明一下, 相关驱动的实现细节,

实现TF-card的驱动需要配置的东西比较多, 基本流程就是:

①配置芯片的相关引脚  ②引用FatFS文件系统的三方库 ③根据具体需求配置相关引脚的参数 ④在main函数中调用相关功能的初始化函数初始化对应的硬件⑤实际跑通并测试相关功能(识别+读取+写入)⑥实际应用TF-card驱动功能

①配置相关引脚

这一步相对简单, 如图所示配置 数据线SDIO_D0~SDIO_D3,时钟线SDIO_CLK以及SDIO_CMD

这里我们配置了 四位的数据通讯(除非是引脚不够, 或者数据较少, 才会用一位的)

 ②引用FatFS文件系统的三方库 

这个是必要的文件系统配置, 想要和 TF-card交互数据, 卡必须有文件系统, 通常情况下使用FatFS

配置较多, 扇区大小, 编码方式等, 相关配置如图所示

③+④基本参数配置好之看一下初始化代码, SDIO的相关参数配置需要在使用前初始化, 代码比较清晰, 不多加赘述

void HAL_SD_MspInit(SD_HandleTypeDef* sdHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(sdHandle->Instance==SDIO)
  {
  /* USER CODE BEGIN SDIO_MspInit 0 */

  /* USER CODE END SDIO_MspInit 0 */
    /* SDIO clock enable */
    __HAL_RCC_SDIO_CLK_ENABLE();
  
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOD_CLK_ENABLE();
    /**SDIO GPIO Configuration    
    PC8     ------> SDIO_D0
    PC9     ------> SDIO_D1
    PC10     ------> SDIO_D2
    PC11     ------> SDIO_D3
    PC12     ------> SDIO_CK
    PD2     ------> SDIO_CMD 
    */
    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 
                          |GPIO_PIN_12;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_2;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Alternate = GPIO_AF12_SDIO;
    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

  /* USER CODE BEGIN SDIO_MspInit 1 */

  /* USER CODE END SDIO_MspInit 1 */
  }
}

void HAL_SD_MspDeInit(SD_HandleTypeDef* sdHandle)
{

  if(sdHandle->Instance==SDIO)
  {
  /* USER CODE BEGIN SDIO_MspDeInit 0 */

  /* USER CODE END SDIO_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_SDIO_CLK_DISABLE();
  
    /**SDIO GPIO Configuration    
    PC8     ------> SDIO_D0
    PC9     ------> SDIO_D1
    PC10     ------> SDIO_D2
    PC11     ------> SDIO_D3
    PC12     ------> SDIO_CK
    PD2     ------> SDIO_CMD 
    */
    HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 
                          |GPIO_PIN_12);

    HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2);

  /* USER CODE BEGIN SDIO_MspDeInit 1 */

  /* USER CODE END SDIO_MspDeInit 1 */
  }
} 

⑤这里基本就配置完了, 验证一下功能, (验证功能仅适用一位数据的交互方式)基本逻辑就是通过串口打印一下函数执行的结果

void SD_Test(void)
{
  FRESULT res; /* FatFs function common result code */
  uint32_t byteswritten, bytesread; /* File write/read counts */
  uint8_t wtext[] = "This is STM32 working with FatFs.\n"; /* File write buffer */
  uint8_t rtext[100]; /* File read buffer */

  /* Register the file system object to the FatFs module */
  if (f_mount(&SDFatFS, (TCHAR const*)PATH, 0) != FR_OK)
  {
    printf("Failed to mount SD card\r\n");
    return;
  }

  /* Create/open a file, name is specified by Path with FileName */
  res = f_open(&SDFile, "STM32.TXT", FA_CREATE_ALWAYS | FA_WRITE);
  if (res != FR_OK)
  {
    printf("Failed to open/create file (error code: %d)\r\n", res);
    return;
  }

  /* Write data to the file */
  res = f_write(&SDFile, wtext, sizeof(wtext), (void *)&byteswritten);
  if ((byteswritten < sizeof(wtext)) || (res != FR_OK))
  {
    printf("Failed to write file (error code: %d)\r\n", res);
    return;
  }

  /* Close the file */
  res = f_close(&SDFile);
  if (res != FR_OK)
  {
    printf("Failed to close file (error code: %d)\r\n", res);
    return;
  }

  printf("File written successfully: %s\r\n", wtext);

  /* Open the file, name is specified by Path with FileName */
  res = f_open(&SDFile, "STM32.TXT", FA_READ);
  if (res != FR_OK)
  {
    printf("Failed to open file (error code: %d)\r\n", res);
    return;
  }

  /* Read string from the file */
  res = f_read(&SDFile, rtext, sizeof(rtext), (void *)&bytesread);
  if ((bytesread == 0) || (res != FR_OK))
  {
    printf("Failed to read file (error code: %d)\r\n", res);
    return;
  }

  /* Close the file */
  res = f_close(&SDFile);
  if (res != FR_OK)
  {
    printf("Failed to close file (error code: %d)\r\n", res);
    return;
  }

  printf("Read from file: %s\r\n", rtext);
}

最终执行结果是,  407通过串口打印了相关测试函数的执行结果信息,显示识别并写入成功, 将SD接到电脑上, 可以看到一个 名为STM32.TXT的文件, 说明SD卡驱动已经成功跑通.

当然这里仅作为说明驱动使能, 简化了很多细节没有说明.

比如说 正常情况下, SD卡是有第九个引脚需要通过电位高低来识别SD-card存在, 以此来实现SD卡热插拔的功能,或者软件方式通过定时器定时轮询检测也可以实现, 

又比如说,FatFS只是比较常见的文件系统, 如果 设备作为某个体系中的一部分, 需要用和整体一样的系统, 可能就无法通过cubeMX直接引用 FatFS的文件系统 的三方库, 那么相关的文件系统的配置 就需要一系列繁琐的配置.

总访问量:8237174    今日访问量:12739    您是今天第:12739 位访问者