打印

关于USB转SD卡的一个离奇的故事

[复制链接]
7839|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
angryBird|  楼主 | 2013-8-22 22:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 angryBird 于 2013-8-22 22:35 编辑

题目没错,是 USB转SD卡,而不是常见到反过来。之所以说离奇,不过是因为平时没见过这种用法,故而应属少有。在网上也查了一段时间资料,几乎没有找到相关的做法。
对于STM32,两年多前,用f207做过一个CDC之类的小项目。具体是USB口链接一个移动设备,按照modem协议,通过at指令,控制和收发数据,然后用串口转给另一边的一台设备。时间有点久了,之后再没有接触过STM32。所以,这次这个USB转SD卡,一时还没有多少思路。看了一些有关SD卡SPI协议的资料,还没有深入。
活总是要干的,现在开始正式整理思路,以及要解决的问题。以前在这个论坛,也得到过大家的帮助,这次也期望各位同道中人能多多帮忙。尤其是原子老大,还有香水老师,先谢了哈。

这个项目大体是这样,用f107,做一个USB转SD的小板。一端做成SD卡触脚形式,插到另一台设备的SD卡插槽,f107的u口接U盘。原来设备读写SD卡的功能一点不动,完全通过stm32翻译、转换,实现USB转SD卡。也就是将平时用的读卡器给反过来用。

目前思路如下:
1. 安装EWARM,下载了6.1版本。上次的是什么版本早忘了,软件已经卸载,有点郁闷。
2. 学习SPI通信,因为是通过stm32的spi接口,和其它设备的SD插槽连接,实现SD卡的spi协议。
3. 学习sd卡的spi协议,整理常用的命令。读上位机读写SD卡的代码,看看都是怎么操作SD卡的 。
4. 学习FAT文件系统相关知识。 这个是我最郁闷的地方。因为我觉得上位机发来一条命令比如读一个文件,应该是按照文件系统的方式进行的吧,按照扇区读?将读sd扇区的命令转换到读U盘的扇区? 对此我表示现在还很晕,期待大家的指点:)
5. 硬件有了后,写程序框架,调试spi通信。捕捉spi接收到的读写指令。分析。
6. 读写USB。
7. 。。。

现在觉得好难啊:(
列位,支持一下哈。



沙发
angryBird|  楼主 | 2013-8-26 20:45 | 只看该作者
本帖最后由 angryBird 于 2013-8-26 21:07 编辑

又过了几天,长征路上在继续。

1.安装了IAR6.1,不能编译以前的程序。没细看是为什么,准备重新装一下6.4.
2.整理思路,在网上四处乱撞,想到什么就搜索什么,以拓宽思路。补了一下FAT表相关知识,也看了一些读卡器的设计原理。

对于后续工作,目前阶段思路如下:
1.原来设备实现了一个FAT文件系统,那从SPI发来的数据,应该是遵循SD卡SPI协议的命令,比如CMD开头的一系列命令。
2.如果果如上述,我需要做得,是解析这些命令,并做出相应的操作到USB。比如,如果发来的是CMD读取一个扇区命令,我则去读取USB一个相应的扇区,并将数据发送到SPI的发送端口。
3.那么,我需要做的,就是能将USB的0扇区、FAT1、FAT2扇区、根目录扇区能在上位机请求的情况下,原原本本发送给上位机,上位机据此整理出FAT文件系统。

上述思路不知正确与否,需要继续分析与验证。学习,真正是无止境!

我请求香水版主,以及各位同道,对我上述思路给些指点。
郑重道谢。

使用特权

评论回复
板凳
angryBird|  楼主 | 2013-8-26 21:06 | 只看该作者
我把另一个论坛的正点原子混到这里来了,sorry

使用特权

评论回复
地板
qinyp| | 2013-8-27 12:51 | 只看该作者
难点在于SD卡端的协议实现

使用特权

评论回复
5
angryBird|  楼主 | 2013-8-28 22:07 | 只看该作者
qinyp 发表于 2013-8-27 12:51
难点在于SD卡端的协议实现

这两天忙别的,没顾上这个,也没上论坛。

我的思路是,将开发部的SPI接到上位机的SD卡槽,或者电脑、甚至读卡器的SD卡槽里面,读取上位机发来的数据,进行分析,理清这条通路和具体的协议,调通如何按照SD卡协议回复上位机。

关于SD卡协议的实现,我现在还是理解为按照上位机发来的CMD,读取(或者写)相应的USB扇区。不知对否?

继续期待香主的高见。

使用特权

评论回复
6
reille| | 2013-8-29 09:02 | 只看该作者
本帖最后由 reille 于 2013-8-29 09:05 编辑

有个疑问,你这个USB转SD卡,从你对项目的描述来看:“一端做成SD卡触脚形式,插到另一台设备的SD卡插槽,f107的u口接U盘。原来设备读写SD卡的功能一点不动”,USB转成的SD端应该是相当于SD卡吧??
如果SD端相当于SD卡,相当于要实现SD卡的协议,把SD协议转成USB协议,不知可否这要理解?

使用特权

评论回复
7
lzp3520265| | 2013-8-29 15:01 | 只看该作者
就是一个类似于读卡器的功能吧

使用特权

评论回复
8
平常人| | 2013-8-29 16:31 | 只看该作者
LZ按照2、5楼的思路做就是了。

使用特权

评论回复
9
qq65411253| | 2013-8-29 16:31 | 只看该作者
估计楼主是想通过usb接口把u盘模拟成sd卡,那就应该是sd转usb。sd是主设备,usb是从设备。但是sd卡跟u盘差异较大,如果只是单纯保存文件估计没问题。如果是一些特有的指令,估计楼主要抓狂了。比如读取sd卡的序列号,u盘明显是没有序列号的,这个怎么实现?sd卡的扇区跟u盘的也不太一样,怎么转换?读取sd卡的电压范围时,你的程序怎么回复主机?随便捏造一个?

使用特权

评论回复
10
angryBird|  楼主 | 2013-8-29 23:57 | 只看该作者
看来我一楼的描述不太清楚,不是sd转usb,而是usb转sd。sd转usb满街都是卖的,就是读卡器呀。我做的是反过来的,你可以叫它“读USB器”,呵呵,有点拗口。
STM32读写u盘,是主模式。同时,把自己模拟成SD卡,对于上位机而言,是从设备。

这两天在详细看SD卡的spi协议和例程。准备整理一下,做个文档备份。
至于序列号,肯定是虚拟一个了。
sd卡的扇区和u盘的扇区有什么区别吗?这个我这两天倒是没注意。看了u盘的fat分区,和sd卡的fat分区的介绍,似乎差不多啊?请qq64511253指点一下。

谢谢楼上各位朋友的支持和建议。现在硬件还没有做出来,我打算用读卡器先做一个东西,拆开连几根线到开发板的spi上,先调试一下spi通信,这个没做过,调通了,看看数据是怎么跑的。

开发板是f207的,找半天没找到spi例程,到st网站上,折腾了一个小时,竟然找不到下载例程的方法(根本找不到在哪里),晕啊。哪位朋友有,或者给个链接,或者教教我怎么在官网上找到spi的例程。谢谢!

使用特权

评论回复
11
angryBird|  楼主 | 2013-8-29 23:57 | 只看该作者
reille 发表于 2013-8-29 09:02
有个疑问,你这个USB转SD卡,从你对项目的描述来看:“一端做成SD卡触脚形式,插到另一台设备的SD卡插槽,f ...

是这样的。

使用特权

评论回复
12
angryBird|  楼主 | 2013-8-29 23:58 | 只看该作者
平常人 发表于 2013-8-29 16:31
LZ按照2、5楼的思路做就是了。

看来你认为我目前的思路对头,是这样吧?倍感鼓舞!

使用特权

评论回复
13
reille| | 2013-8-30 09:04 | 只看该作者
本帖最后由 reille 于 2013-8-30 09:07 编辑

我觉得可以不用去理会什么扇区不同之类的,因为都是fat吗,FAT给你屏蔽了这些底层硬件的差异!
关键是卡识别的过程中,怎么mount成功!

使用特权

评论回复
14
angryBird|  楼主 | 2013-9-2 22:45 | 只看该作者
又过去了三天,孩子开学,忙忙活活的,日子过得真快。
继续看SD卡spi协议相关资料和一些读写SD卡的例程,熟悉通信的过程。
终于找到了两年前做项目用到的EWARM安装程序,原来是6.2版本。再次安装起来编译调试环境。
将原来的项目打开,编译,一堆错误。经过仔细回想,以及网上查找,至此总算能把原来的工程编译过去了,下载到开发板上,正常运行。也算今晚的一点小成绩。

在EWARM上修改了一下内容,做个备忘。
1. 在options里面,target要选择相应的CPU型号,这里是 f207。
2. 在options里面,C/C++ Compiler->preprocessor选项里面,要将用到的头文件的路径全部包括进去。这个我倒有点纳闷,头文件有多个路径,在preprocessor里面,要一个一个全部罗列出来。
3. options->General Options->Library Configuration里面,Library选择 full,否则,文件里面有一个重定向打印信息的函数报错,报FILE not defined 错误。
4. options->General Options->Library Configuration里面,勾选上Use CMSIS,不用自己的core_cm3.h 。具体什么原因忘了。
5. options->linker->config里面,选择自己工程下面的那个.icf文件,否则,运行时会报错,说从0地址写如程序。

以上是今晚的工作。明天准备将程序的框架搭起来。

使用特权

评论回复
15
angryBird|  楼主 | 2013-9-3 23:49 | 只看该作者
多谢原子兄支持。

今天用读卡器做一个调试用的工具,结果读卡器是坏的。倒是拆开看清楚了,后面再找一个好的,按照9个脚,接出来相应的四根线。和开发板上哪几个管脚接,还没有看。

建立了项目workspace,但是还没有开始写代码。先找到了例程里面的spi flash的代码,想着应该先看看例程跑起来是什么样子。于是,在IAR上新建一个例子工程。几经周折,总算编译过去了,下载到了开发板上,也能执行。但是除了在LCD上显示了我打印的字,没看出来什么其它的信息。没看这部分的代码,所以也不知道具体是什么了。

建立新工程的过程,有几点要记录一下:
1. 固件库里面的c文件,基本上都复制过来用了;eval开发办相关的c文件,也拿来了不少
2. 关于.icf文件,忘了是怎么生成的了。所以,download and debug 程序,根本跑不起来。对比了一下原来工程在Linker里面,config选项卡中,是edit过的,在edit中,设置了f207的vector table, memory regions等。照着找个在新工程上也做一遍,结果.icf自动生成。
3. 经过上述,再下载执行,还是不对。结果发现,还要在 debugger->download 里面,选上use flash loader。
至此,程序在开发板上跑起来了。
4. 另外,头文件不用加到工程里面来,在C/C++ Compiler->preprocessor选项里面,要将用到的头文件的路径全部包括进去就行了。当然,加到工程里面,打开查看方便。

期间,有一个疑问, 固件库里面很多文件,哪些是需要加到自己工程里面来的,是根据什么筛选的呢?

使用特权

评论回复
16
angryBird|  楼主 | 2013-9-7 22:46 | 只看该作者
这两天在编写代码,一边写,一边参考例程。
有一个two board 通信的例子,slave模式spi接收使用的是中断模式,master发送也是中断模式。在网上看的其它一些例子,接收似乎不是使用中断。总之,目前处于代码编写的前期阶段。
搞了一个改造的读卡器,飞线出来,用示波器看波形。卡能正常读写,但是一直看不到SD卡第5个引脚(SD CLK)上有标准的方波,只有在写SD卡的时候,有一段一段的类似正弦波的波形出现。在网上查了查,PC上,或者读卡器使用的似乎都是SD协议,如果是这样的话,做出来这个工具用处不大了。调试是个问题。
为啥不能一直看到时钟信号呢?难道是只有在读写的时候,主机才发送时钟信号?求解答。

改造SD卡,把里面的的9跟线印出来,直接插到上位机的SD卡槽里面,目前只有这个办法了,因为上位机肯定使用的是SPI协议。

艰苦摸索中。。。

使用特权

评论回复
17
sunnyhey| | 2013-9-25 14:03 | 只看该作者
支持楼主,我这两天也在看USB和SD卡相关的知识

使用特权

评论回复
18
戈卫东| | 2013-9-25 14:27 | 只看该作者
难道不是做读卡器?

使用特权

评论回复
19
chuangpu| | 2013-9-25 19:44 | 只看该作者
应该是读卡器的问题   楼主   花时间好好看看了   楼主

使用特权

评论回复
20
jxmzzr| | 2013-9-26 17:13 | 只看该作者
呵呵,利用STM32的USB来做了一个USB读卡器,学习了,感谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

78

帖子

1

粉丝