新闻  |   论坛  |   博客  |   在线研讨会
USB开发速成-我最真实的经验!
tvro_china | 2009-05-18 17:08:36    阅读:2557   发布文章
 今天给大家介绍一种我尝试过的自认为比较简便的开发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’作为前缀的信号是负逻辑信号(低电平或下降沿有效)。

图1 U16与CPU的连接示意图

2)    72U16的USB接口参考电路

图2 U16的USB接口参考电路图
图中虚线部分为参考设计的高速USB传输的信号保护电路,我在PCB上加了这一部分,但是调试过程中没有焊上,感觉也可以,并没发现有影响。但要注意的就是usb的两根数据线D+ 和D-要尽量短直,太长或弯可能会影响信号传输质量。


3)    72U16的时钟参考电路

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

图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设备拔出。
参考代码初始化流程。系统检测到有设备插入后就可以进行CF卡和文件系统的初始化,流程如下图所示。

图5 初始化流程图

四、调试要点
1) CPU 读写时序的配置
在进行移植工作之前,需要对照MAIN CPU的时序,以确定是否与72U16的时序匹配。
72U16 CPU接口的时序如下图所示。

图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这样的芯片。期待着更多“傻瓜”芯片的诞生。
参与讨论
登录后参与讨论
与快乐握手
最近文章
怎样做一块好的PCB板
2009-05-18 17:14:25
ARM入门
2009-05-18 17:10:18
推荐文章
最近访客