一个68013最小系统困扰了我一个星期。插上后上位机识别“unknown device"。测过复位,是高,晶振也起振了。但板子上的CPLD可以正常下载,工作。后来发现给D+D-喷助焊剂以后再焊,主机就可以识别,但过几分钟后又不行了。直到28号下午问题终于解决,原来是制版的有问题,reserved脚通过10K下拉后没有接地,确切的说是我画板子的时候接了地,但板子做出来没有连通。我又检查了其他的几个接地脚,有几个也没有连通。问题终于找到,飞线以后插上USB,终于提示找到了!这个做板子的真是把我害苦了!
总结:
检查开始:
1.d+,d-,没有接错
2.reserved,通过10k下拉
3.EA,通过10k下拉,不过接上fpga的某个管腿,设为输出0 (128脚的)
4.wakeup,通过10k上拉 (这里我没有用到,应该可以不管这个脚)
5.clkout,有12m时钟输出
6.reset为高
出现无法识别的usb设备时,最有可能的问题在reserved引脚有否拉地?这个很关键,千万别小看这个保留引脚,直接导致usb设备能否识别,当然前提是usb的其他配置引脚都正确的设置,包括reset,clk,i2c的scl,sda,一切正常出现的将是cy68013--eeprom missing。
出现无法识别的usb设备时,最有可能的问题在reserved引脚有否拉地?这个很关键,千万别小看这个保留引脚,直接导致usb设备能否识别,当然前提是usb的其他配置引脚都正确的设置,包括reset,clk,i2c的scl,sda,一切正常出现的将是cy68013--eeprom missing。
检查一下clkout输出是否12Mhz,这是上电后的默认,ifclk应该无输出。
现在用controlpannal打开设备可以出现配置界面。
注意先用官方带的例子做开发,但是实际上sample目录的hex文件没一个能用,需要你重新编译,包括重新设置新工程等,重新down进去之后(bulkloop,bulksrc这个例子可以)会进行renum,重新设备列举,提示找到新设备cypress sample device。其实就是2个id改变了,注册表里有对应选项,和开发pci差不多。
片内ram访问和端点设置具体参考datasheet,ram相当于fifobuf,但是由于有双缓冲的存在,使用bulk/trans时候会出现点2次出现2组数据,另外做端点in访问必须要保证length大于epxbch<<8+epxbcl,否则出现系统无法访问。
关于bulkloop例子的问题,至少在我机器上有问题的,就是keil编译会在extautodat1这里警告,如果强行down了这个程序,在数据端点loop是做不出效果的,提示为unresovled extenal symbol,我开始也没想通为什么其他寄存器不警告。最后发现原因是extautodat1变量名有问题,将其改短,问题解决。
经过几次调试CY7C68013的板子,我总结出几点经验以供正在调试68013或试图使用该芯片的朋友参考,也欢迎大家一起讨论。
Cypress公司的usb芯片具有开发简单,文档和例子齐全,驱动不要自己写的特点,非常适合开发周期紧者使用。
对于68013其外围电路主要可以参考该开发包中的电路图,如果你没有买可以之间去公司网站上下。
我使用的是56管脚的因为它已经完全可以满足一般简单数据传输的要求了,它的关键管脚有ifclk,wakeup,reset,d+,d-和电源,地。只要他们对了,主机就可以找到芯片并识别出来。
ifclk,在一般情况下我们使用usb内部的时钟,它可以通过一个大电阻上拉到3.3V.当然你也可以同时接到cpld或fpga,如果你想使用外部时钟时,但是要注意它只能接5-48Mhz的时钟。所以在使用速度可调的FIFO读写时就可能存在可调范围不大的问题,这可以通过同步和异步解决,在同步时它是5-48Mhz,在异步时x-20Mhz(其中x可以很小),在我们的项目中就实现了200khz到48mhz的速度读写FIFO。
wakeup,用来唤醒沉睡中的USB,一般情况下我们也是用100k的电阻上拉到3.3v。只有在你非常注意功耗时才用到。
reset,进行复位,免去了反复插拔设备的麻烦,但是前提是你使用总线供电模式。要注意在reset接地时要保证它与3.3v之间还有一个大电阻,以免直接电源与地相接。
d+,d-是与主机通讯的数据线,当USB设备插上主机时,d+和d-上有一个压差,主机就会发现外围设备,索求pid和vid,载入相应驱动。这儿可能出现两个问题:1、主机发现不了外设2、主机可以发现外设但是不能识别,在usb图标上是一个问号。在第一种情况下主要是d+和d-的问题,因为只要保证接口的4根线是vcc,gnd,d+,d-按要求变即使真没有外设,主机也可以检测到外设,所以如果检测不到,很可能有线接反了;在第二种情况下,原因就比较多了,a,d+,d-线太长了,太细,拐弯太多以致数据出现传输错误,vid和pid无法正确传送,这时可能出现有时可以识别,有时又不能识别。b,由于上面的几个管脚没接好,USB芯片没有正常工作