cubemx配置 USB读卡器+FATFS

时间:2024-04-10 21:05:51

要实现USB读卡器,就是F429从SD卡读数据,作为从设备用USB传输给主机。

什么是OTG?OTGOn-The-Go的缩写,是近年发展起来的技术。20011218日由USB Implementers Forum公布,主要应用于各种不同的设备或移动设备间的联接,进行数据交换。

产生背景

USB技术的发展,使得PC和周边设备能够通过简单的方式、适度的制造成本,将各种数据传输速度的设备连接在一起。上述我们提到的应用,都是通过USB连接到PC,并在PC的控制下进行数据交换。

但这种方便的交换方式,一旦离开了PC,各设备间无法利用USB口进行操作,因为没有一个设备能够像PC一样充当主机。

作用

OTG技术就是在没有Host的情况下,实现设备间的数据传送。

 

USB模式为三种:1.OTG/dual_role_device 具备一根OTG_ID线用来判断为主设备或时从设备的,作为OTG设备的时候使用。也就是可以根据外接的来判断对面是主还是从,自己进行主从转换。

cubemx配置 USB读卡器+FATFS

2.host_only,仅作为主设备。OTG_ID就用不到了。

3.device_only,本次实验是要我们的设备做一个大容量存储设备,就是处于这个模式。

 

 

由于USB要用48MHZ,而主频HCLK之前是180M,无法正数分频至48M。原子采用倍频HCLK到192MHZ,再分频USB时钟频率至48MHZ。

但是F429的HCLK不是最大只能到180MHZ吗?我用cubemx也无法设置到192MHZ啊。原子说,超频的不多不影响使用,那我觉得还是不要这么做比较好,不正规。

输入USB时钟频率为48MHZ让cubemx自己去算,算出来HCLK是120MHZ,太低了。

上网查找,HCLK为168MHZ时可以。我设置下去,果然可行。那么就要注意了,如果用到了USB,之前其他功能的时钟肯定就改变了。

所以,以后如果要用到USB,直接将HCLK设置为168MHZ。

 

VBUS管脚不用选,原子原理图上的USB接口上的VBUS也没有接单片机,直接通往5V就好了。

 

FATFS支持USB DISK也就是U盘,但是必须是在HOST模式,支持MSC的情况下。

 

与原子不同,他用的USB驱动是2013年版的,cubemx生成的是2020年版的。所以有一定差异。主要表现在USB调用SD卡的函数不同,他是在mass_mal.c(F103)usbd_storage_msd.c(F429)中,我的是在usbd_storage_if.c(F103)中,但是作用是一样的,主机操作USB_slave读写,但是USB驱动不知道该去读写哪的扇区,这种文件就是供用户修改,可以连接至SD卡的读写函数。

 

程序编写完毕后,编译下载,计算机第一次识别不出来,磁盘驱动器能识别出来是STM 的USB设备,但是在计算机中找不到磁盘,原来是SD卡没插入。那肯定不行啊。。。

接着插入SD卡,重启开发板,真的识别出来了。

cubemx配置 USB读卡器+FATFS

 

这个“U盘”的名字是我在格式化tf卡的时候,起的名字。他存储在tf卡的启动扇区,扇区0的FAT32格式下。

cubemx配置 USB读卡器+FATFS

打开U盘,只有一个文件,这个文件就是上个FATFS实验生成的。

cubemx配置 USB读卡器+FATFS

打开这个文件

cubemx配置 USB读卡器+FATFS

尝试修改一下,看用开发板的FATFS读出的一致么。我看到网上有人提问如果开发板没有做FATFS,这种USB读卡器还能用么。到此,我们知道,USB驱动调用的都是直接调用SD卡的读写函数,跟FATFS一样,都是中间层。同为中间层不存在调用关系。

cubemx配置 USB读卡器+FATFS

修改完后,操作开发板挂载SD卡,然后读这个文件。一致!

cubemx配置 USB读卡器+FATFS

 

用开发板创建一个文件,创建成功,关闭失败,读取失败

cubemx配置 USB读卡器+FATFS

cubemx配置 USB读卡器+FATFS

 

怀疑是文件名称问题,改回原有名称,尝试创建。

cubemx配置 USB读卡器+FATFS

还是关闭文件失败。那是不是有可能是FATFS的创建文件功能收到了影响呢?

用上一个实验的工程实验,没有问题,一切正常。

因为我看到我尝试把USB中断优先级比TIM1低

cubemx配置 USB读卡器+FATFS

我以前调试过USB,USB的优先级应该最高。把USB中断优先级设为1,TIM设为2

结果还是不行。但是USB优先级调高肯定没问题。

 

我现在怀疑是否栈的空间不够了,调至0x2000看看效果。

还是不行啊。在写完文件后关闭返回的是1.

cubemx配置 USB读卡器+FATFS

而且读出的数据也不对

cubemx配置 USB读卡器+FATFS

 

实在不知道了,上网求助!顺带吐槽一下原子哥,不是帮顶就是说好好检查下代码。大哥,我给你跪了。

还是STM社区给力,大神真多。

cubemx配置 USB读卡器+FATFS

还真有可能是FATFS和USB同时操作SD卡造成的影响。我去看原子例程的USB读卡器实验,发现都没有FATFS。也就是没有同时实现USB、FATFS同时操控SD卡。

那么我的代码中USB是用的封装过的函数,即SD卡实验中的函数。

cubemx配置 USB读卡器+FATFS

在读写中关闭了中断。也就是说其他中断打扰不了USB.

而FATFS调用的是自动生成的

 

 

 

 

 

bsp_driver_sd.c是自动生成的SD卡操作底层文件。cubemx配置 USB读卡器+FATFS

然后被自动生成的sd_diskio.c中间层调用。

FATFS调用->SD_read调用->BSP_SD_ReadBlocks..

cubemx配置 USB读卡器+FATFS

我们看到整个过程,没有关闭中断保护。那么就有可能FATFS对SD卡的操作被其他中断打断。那么增加关闭中断,试试效果

cubemx配置 USB读卡器+FATFS

不接USB线实验下FATFS。

cubemx配置 USB读卡器+FATFS

成了。。。

接上USB线,等待计算机识别出来SD卡,再实验FATFS

计算机识别出“U盘”,并且文件内容正确

cubemx配置 USB读卡器+FATFS

cubemx配置 USB读卡器+FATFS

而且FATFS也可以成功操作。

cubemx配置 USB读卡器+FATFS

那么我们试试创建新文件“TanCheng.txt”和内容,成功

cubemx配置 USB读卡器+FATFS

但是呢,在计算机中刷新了很多遍,还是看不见“TanCheng.txt”

重新插拔usb线,相当于重新枚举下设备,文件才出来。

cubemx配置 USB读卡器+FATFS

cubemx配置 USB读卡器+FATFS

那么我尝试从计算机修改“TanCheng.txt”内容,看FATFS能否成功。成功!

cubemx配置 USB读卡器+FATFS

得了,测试完毕,完成了USB读卡器的功能。也就是相当于U盘了。