打印

<原创>USB开发速成-我最真实的经验!

[复制链接]
3032|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
fireware81|  楼主 | 2008-7-20 21:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    关注这个论坛有一段时间了,发现大家对USB热情高涨的同时也感到畏惧,而这种畏惧感主要来自对几百页USB协议的望而却步以及写驱动程序时的无所适从及茫然。比如网友DUODUO的《我学习USB设计的历程》。而我想说的是:大家有没有反思过我们作为产品开发的工程师为什么要逼着自己成为USB的专家?有没有快捷的方法使我们能以最快的速度开发出USB接口?在我看来,在没有尽力寻找快捷方式之前即投入到USB理论的汪洋大海实属不智,也是公司的损失。(当然,将研究作为爱好的人除外)

    今天我就要给大家介绍一种我尝试过的自认为比较简便的开发USB接口的方式,这是我个人的亲身经历。发表在这里不是要显得自己多牛(事实上这里很多网友的水平都比我高)而是想介绍给那些迫于老板压力需要在短时间内开发出USB接口的工程师们。毕竟,好东西应该和大家分享:)

    前段时间接了一个项目,基于机顶盒做一个USB主控接口(平台是ST5105,操作系统为OS2.0.)。这是我第一次接触USB的开发,而且项目时间很紧,要求1个月之内实现U盘读写的基本功能。我先了解了一些USB的基本理论:比如什么是USB主/从,USB2.0和1.1协议的基本概念,USB驱动分为哪几部分等。接下来就开始芯片选型。我当时的要求很明确:就是要软件简单,开发工作量小。另外,原厂的支持应该要比较好,至少可以在电话中帮我解答疑难问题。最开始考虑的是CYPRESS811和 NXP1760. 匆忙搜了一下资料发现参考代码很复杂,调试起来工作量不小。这时候我没有匆忙地立即着手研发,而是继续不懈地在网络上搜索,并多方打听。我坚信“磨刀不误砍柴工”很快我发现了爱普生的72U16。从爱普生USB芯片中文网(WWW.EPSON.COM.CN/USB/)下载下来产品简介和SPEC.,发现这颗芯片以FIRMWARE的形式内嵌了USB底层驱动以及MASS STORAGE等类协议,并且自带MCU来负责这些FIRMWARE的执行。也就是说处理器这边不用再写USB协议和类驱动的程序了。当时觉得心跳都加快了 呵呵 有点怀疑介绍的真实性,毕竟这年头大忽悠太多了。于是打电话给爱普生的800,后来七转八转到了爱普生原厂FAE那里,确认了一些技术细节,OK,和介绍资料吻合。了解到处理器这边只需要一个CF驱动即可(72U16内部有一个CF驱动到USB驱动的转换),于是基本定下来了。当时选择72U16还有一个原因,接电话的FAE比较有耐心,解答也比较专业,而且在北京有OFFICE。这点我一直认为很重要。申请了两片样片,就开工了。这时候时间已经过去了半个多月。下面我把开发过程和调试心得贴出来,共享给大家。


一.硬件设计
首先是原理图的设计。72U16与MCU的接口有IDE和并行总线两种方式,据说如果按照IDE总线连接方式,传输速度会更快一些,但是可惜ST5105没有IDE总线,只好选择并行总线的方式了。
1)    与CPU的连接
地址线说明:
    U16内部寄存器是按16位映射的,所以如果MCU的地址总线是8位寻址的, 地址线连接时要按照CPU A[4]-A[1]对应U16 CA[3]-CA[0]的方式。
信号逻辑说明:
    U16以‘x’作为前缀的信号是负逻辑信号(低电平或下降沿有效)。
http://space.**/upload/2008/7/20/ee36b9bb-e5b2-43da-b488-0f0f709b5b17.JPG
图1 U16与CPU的连接示意图

2)    72U16的USB接口参考电路
http://space.**/upload/2008/7/20/bd2f8777-6897-45b0-9e1e-9db1bf1dcd1c.JPG
图2 U16的USB接口参考电路图
图中虚线部分为参考设计的高速USB传输的信号保护电路,我在PCB上加了这一部分,但是调试过程中没有焊上,感觉也可以,并没发现有影响。但要注意的就是usb的两根数据线D+ 和D-要尽量短直,太长或弯可能会影响信号传输质量。
http://space.**/upload/2008/7/20/d79c4a35-6975-4b8a-bd1e-84ded2185b6c.JPG
3)    72U16的时钟参考电路

图3  U16的时钟参考电路图
时钟这块电路本来很简单不用写的,但是就是它让我浪费了不少时间。调试开始阶段发现寄存器访问不到,以为是芯片问题,后来打电话问了爱普生的技术支持,才发现原来是自己板子上的晶振没有起振。原因是晶振的匹配电容配的不对,调整了匹配电容的值就好了。
二.软件结构
硬件没问题后接下来就是软件调试了。S1R72U16是内嵌USB协议软件的,对采用上述的硬件连接MAIN CPU而言,S1R72U16相当于一个CF卡接口芯片。如果自己有标准的CF卡驱动,可以直接使用。也可以参考爱普生提供的参考代码。我就是用的参考代码,其软件结构如下图所示。其中CF卡驱动将以源码的形式提供,比较简单。文件系统爱普生不开放源码,是以库的形式提供的,好在文件系统与CF卡驱动的接口比较简单,就是扇区读写的两个函数,文件系统给应用提供的API也比较标准,如FSOpen ,FSRead FSWrite之类。另外有一个demo程序,包括软件初始化流程,以及调用参考文件系统API的测试代码。
http://space.**/upload/2008/7/20/45520ecc-940b-440f-9e4c-52d1c2a1475b.JPG
图4 72U16参考代码结构

三、CF驱动的移植要点
1.    基地址的改变
修改72U16对应mainCPU地址空间的基地址U16_BASE_ADDR。
2.    GPIO的设定及中断注册
72U16使用了几个GPIO,在系统初始化的时候需要根据具体要求配置。
        XHRESET对应的GPIO设置为输出口,初始化时设置为高;
        PORT10  对应的GPIO 设置为输入口,并注册成一个低电平触发的系统中断;
        PORT11  对应的GPIO 设置为输入口;
        PORT12  对应的GPIO 设置为输入口;
3. 设备插入拔出检测
       设备在插入拔出时会通过PORT10口会产生一个低电平的脉冲,如果PORT10对应的GPIO已经注册成一个低电平触发的系统中断,则会进入该系统中断的处理函数。在处理函数中读取PORT11对应GPIO口的电平,低电平表示有USB设备插入,高电平表示USB设备拔出。
参考代码初始化流程。系统检测到有设备插入后就可以进**和文件系统的初始化,流程如下图所示。
http://space.**/upload/2008/7/20/10db66fb-f272-4610-a97d-87d42a4c2f5a.JPG
图5 初始化流程图

四、调试要点
1) CPU 读写时序的配置
在进行移植工作之前,需要对照MAIN CPU的时序,以确定是否与72U16的时序匹配。
72U16 CPU接口的时序如下图所示。
http://space.**/upload/2008/7/20/0cae26e2-1905-40ec-9922-08b4a2f2c346.JPG
图6  CPU接口模式下72U16的读写时序


2) 时序不正常时可能出现的现象
        Busy Check超时,或一直在while中死循环
        数据读取写入不正确
3) 对U盘的要求
如果使用参考文件系统,由于参考文件系统目前支持FAT12 FAT16 FAT32格式,所以U盘需要格式化为FAT或FAT32格式。
    
五、测试结果
    驱动调试完成后,进行了一下测试,总共试了十种常用的U盘和移动硬盘,都能识别,速度表现不一样。读写平均速度为U盘3MB/s, 移动硬盘 6MB/s,录制TS流应该是够了,如果提高一下总线的速度,应该能再快一些。另外还连续10小时不间断大数据量反复读写来测试稳定性。

结语:整个过程除去做PCB板的时间,软件调试只花了一个多星期。虽然最终比客户要求的时间拖了一点,不过作为USB菜鸟能以这样的速度完成开发,我还是得到了老板的表扬。其实我想说的是:现在是一个专业化分工很细的社会,对于我们工程师也是如此。我认为原厂应该从使用者的角度出发,多做一些类似72U16这样的芯片。期待着更多“傻瓜”芯片的诞生。

终于完成了!欢迎大家拍砖或提问。给我发小窗即可。

相关帖子

沙发
sz_kd| | 2008-7-20 21:30 | 只看该作者

好,顶

使用特权

评论回复
板凳
goothin| | 2008-7-21 10:18 | 只看该作者

很有感触,很好

使用特权

评论回复
地板
zjh006| | 2008-7-21 14:35 | 只看该作者

我正在学

参考一下,谢谢!

使用特权

评论回复
5
yyrandy001| | 2008-7-22 08:02 | 只看该作者

这么就可以了啊?(EPSON不是做打印机的么?)


以前搞过USB开发,很难搞啊!现在真的这么简单么?

有项目一定试一试!呵呵!感谢楼主啦!

使用特权

评论回复
6
zstulxy| | 2008-7-22 10:00 | 只看该作者

学习中

多谢分享!

使用特权

评论回复
7
aihe| | 2008-7-22 10:37 | 只看该作者

广告贴

使用特权

评论回复
8
usb007| | 2008-7-22 18:06 | 只看该作者

回复主题:<原创>USB开发速成-我最真实的经验!

有实用价值 学习了 谢谢

使用特权

评论回复
9
x512775199| | 2008-7-23 16:39 | 只看该作者

嗯 很厉害

嘿嘿

使用特权

评论回复
10
yyrandy001| | 2008-7-24 08:27 | 只看该作者

回头想想(为何要设计成CF卡接口的呢?)

使用特权

评论回复
11
zhongxon| | 2008-7-25 14:48 | 只看该作者

多少钱,一片?

我用了isp1761,扩了两个host和一个device,接了U盘和鼠标。费了我差不多一个半月的时间,郁闷死了。又移了一个FAT文件系统。

使用特权

评论回复
12
Mr.Cobain| | 2008-7-26 12:21 | 只看该作者

磨刀不误砍柴工--好!

    磨刀不误砍柴工--好!深有体会,在做CASE前 首先应该经过通盘的考虑,分析选择一个好的方法,办起事来就会事半工倍

使用特权

评论回复
13
fireware81|  楼主 | 2008-8-5 21:30 | 只看该作者

回楼上的

为什么设计成CF接口我也不太明白,我猜测可能是CF驱动比较简单的原因。
至于价格,正文里没有提到因为不是本文重点。不过确实比非固化软件的USB通用芯片要贵一些。当时选型的时候,考虑过爱普生的72V17和72U16,也犹豫过。(72V17没有固化驱动)后来考虑到这个项目时间是第一位的,所以舍弃了成本。
除了价格稍高一些,这种类型芯片还有一个问题,就是通用性不好。应用受到内部固化驱动的限制。如果你的应用正好和这种芯片固化的驱动一致,那么是很好的选择。但如果想要应用的灵活性,还是72V17这种通用性USB芯片比较好。鱼和熊掌不能兼得
如果把驱动做成模块式的供客户选择,然后出厂前再烧录到芯片内部就好了:)

使用特权

评论回复
14
fireware81|  楼主 | 2008-8-5 21:33 | 只看该作者

回zhongxon

pfpf
一个半月的时间能把这些基本功能搞出来已经是高手了
不知道速度能到多少?

使用特权

评论回复
15
icecut| | 2008-8-6 20:53 | 只看该作者

广告帖

鉴定完毕

使用特权

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

本版积分规则

1

主题

3

帖子

1

粉丝