当前位置:   article > 正文

STM32用模拟SPI读写TF卡_spi接口tf卡

spi接口tf卡

正点原子的潘多拉L475为例,下面介绍rtthread和HAL工程里用IO口模拟SPI控制TF卡。

原理图

在这里插入图片描述

rtthread工程

使用的是rtthread-v4.1.1版本

  • 打开elm-fatfs文件系统
    在这里插入图片描述
  • 打开模拟SPI和SD/TF卡驱动
    在这里插入图片描述
  • 在 rtconfig.h 中定义sspi的宏
#define BSP_USING_SOFT_SPI1
#define BSP_S_SPI1_SCK_PIN	5
#define BSP_S_SPI1_MOSI_PIN	7
#define BSP_S_SPI1_MISO_PIN	6
  • 1
  • 2
  • 3
  • 4
  • 初始化spi结点
#define cs_pin "PC.3"
static int rt_hw_spi1_tfcard(void)
{
    __HAL_RCC_GPIOC_CLK_ENABLE();
    rt_hw_soft_spi_device_attach("sspi1", "sspi10", cs_pin);
    return msd_init("sd0", "sspi10");
}
INIT_COMPONENT_EXPORT(rt_hw_spi1_tfcard);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 使用上面的代码可以在控制台上用 list_device 指令看到设备
    在这里插入图片描述
  • 挂载文件系统
if (dfs_mount("sd0", "/", "elm", 0, 0) == 0)
{
    rt_kprintf("Filesystem initialized!\n");
}
else
{
    rt_kprintf("Failed to initialize filesystem!\n");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 按上述操作理论上可以直接使用了,但实际使用时发现sspi的代码有问题,运行会报错

  • 第一个问题就是:assertion failed at function:spi_xfer_4line_data8, line
    number:60
    在这里插入图片描述

  • 原因在于 spi_xfer_4line_data8 这个函数里会判断消息长度
    在这里插入图片描述

  • 通过调试发现 spi_core.c 里的片选操作会将message清零,所以导致程序出错。
    在这里插入图片描述

  • 所以需要将判断数据长度的断言屏蔽掉
    在这里插入图片描述

  • 第二个问题:To initialize device:sd0 failed. The error code is 2

  • 原因是sspi的MOSI和MISO的引脚宏定义搞反了,所以遇到该问题再检查一下引脚定义
    在这里插入图片描述

  • 解决上面两个问题后TF卡就初始化正常了

  • 对文件系统进行测试,结果没问题
    在这里插入图片描述

  • 这里附上工程代码:stm32+rtthread+模拟SPI+TF+FAT

HAL工程

  • 该工程用IO口模拟SPI,然后用USB-FS将sd卡模拟U盘

  • 用cubemx勾选相关功能生成代码,因为用的是sspi所以SD_Initialize()要放在MX_GPIO_Init()后MX_USB_DEVICE_Init()前

  • 将sd卡读写加到在usbd_storage_if.c的U盘读写里

  • 这里要注意的是模拟spi控制TF卡模拟的U盘在电脑上的读写速度比较慢,U盘拷贝速度大概在300KB/秒的样子(至少电脑是这么显示的)

  • 因为读写慢所以并不适合大的存储,不然格式化十分缓慢(我用的是1GB的感觉还好,但容量扩大到8GB后格式化时进度条很久没动)

  • 这里附上工程代码:stm32+HAL+模拟SPI+TF+MSC模拟U盘

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/525461?site
推荐阅读
相关标签
  

闽ICP备14008679号