牛卧堂MCU技术交流

标题: M487 HSUSBD HS模式中断传输抖动大 [打印本页]

作者: BOEINGNG    时间: 2024-4-20 11:15
标题: M487 HSUSBD HS模式中断传输抖动大
我用M487 HSUSBD周期性的发送数据,USB的模式是高速模式,配置断点IN传输为中断传输方式,使用手动发送模式发送数据,每次判断EPA缓存为0才发送数据,中断传输的时间间隔是1ms,我给USB包建了一个FIFO,USB包产生的速率是2ms,我测了一下每次向USB写发送数据的时间间隔,发现最大时间间隔会随着测量时间的增加而增加,一般半个小时最大间隔在100ms,一个小时会在180ms左右,我们上位机是用python写的,用的libusb库,各位看看会是什么问题?
作者: chrishu    时间: 2024-4-23 09:36
1、每次判断EPA缓存为0才发送数据  -----怎么判断EPA缓存空的?另外怎么实现EPA空发送数据的?M487是从机,从机不能主动给主机发送数据。从机只有在收到主机发送的IN令牌,硬件会自动将准备好的数据发送出去。
2、从机往主机发送数据的时间间隔,是主机决定的。看主机什么时候发IN令牌。你可以用usb分析仪去抓一下usb总线上的数据看一下。

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



作者: BOEINGNG    时间: 2024-4-28 18:31
chrishu 发表于 2024-4-24 13:51
你的意思是主循环里检查端点buffer的数据都发送出去了,就往buffer里填写数据,等待下一次IN令牌到来吗?
...

这问题我已经解决了,改成虚拟串口就好了
作者: chrishu    时间: 2024-5-9 09:12
BOEINGNG 发表于 2024-4-28 18:31
这问题我已经解决了,改成虚拟串口就好了

你是在usb中断里加了串口打印信息吗?




欢迎光临 牛卧堂MCU技术交流 (http://www.nuvoton-mcu.com/) Powered by Discuz! X3.2