赞
踩
以正点原子的潘多拉L475为例,下面介绍rtthread和HAL工程里用IO口模拟SPI控制TF卡。
使用的是rtthread-v4.1.1版本
#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
#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);
if (dfs_mount("sd0", "/", "elm", 0, 0) == 0)
{
rt_kprintf("Filesystem initialized!\n");
}
else
{
rt_kprintf("Failed to initialize filesystem!\n");
}
按上述操作理论上可以直接使用了,但实际使用时发现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
该工程用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盘
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。