打印

有谁知道EZ_USB Interface界面上那2个按钮是做什么用的?

[复制链接]
4066|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tom_2_2|  楼主 | 2011-5-3 22:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
dqyubsh| | 2011-5-3 23:13 | 只看该作者
HOLD使8051进入复位状态,RUN使8051脱离复位状态。

主机向设备RAM下载数据或者读取数据时,需要发送厂商请求,请求号0xA0。观察界面的DOWNLOAD和RELOAD按钮,在下载之前会HOLD,下载之后会RUN,中间即是下载固件到RAM。

猜想这种情况大致是发生在固件没有正确装载,可能在驱动程序或者INF配置上出了问题。检查一下是C0还是C2启动,如果是C0,看一下主机是否在设备开机时将固件发送下去(示波器量一下),HOLD和RUN之间发生了什么;C2启动时查一下IIC总线,在上电过程是否从EEPROM中读了大量数据。

再一种可能是CPLD对8051的复位造成了影响。从复位过程查找原因。

此时,用那个抓包的程序弄一下,可能会有帮助。

使用特权

评论回复
板凳
tom_2_2|  楼主 | 2011-5-5 15:41 | 只看该作者
请问楼上我上位机程序使用CYPRESS 的cyapi库编程的.

请问在USBDevice = new CCyUSBDevice();这个类中有完成这功能的函数调用吗?或其它的函数?

使用特权

评论回复
地板
dqyubsh| | 2011-5-5 16:10 | 只看该作者
首先你的思路就不对。正常情况下是不应该出现这个问题的,硬件的问题不能靠上层软件来打补丁。拼凑的东西根本是个垃圾,一定要杜绝这种观念。

你把CPUCS寄存器的设置代码贴上来。或者整个TD_Init()函数的代码。

使用特权

评论回复
5
dqyubsh| | 2011-5-5 23:04 | 只看该作者
我查了一下手册,你不用发固件代码了,跟那个没关系。最可能的原因是:
EEPROM编程出错了,没有加载完毕。你要详细说一下你的EEPROM怎么用的,C0还是C2,C0怎么写的,C2的命令行怎么写的,下载过程有没有问题。

如果还不能解决,继续描述一下你的问题,不要吝啬文字。你用CyConsole下载固件程序之后,没点HOLD和RUN之前,板子能不能用?枚举的VID和PID是多少?考白你的操作过程,然后上图。

使用特权

评论回复
6
tom_2_2|  楼主 | 2011-5-6 09:46 | 只看该作者
dqyubsh你说的很好!真的很感谢对我的问题如此关注!
首先我的USB模块是采用cy的AUTO SlaveFIFO 异步8位模式,作为CPLD模块同PC机交换数据的通路,为了简化CPLD程序设计以及以后可以使USB模块方便的用在其它地方,所以选择了SlaveFIFO模式,这样USB通信控制比较简便。
  所以我把USB的iic固件直接烧在了外部的EEPROM中了,这个USB模块我以前用几次了其中也包括跟CPLD通信,都没有发现这个奇怪现象!
  现在问题又有转机了,由于之前CPLD程序还没有正常调通,USB模块还是可以用的,只不过第一次不行,于是我就努力先调通CPLD程序,等CPLD程序都正常了,我偶然发现USB模块的那个奇怪症状也消失了,所以我怀疑是不是我CPLD造成的影响啊!
  虽然问题不在出现了,但是我还是想弄通dqyubsh说的内在原理,想继续师从dqyubsh!至于是那个C0,C2我还要回过头去看一下书,温习一下了!
方便的话加我QQ:1318181493

使用特权

评论回复
7
dqyubsh| | 2011-5-6 15:24 | 只看该作者
手册上有说,加上自己理解。老师这事就省了,你有问题发帖吧。我也不用QQ,加了也不上。

你说那个HOLD和RUN ,我归纳了一下,可以写成下面的样子。但是,目前这两个函数确确实实用不到,也许写驱动程序用得着吧。写出来你参考吧。

// HOLD
void CTestDlg::Hold()
{
        if(USBDevice != NULL)
        {
                CCyControlEndPoint  *ept = USBDevice->ControlEndPt;   
               
                ept->Target    = TGT_DEVICE;  
                ept->ReqType   = REQ_VENDOR;  
                ept->Direction = DIR_TO_DEVICE;   
                ept->ReqCode   = 0xA0;   
                ept->Value     = 0xE600;   
                ept->Index     = 0;  
               
                unsigned char buf[1];  
                buf[0] = '\01';
                LONG bytesToSend =  1;  
                ept->Write(buf,  bytesToSend);  
        }
}

// RUN
void CTestDlg::Run()
{
        if(USBDevice != NULL)
        {
                CCyControlEndPoint  *ept = USBDevice->ControlEndPt;   
               
                ept->Target    = TGT_DEVICE;  
                ept->ReqType   = REQ_VENDOR;  
                ept->Direction = DIR_TO_DEVICE;   
                ept->ReqCode   = 0xA0;   
                ept->Value     = 0xE600;   
                ept->Index     = 0;  
               
                unsigned char buf[1];  
                buf[0] = '\00';
                LONG bytesToSend =  1;  
                ept->Write(buf,  bytesToSend);  
        }

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

40

主题

319

帖子

1

粉丝