如何在一个月内完成一个USB设备
来源:互联网 发布:金十数据网 编辑:程序博客网 时间:2024/04/29 23:59
如果想学习USB的开发,做一个简单的HID设备是一个很好的选择,你不用去编写驱动程序,因为操作系统都自带了。唯一要做的就是做固件(firmware)。
一个多月前,我开始了USB开发的学习,之前对硬件这东西是知之甚少了。这一个多月里,做PS/2键盘用了一个星期,复习六级用了一个星期,所以专心用于USB开发的时间也只有一个月。
大家都讲一个USB设备的开发周期是一年,一定不是指一个HID键盘。不过USB设备开发的艰难是真的,在开过的过程中,几次遇到问题,几天,甚至十几天都解决不了,那是何等的郁闷。不过,正是这些问题的出现,促使我去看HID标准、FX2的使用说明......促进了对USB标准、USB开发的了解。虽然现在只是开发出一个简单的HID,但我可以说,我对USB协议、HID协议、FX2的使用是比较了解的了,下一步的开发会顺畅很多。
我在这里只想跟大家分享一下我开发经验,让大家的开发再顺利些,起码能开发出一个简单的设备。以后我会补上LINUX下USB驱动开发的相关文章。我博客里还有更多东西(http://blog.csdn.net/manio)。
先列举一下我有的资源:
CY7C68013A开发板一块
CYPRESS control pannel
程序文件夹中有:
FX2的TRM(ENGLISH,使用说明)
FX2的EXAMPLE(这些很有用,帮助你建立概念)
HID标准(ENGLISH)
《USB技术及应用设计》(清华大学出版社 肖踞雄等著)
《USB接口设计》(西安电子科技大学出版社 张弘著)
GOOGLE
在第一个阶段,我只看《USB技术及应用设计》,了解USB协议的细节。我个人觉得这本书是很好的,讲得很详细,帮助你建立起一个对于USB的概念,比如说USB的几种传输、什么是包、什么是帧、什么是描述符、USB工作的流程、USB与主机的传输方式,等等。这些东西,在使用FX2开发时可能不能直接用上,但在你遇到问题时,进行测试时,你可以用一些很基本的原理来判断问题出在哪里。因为是带着问题(HID键盘怎么实现)来看书的,所以这一阶段,我已经了解了关于HID键盘的一些基本的东西,比如说键盘使用的是中断传输。
第二个阶段,开始使用开发板,进行实践。不过,在这里我遇到了最大的一个困难,就是不知为何,把CYPRESS的EXAMPLE下载到板子上,只有一个程序能够正确地运行。为了找出问题,我到处发帖,无奈的是,做USB开发的人其实还不是太多,更何况大家使用的板子不同,谁都不知道对方用的板子的情况。我就是在这个时候读遍了手头的文档,照着上面一步一步地做,最终还是运行不了。两个星期之后,我才想起为什么不打电话去给出这个板子的公司问问呢?然后就打了,在他们给了我一个配置方法之后,所有CYPRESS的程序都能在板子上运行了。原来是代码地址配置得不对,下载之后不能运行。那天,高兴得了差点上睡不着觉~~
后来,我阅读了几个CYPRESS的EXAMPLE,了解了BULK传输,了解了用到的一些寄存器,了解CYPRESS给的框架。然后,我就开始把原来找到的一个为EZ-USB写的HID键盘的固件代码改成FX2用的。
本来想,同一个公司的芯片,不就是改改寄存器,再看看有些其他的不同,改过来就是了(其实最后发现还真的是这样)。但这过程中,因为粗心,或者说因为对FX2设备的使用的了解还不是很深,又遇到了一些问题。我把它们分点列在下面,算是FAQ吧。
1.设备无法识别
这可能是因为EEPROM里的内容乱了。如果EEPROM的第一个字节决定设备下一步进行什么动作。如果乱了,设备可能发送错误的信息给主机,那么主机自然也就识别不了设备了。CYPRESS给了一个叫ZAPBIG的程序,用于恢复EEPROM的内容,CONTROL PANNEL的程序文件夹没有。如果谁要,我做乐意发给他。EEPROM恢复后,最后把FX2/EXAMPLE/EEPROM_IMAGE里的那个.IIC文件使用EEPROM下载按钮下载到EEPROM中,这样开发板上电后会自动运行KEIL的DEBUG MONITOR。
2.无法进行IN传输。
这个问题就比较低级了。因为我在ARM IN端点的时间,只写了EPxBCL,而没写EPxBCH。如果只知道一个数的低8位,而不知道8位,如何能确定一个字到底是多少?所以,在ARM一个端点时,端点计数器的值一定要明确给出。
3.当主机已经识别一个设备为HID键盘时,无法进行IN传输。
开始我以为原因是描述符出了问题,所以我把HID的标准给看了两遍,又参照别人的描述符文件,实在是找不出哪有错了。我在开始的时候也想到的端点使用的问题。我是使用EP6来作为IN端点的,但在看到有CYPRESS给的HID设备开发例子中用EP2来做很IN传输端点时,我也没觉得我用EP6作为IN传输端点有什么错,更何况,我也试着用EP2作为IN传输端点过,也是用不了。后来,我在网上看到一个例子用EP1来作为IN传输端点,抱着试试的心态,我改用EP1作为IN端点,奇迹般的,屏幕上出现了abcabcabcabcabc(当时的按钮设置有问题。。:))。至于为什么用其他端点不行,我仍然没有答案。如果谁知道,告诉我!
在我调整好按键后,开发板可以很好的实现一个小键盘的功能了。现在看了,当初碰到的问题很是不值一提,不过总要经历的......
文中有很多细节没有提到,大家可以GOOGLE一下。或者看看FX2的TRM。
最后,我收藏夹里的链接给大家做参考:
Embeded
单片机
汇编
汇编伪指令注释(单片机新手入门学堂)-伟纳电子 www.willar.com
单片机MCS-51系列指令快速记忆法 - Duuboo's Final Fantasy
C语言
单片机C语言学习
初学者:volatile的应用
C变量的复杂宣言
USB
smth usb数字小键盘
USB开发网
[USB开发网-开发论坛] USB开发论坛
奇怪的问题,control panel已经显示了管道信息了,但是每次传输都没有任何反应
68013 EEPROM烧录问题, 飞狐兄,请教你:)
BusHound5.0使用问题
Specifiction
USB.org - HID Tools
Fx2
10分钟完成一个USB驱动程序
[推荐专业USB网站
USB2.0控制器CY7C68013特点与应用
USB驱动开发驱动程序开发网技术社区 - powered by phpwind.net
USB.org - Tools
嵌入开发网--下载中心-USB键盘特殊功能键的实现
驱动开发网
- 如何在一个月内完成一个USB设备
- 如何在虚拟一个USB设备
- 学习计划和个人提升(一个月内完成)
- 如何在一个月内搭建一个自己的博客网站
- 我们是如何在一个月内干掉腾讯阅读的
- 如何找到一个usb设备的具体驱动
- 在新疆一个月网站完成时无数据快照
- 找到了一个USB设备
- 如何在一周内摸清一个行业?
- 如何在一周内摸清一个行业
- 如何在一周内摸清一个行业
- 如何在一周内摸清一个行业
- 如何在“一周内”摸清一个行业
- 如何判断一个点在矩形内
- 用日历控件把时间限制在一个月内
- 日期处理与控制日期段在一个月内
- 如何在一个函数内修改一个全局变量
- Algorithm: 如何判断一个点是否在一个三角形内
- PERF_OBJECT_TYPE結構的成員
- 用Delphi编写Win2000服务程序
- 以绝招应对损招 封杀木马病毒全攻略
- C++中typename关键字的使用方法和注意事项
- 企业选择ERP 崇洋心态不可取
- 如何在一个月内完成一个USB设备
- java基础学习
- MessageBoxPrintf
- JDBC操作各种数据库经验技巧集萃(转)
- java 日历控件
- 提取HTML中的文本信息
- 利用htmlparser抓取网页内容(一)
- 为一个理想而奋斗一生
- linux grep命令的使用