STM32F429 USB能识别,SD卡识别不了----被F429坑惨了

最近在搞一个PC端通过USB识别STM32F429的SD的功能,并能进行读写的案例,真是被坑惨了....

1、一开始用的野火挑战者F429和正点原子F407官方的例程,野火挑战者F429的例程(USB-SD-FLASH模拟U盘)对SPI FLASH的识别都没问题,但是移植了SD的读写后就出现了问题,就只能识别Flash,不能识别SD,我还一直以为是SD卡驱动的问题,但是单独的SD卡读写又是正常的,没有问题;试了了野火的驱动和正点原子的驱动,结果都是一样的,很纳闷了。也用正点原子的F407的开发板试了例程(实验51 USB读卡器(Slave)实验),能正常的识别SPI FLASH ,也能正常的识别SD卡(4G卡),这样换来换去的调试了很久,还对比了彼此的硬件,搞得差不多每个元件都搞成一样了。悲催了。但结论是应该不是SD卡驱动的问题。

2、继续用F429的板子调试,找问题。一开始用野火的F429的板子调试,就一直返回SD响应超时,但是SD卡驱动都是用的官方的,差点就放弃了。后来就慢慢调咯,也对它不报希望了,就用我们自己的板子调,一开始在结构体USBD_MICRO_SDIO_fops内,前几个都能循环的跑过,就是到了STORAGE_Read,就跑不到这步,然后仿真,是一直在USB的库函数SCSI_Read10()内返回错误-1,我都没改过USB的任何参数啊,苍天啊!调到这里就可以锁定在USB的问题了,驱动肯定没问题,那就是USB的其它问题了。

3、继续调试,找相关的文档,对比F429 与F427的区别。带着这两个问题去查看了参考手册与代码,果然,STM32F429的USB的时钟还真有点特殊(不知道其它芯片是不是也是这样),其来自于PLL输出,而不是我们熟知的APB1、APB2:

STM32F429 USB能识别,SD卡识别不了----被F429坑惨了

从时钟树中我们可以看出:(1)的输出是系统时钟,(2)的输出是USB时钟。相关公式:

当然(2)的输出不仅仅是给USB提供时钟,还给RNG与SDIO提供时钟:

STM32F407的时钟

STM32F429 USB能识别,SD卡识别不了----被F429坑惨了

STM32F429的时钟

STM32F429 USB能识别,SD卡识别不了----被F429坑惨了

F429系统时钟为180MHz,USB OTG FS时钟变为51MHz,超过了正常的48MHz(F407的USB Clock是48M),导致USB不能正常工作。

问题终于找到了,黄天不负啊!

怎么解决呢? 那就对F429降频呗,将PLL_N = 360改为336,即主频168M,与F407的一致;程序里的delay_init(180); 可以不用改,重新编译后烧录,识别SD卡OK了,太兴奋了.....,先前是只能看到识别USB,能看到U盘,但是没用下面的数字,也点击步进去。现在好了 ,呵呵呵.....

STM32F429 USB能识别,SD卡识别不了----被F429坑惨了

4、还有个问题,就是FS与HS的区别,将目前的USE_USB_OTG_FS,换成USE_USB_OTG_HS,USE_EMBEDDED_PHY,GPIO口还是PA11,PA12;但是就识别不了,USB和SD卡都识别不到了。后续再继续调试看看