USB学习笔记连载(二十):FX2LP如何实现高速和全速切换(转载)

CYPRESS的USB外设控制器CY7C68013A是一款广泛应用于USB打印机,手机,存储设备,USB测试等多个领域的经典产品。该产品符合USB2.0协议规范,支持full speed和high speed两种速度模式,并且配有8051的MCU,带有IO,IIC,UART,定时器等功能。由于该芯片是市场上唯一支持high speed模式的芯片,所以一上市后,就获得了广泛的关注。

关于CY7C68013A的开发,CYPRESS提供了完整的程序架构,一般的应用只需要理解了它的软件架构以及寄存器的含义,然后根据自己的需求修改寄存器初始化值,并且修改USB的相关描述符即可实现。并且CYPRESS提供了较多的例程以及上位机,方便参考和调试,加快了开发的进度。

但是在开发的过程中,如果你想实现将你的CY7C68013A设备速度模式变为可切换,那你可能就要纠结和痛苦了。因为你查遍了它的DATASHEET和TRM手册也不会发现有相关的介绍。

但是请不要急,看完这篇帖子,你就能够实现了。

首先,在CY7C68013A的所有例程中,默认情况下,都是将设备枚举成高速模式的。那么如果想实现将其默认枚举成全速设备的话,应该怎么做呢?那就需要修改其中的寄存器值了。怎么改,改哪里呢?CY7C68013A的实现方法有点weird。因为他不是像别的MCU那样在程序中配置了某个寄存器的值就可以实现的,他是通过修改KEIL软件的配置实现的。准确的说是在KEIL调用Hex2bix文件,实现将HEX的文件转换为IIC文件时通过修改转换的参数来实现的。即将KEIL配置中的命令改成

c:\cypress\usb\bin\hex2bix -c 0x80 -i-f 0xC2 -o bulkloop.iic bulkloop.hex。

如果不加-c 0x80命令,那么CY7C68013A就会默认枚举成高速,加上-c 0x80就默认枚举成全速。

那么在实现将设备默认枚举为全速后,如果在程序中将USB断开了一次,CY7C68013A又会变成了高速模式,此时想要切换速度模式,又需要怎么做呢?很简单,只需要这样(大招来了):

USBCS |= bmDISCON;      // just disconnect from USB

CT1&=0x02;     //0x02保证程序重启后可以保持在全速,//0x00保证在高速

EZUSB_Delay(1500);

USBCS&=~bmDISCON;      // reconnect USB

USBCS|=  bmRENUM;          //EZUSB_Discon(TRUE);

即修改寄存器CT1的值就好了。这个寄存器就是控制速度模式的寄存器。但是翻遍了TRM手册,也没有关于这个寄存器的介绍,为什么呢?那是因为这个寄存器是不合法的,准确说是这个寄存器是CYPRESS公司开发的时候,在TEST时候使用的。所以没有公布。以上内容希望对大家有帮助。(本段代码只能参考例程中关于寄存器的文件fx2regs.h)

时间: 2024-11-09 00:06:03

USB学习笔记连载(二十):FX2LP如何实现高速和全速切换(转载)的相关文章

USB学习笔记连载(十二):USB描述符

USB设备是端口,接口,配置的集合,USB协议是以各种USB描述符来表征USB设备的功能.计算机通过这些描述符来获得USB设备的功能. USB描述符包括: USB标准设备描述符,USB集线器描述符.HID描述符,这里主要讲解USB描述符. USB标准设备描述符包括:设备描述符,端点描述符,接口描述符,配置描述符,设备限定描述符,其他描述符.这些所有的描述符都在 官方固件中的 dscr.a51 文件中,注意!!!!!   1.设备描述符 一共18个字节,14个字段.在官方给的固件程序中的描述如下图

USB学习笔记连载(十六):USB数字签名

转载:http://blog.chinaaet.com/crazybingo/p/34487 曾记得在最开始安装驱动程序的时候出现过这个错误....但是最近我在别的电脑安装的时候又不出现这个错误了...搞不清楚所以然..就拿出来吹吹牛逼....当时我是这样做的..... 至此,由于Win7数字证书问题,安装失败....蛋疼的要死掉..(这是3个月以前的事情了...),然后有人大神告诉我,通过相关设置让电脑降低层级,即使能PC 测试模式,如下: 重启后看到右下角的水印,略带不爽 ,重新打开dseo

【Java学习笔记之二十六】深入理解Java匿名内部类

在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始化匿名内部类.匿名内部类使用的形参为何要为final. 一.使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 } 在这里我们看到使用匿名内部类我们必须要继承一个父类或者

《JavaScript权威指南》学习笔记之二十---XMLHttpRequest和AJAX解决方案

一.AJAX概述 AJAX是Asynchronous JavaScript and XML的缩写,中文译作异步JavaScript和XML.AJAX 不是新的编程语言,而是一种使用现有标准的新方法,在不重新加载页面的情况下,与服务器交换数据并更新部分网页的艺术.其核心是:客户端的Javascript能够与web服务器进行异步数据交换. 二.AJAX基础---XMLHttpRequest对象 所有现代浏览器(IE7+.Firefox.Chrome.Safari 以及 Opera)均内建 XMLHt

Dynamic CRM 2013学习笔记(二十八)用JS动态设置字段的change事件、必填以及可见

我们知道通过界面设置字段的change事件,是否是必填,是否可见非常容易.但有时我们需要动态地根据某些条件来设置,这时有需要通过js来动态地控制了. 下面分别介绍如何用js来动态设置.   一.动态设置字段的change事件 // form on load event function onLoad() { init();   pageAttr.delivery_from.addOnChange(deliveryFromChange); pageAttr.type.addOnChange(typ

Dynamic CRM 2013学习笔记(二十)字段change事件

CRM里有二种方式实现字段change事件,一种是在form里,一种完全通过js来实现.本文介绍下二者的用途及区别. 1. Form里用法 这种方式估计其实也是添加一个js的function. 这种方式功能最强大,无论是前台还是后台只要这个字段有变化就会触发这里的事件.   2. 纯js Xrm.Page.getAttribute("new_actual_unit_price").addOnChange(function () { calculateExpense("new_

Dynamic CRM 2013学习笔记(二十六)Reporting Service报表 动态参数、参数多选全选、动态列、动态显示行字体颜色

上次介绍过CRM里开始报表的一些注意事项:Dynamic CRM 2013学习笔记(十五)报表入门.开发工具及注意事项,本文继续介绍报表里的一些动态效果:动态显示参数,参数是从数据库里查询出来的:参数可以多选或全选:动态地显示列,列不是固定的:根据某一字段的值来动态地显示整行字体的颜色. 下面介绍详细的方法: 一.动态参数.参数多选全选 动态参数: 首先定义一个Dataset: SELECT DISTINCT new_countryId, new_codename AS name FROM ne

Android学习笔记(二十)——自定义内容提供器

//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 如果我们想要实现跨程序共享数据的功能,官方推荐的方式就是使用内容提供器,可以通过新建一个类去继承 ContentProvider 的方式来创建一个自己的内容提供器: 一.继承ContentProvider的六个方法: ContentProvider 类中有六个抽象方法,我们需要使用子类去继承它,并重写六个方法,我们先来认识这六个类.新建 MyProvider继承自 ContentProvide,代码如下所示: 1 p

Dynamic CRM 2013学习笔记(二十九)reporting service 常见问题

在报表开发过程中,经常会遇到各种各样的问题,比如The report cannot be displayed. (rsProcessingAborted),一点有意义的提示都没有:再就是分页问题,经常我们想把一条记录放在一页,下一条记录另起一页,而不是紧连在上一条记录的后面:有时我们还会出现上传报表时报错:An error occurred while trying to add the report to Microsoft Dynamics CRM. Try adding the repor