找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

M487 HSUSBD HS模式中断传输抖动大

[复制链接]
跳转到指定楼层
楼主
BOEINGNG 发表于 2024-4-20 11:15:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用M487 HSUSBD周期性的发送数据,USB的模式是高速模式,配置断点IN传输为中断传输方式,使用手动发送模式发送数据,每次判断EPA缓存为0才发送数据,中断传输的时间间隔是1ms,我给USB包建了一个FIFO,USB包产生的速率是2ms,我测了一下每次向USB写发送数据的时间间隔,发现最大时间间隔会随着测量时间的增加而增加,一般半个小时最大间隔在100ms,一个小时会在180ms左右,我们上位机是用python写的,用的libusb库,各位看看会是什么问题?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
回复

使用道具 举报

沙发
chrishu 发表于 2024-4-23 09:36:47 | 只看该作者
1、每次判断EPA缓存为0才发送数据  -----怎么判断EPA缓存空的?另外怎么实现EPA空发送数据的?M487是从机,从机不能主动给主机发送数据。从机只有在收到主机发送的IN令牌,硬件会自动将准备好的数据发送出去。
2、从机往主机发送数据的时间间隔,是主机决定的。看主机什么时候发IN令牌。你可以用usb分析仪去抓一下usb总线上的数据看一下。
回复 支持 反对

使用道具 举报

板凳
 楼主| BOEINGNG 发表于 2024-4-23 10:50:47 | 只看该作者
chrishu 发表于 2024-4-23 09:36
1、每次判断EPA缓存为0才发送数据  -----怎么判断EPA缓存空的?另外怎么实现EPA空发送数据的?M487是从机, ...
  1. void transferDataPackages(USB_DATA_PACKAGES_FIFO * const packagesFIFO){
  2.         //Waiting usb send success
  3.         if(HSUSBD->EP[EPA].EPDATCNT & 0xFFFF)
  4.         {
  5.                 return;
  6.         }
  7.        

  8.         USB_DATA_PACKAGES * package = popPackageFromReadysFIFO(packagesFIFO);

  9.         formatDataAndSendPackages(package);
  10.         resetPackage(package);
  11. }
复制代码
这个在while loop中执行,只有HSUSBD->EP[EPA].EPDATCNT & 0xFFFF等于0才会发下一包数据
回复 支持 反对

使用道具 举报

地板
chrishu 发表于 2024-4-24 13:51:36 | 只看该作者
你的意思是主循环里检查端点buffer的数据都发送出去了,就往buffer里填写数据,等待下一次IN令牌到来吗?
可以看一下你填端点buffer和写EPDATCNT的函数吗?
另外你在前面提到
1、USB包产生的速率是2ms----是指在别的地方产生数据包,上面那个循环里查询usb发送完了,并且有数据包存在就往端点buffer里填吗?
2、每次向USB写发送数据的时间间隔---是指MCU往USB线上发送吗? 这个间隔怎么测试的?


回复 支持 反对

使用道具 举报

5#
 楼主| BOEINGNG 发表于 5 天前 | 只看该作者
chrishu 发表于 2024-4-24 13:51
你的意思是主循环里检查端点buffer的数据都发送出去了,就往buffer里填写数据,等待下一次IN令牌到来吗?
...

这问题我已经解决了,改成虚拟串口就好了
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU