关注这个论坛有一段时间了,发现大家对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这样的芯片。期待着更多“傻瓜”芯片的诞生。
终于完成了!欢迎大家拍砖或提问。给我发小窗即可。
|