打印

usbuart用户模块中有问题

[复制链接]
2718|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cma|  楼主 | 2008-11-16 16:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
再发一个有技术含量的帖子!

==================================
CYPRESS提供的usbuart用户模块中有问题,使用XP+SP3的用户需要注意了。

下面是我在10月28日向CYPRESS公司发出的请求支持的帖子。经过了近20天的折腾,不断的沟通,他们终于找到问题所在,但解决办法还在等待之中。


------------------10月28日发出的询问
Created at:  10/28/2008  
         
Part Number:  64215  
Product:  PSoC Mixed-Signal Controllers - PSoC Mixed-Signal Array > PSoC  
Subject:  Problem with the USBUART  
Description:  I am having a problem with the USBUART.  

Test code is the Sample Code from USBUART Datasheet:  

BYTE Len;  
BYTE pData[32];  
void main()  
{  
    M8C_EnableGInt; //Enable Global Interrupts  
    USBUART_Start(USBUART_5V_OPERATION); //Start USBUART 5V operation  
    while(!USBUART_Init()); //Wait for Device to initialize  
    while(1)  
    {  
        Len = USBUART_bGetRxCount(); //Get count of ready data  
        if (Len)  
        {  
            USBUART_ReadAll(pData); //Read all data rom RX  
            while (!USBUART_bTxIsReady()); //If TX is ready  
            USBUART_Write(pData, Len); //Echo  
        }  
    }  
}  

When PC send 8/16/24/32 bytes data to PSOC,the 64215 only works one time,then dos not work. But send the another numbers byte data, it works well.  

---------------------11月14日的答复,终于找到了原因,但解决办法还在等待中。
Cypress Response | 11/14/2008 06:17 AM | Web  

Hello Ma Chao,  

I'm author of USBUART user module.  

This is defect appears on XP SP3 only. USBUART works fine on XP with SP2 and prior SP.  
Failure reason: Starting from SP3 standard Windows driver (cdc.sys) send 0-length CDC packet after 8bytes or 16bytes or 24bytes or 32bytes packet is sent. USBUART can't able to correct resolve 0-length packet. I'll try to provide you hotfix as soon as possible.  

Regards,  
Level II support 

===============================================================
经过19天的来回,Cypress的工程师终于找到了问题的原因,但解决的方法还没有,他们要修改USBUART了。 

原因在于USBUART不能处理0长度的CDC数据包。而XP(SP3)发送完8/16/24/32等8的陪数数据包后,跟着发送了一个0长度的数据包。这样UASUART就“死”掉了。Cypress工程师把责任归到了XP的SP3了。 

收到答复后,我马上在我的台式PC(正好是XP+SP2)上进行了测试。的确在SP2下是没有问题的。 

不管怎样,Cypress不能让微软改动XP吧,只能他们自己更新USBUART了。怪他们自己没有经过全面的测试了。 

要做到完美是不容易的。Cypress的PSoC还需要努力和完善。 

沙发
hewanli| | 2008-11-16 18:04 | 只看该作者

真是人外有人啊

瞻仰一下,看来我实在太初级了,还要加油啊

使用特权

评论回复
板凳
ni_labview| | 2008-11-17 00:53 | 只看该作者

佩服

使用特权

评论回复
地板
simon21ic| | 2008-11-17 11:32 | 只看该作者

SP3会强制在倍数长度的数据包后发送ZLP?

这个要测试一下

使用特权

评论回复
5
cma|  楼主 | 2008-11-17 12:53 | 只看该作者

情况就是这样的

楼上的,情况就是这样的。

我在SP2上测试过了,USBUART没有问题。SP3肯定出问题。我们就是由于这个BUG,大大影响了我们PSoC—ISSP编程器的进度。

好象美国CYPRESS的工程师都不使用SP3。我向他们提出问题后,大家一直都搞不清楚,他们一直说没有问题,我都感到奇怪。最后他们问使用的OS版本,才知道了原因。

估计目前他们在做修改了。总不能让微软修改吧。

使用特权

评论回复
6
simon21ic| | 2008-11-17 13:37 | 只看该作者

这个修改应该挺简单的吧?

在USB发送数据后增加:
if(!(len % EP_SIZE))
{
    // Send ZLP
    SetEPTxCount(ENDP2, 0);
    SetEPTxValid(ENDP2);
}
如果要发送数据的长度处以端点长度余数为0的话,就发送一个长度为0的数据包。

使用特权

评论回复
7
cma|  楼主 | 2008-11-17 13:49 | 只看该作者

上面CYPRESS的工程师已经回答了

USBUART can't able to correct resolve 0-length packet. I'll try to provide you hotfix as soon as possible.

我们在PC上是面对COM口设备编程,不是面对USB设备

使用特权

评论回复
8
simon21ic| | 2008-11-17 13:58 | 只看该作者

但ZLP确实是底层USB接口上的问题

撇开USB接口是无法解决的。
当然,也有简单的解决方法:不发送USB端点长度的整数倍数的数据包即可(最好能保证枚举数据包也一样)。

问题可能有2中情况(假定USB的端点大小是64字节):
1.PC发送一个64字节的数据包到设备,在SP3下,usbser(CDC的底层驱动)会发送这64字节,然后在发送一个ZLP以表明该数据包结束。这个问题应该比较好解决,当设备端收到长度小于64字节的数据包就表明当前数据包接收完毕。
2.设备发送一个64字节的数据包到PC,如果只是发送这64字节的数据的话,SP3下的usbser并不会认为该数据包已经发送完毕,需要等待下一个长度小于64的数据包,这时,设备端就需要发送一个ZLP。

使用特权

评论回复
9
cma|  楼主 | 2008-11-17 14:45 | 只看该作者

问题不在这里

要明白,我们是用他们的USBUART,不是帮他们编写USBUART。
如果一切自己编写,那么PSoC的特点损失了50%!

目前我们饶开使用,采用9和33个字节的数据包。原来定义为(8/64),处理麻烦多了。

使用特权

评论回复
10
yewuyi| | 2008-11-17 16:36 | 只看该作者

哈哈,又见强贴。。。

使用特权

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

本版积分规则

cma

11

主题

85

帖子

1

粉丝