关于CDC和an58764

公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
zheng
Level 2
Level 2
25 sign-ins 10 replies posted 10 sign-ins

zheng_0-1642490631451.png

你好,上面是我模仿an58764设计的CDC系统,我已经能正常通信。但是我仍然有一个问题没有解决,请帮忙解答,谢谢。

以前在这里提问过了,但是可能因为语言表达问题,没办法把自己的问题说清楚,以至于没有得到满意的答复。

https://community.infineon.com/t5/USB-low-full-high-speed/About-CDC-and-endpoint/m-p/325304#M10106

问题:

 我从8051发了数据到PC,在EP6IN看到的数据是对的,但是我在PC看到的是ffffffff... ; 我重新从8051再发一次相同数据到PC后,EP6IN和PC的数据就都是对的了,也就是说我需要发两次请求才可以得到想要的数据。于是我就想了一个方法,第一次先arm一个不使用的EP(比如EP2IN),再arm真实需要的EP6IN就可以在PC只得到想要的数据了(不会有第一次的ffffff数据)。能帮忙分析一下是因为什么问题吗?如果可以的话麻烦留个邮件地址以便及时和您沟通,谢谢。

0 点赞
14 回复数
YiZ_31
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted

Hi,

 

我想确认一件事情,你如果第一次和第二次发送不同的数据,你看你PC端得到的正确的数据是第一次的还是第二次的?

0 点赞
zheng
Level 2
Level 2
25 sign-ins 10 replies posted 10 sign-ins

谢谢回复。不同数据的时候,收到的是第二次的数据。

我现在的暂时的解决办法是在TD_POLL里头,EP6BCL=1之前加了EP2BCL=1; (EP2实际上并不使用,也就是空arm一次)。

 

0 点赞
YiZ_31
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted

你这边上位机用的什么呢?我用AN58764的固件测试没有这个现象,第一组数据就是正确的

0 点赞
zheng
Level 2
Level 2
25 sign-ins 10 replies posted 10 sign-ins

我用的是Free Serial Analyzer,因为我同时需要gpif,以及保留原设计的一些接口设计,

所以我的代码是AN66806+AN66806+原设计的综合体,如果方便的话我可以把源代码发给您,但是公司不允许把代码上传到这里,所以方便的话麻烦联系我Mail: chisyun.tei@shi-g.com

0 点赞
YiZ_31
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted

所以你可不可以一步一步从原设计定位问题呢?你用AN58764原来的代码也有这个问题吗?

 

0 点赞
zheng
Level 2
Level 2
25 sign-ins 10 replies posted 10 sign-ins

arm(EP6BCL=1)第一次的时候,在EP6读到了写进去的数据,感觉应该更GPIF部分(我们自己的原设计)没有关系?感觉像是没有打通EP到PC这条通路。一直对arm的动作不是很理解,仅仅理解为enable。因为PC端需要CDC,DPRAM端需要GPIF,所以没有只执行过AN66806。

 

0 点赞
YiZ_31
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted

所以你直接用AN58764给EP6FIFOBUF赋值也有这个问题么?如果是的话,那就不是软件问题,可能是硬件设计缺陷。

0 点赞
lock attach
Attachments are accessible only for community members.
zheng
Level 2
Level 2
25 sign-ins 10 replies posted 10 sign-ins

直接用没有问题,EP里读到的和host的数据也是一致的。因为对arm这个动作不熟悉,可能是因为改动了DSCR导致了EP和HOST之间的数据交互出现了问题。我上传了DSCR文件,麻烦帮我看一下,谢谢。

0 点赞
YiZ_31
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted

max packet size 有问题, highspeed 最大为512,full speed最大为64

0 点赞
zheng
Level 2
Level 2
25 sign-ins 10 replies posted 10 sign-ins

谢谢纠错,设定值确实错了,可惜修改之后还是出现同样的问题。

我再看了一次AN66806的代码,在USB→PC的过程中有 if(in_enable) // if IN transfers are enabled,  是不是意味着PC的in请求默认都是false的(在AN66806有设定初始值是false,但是不知一般的默认情况是否也是)我们因为用了CDC,没办法用厂商自定义命令。如果前面的推测正确的话,每次都需要对in端点进行一次arm操作来唤醒PC的in传输,然后才能正确传输到PC?如果是这样的话,就和我们遇到的情况类似了。

0 点赞
YiZ_31
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted

你要理解的是,我们这是一个device(从机),只有主机端来要数据的时候我们才能发送。这完全是主机端驱动的行为。我们这边要做的只是在FIFO中把数据准备好。并没有什么可以唤醒主机in传输的方法。

一个很简单的例子:一个摄像头可以在主机端没打开软件的时候向主机传送图像么?

0 点赞
lock attach
Attachments are accessible only for community members.
zheng
Level 2
Level 2
25 sign-ins 10 replies posted 10 sign-ins

问题是在主机端已经打开软件,并且有发送请求的情况下发生的情况,所以有了上面的推测,因为实在不了解arm命令的原理。麻烦你再帮我看看源码,谢谢。

0 点赞
YiZ_31
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted

Double buffer就是这样的啊,要不你试试把double buffer设置改掉

0 点赞
zheng
Level 2
Level 2
25 sign-ins 10 replies posted 10 sign-ins

是有打算把double改成single看看结果,可是EP*CFG好像只能设定为2/3/4

1:0 BUF[1:0] Buffering Type/Amount.
00 Quad
01 Invalid
10 Double
11 Triple

0 点赞