找回密码
 立即注册

QQ登录

只需一步,快速开始

开启左侧

M463的hsusbd收发速度慢是什么原因

[复制链接]
匿名  发表于 2024-3-28 13:29:44 |阅读模式
  /* bulk out */
    if(IrqStL & HSUSBD_GINTSTS_EPBIF_Msk)
    {
        int volatile i;

        IrqSt = HSUSBD->EP[EPB].EPINTSTS & HSUSBD->EP[EPB].EPINTEN;
        gu32RxSize = HSUSBD->EP[EPB].EPDATCNT & 0xffff;
        for(i = 0; i < gu32RxSize; i++)
            gUsbRxBuf[i] = HSUSBD->EP[EPB].EPDAT_BYTE;

        /* Set a flag to indicate bulk out ready */
        gi8BulkOutReady = 1;
        HSUSBD_CLR_EP_INT_FLAG(EPB, IrqSt);
    }

M463的hsusbd测试中,当bulkout发来数据,进入中断读取数据的时候,gu32RxSize=512字节的数据 在没有编译器优化的情况下,大约需要170us才能读完。

        for(i = 0; i < gu32RxSize; i++)
            gUsbRxBuf[i] = HSUSBD->EP[EPB].EPDAT_BYTE;
CPU跑的是200M,不知道为什么读usb的数据速度这么慢,这样也算不上usb2.0高速了,好像只要不到30M的波特率了,和480M差太多了,是什么原因呢




回复

使用道具

chrishu 发表于 2024-3-29 17:51:41 | 显示全部楼层
用软件去读会慢一些,可以用DMA的去搬,参考HSUSBD_Mass_Storage_ScatterGather例程。你说的30M是怎么测试的?用usb分析仪去抓的总线上的传输还是测试的主机开始发,到从机处理完?
USB不是所有时间全部用于传输:要遵循USB协议,传输由事务组成,事务不能跨帧(高速125us/微帧)
也不是说每帧里的所有数据都是有效数据,还包含了协议的开销。

理论上高速USB 批量传输最大传输速率50.78MB/s
回复 支持 反对

使用道具 举报

Angus 发表于 2024-3-29 17:56:58 | 显示全部楼层
480Mb/S 指的是位的数率,换算成字节,就是 60MB/S,每传一个数据包都要先传输握手数据包,USB 是半双工通信,收发不能同时,所以60MB/s的速率,实际也就50MB/s 左右。

还有一点,如果 USB 走线不好,或者USB 线缆差,传输出错,再发起数据重传,速率就更低了。
回复 支持 反对

使用道具 举报

匿名  发表于 2024-3-31 08:42:21
chrishu 发表于 2024-3-29 17:51
用软件去读会慢一些,可以用DMA的去搬,参考HSUSBD_Mass_Storage_ScatterGather例程。你说的30M是怎么测试 ...

30M是bulk out中断来了之后,读取512字节的数据用了170us,这个计算的话波特率应该是24M,所以感觉有点慢,正常200M的cpu,循环512次读数据不应该用这么长时间吧
回复 支持 反对

使用道具

chrishu 发表于 2024-4-2 17:00:15 | 显示全部楼层
是测试的下面这两条语句的执行时间吗?还是测的整个中断处理时间?
for(i = 0; i < gu32RxSize; i++)
            gUsbRxBuf[i] = HSUSBD->EP[EPB].EPDAT_BYTE;
应该不需要170us那么长,有设置其他优先级高的中断嵌套吗?
批量传输 建议用DMA
回复 支持 反对

使用道具 举报

匿名  发表于 2024-4-5 09:25:51
chrishu 发表于 2024-4-2 17:00
是测试的下面这两条语句的执行时间吗?还是测的整个中断处理时间?
for(i = 0; i < gu32RxSize; i++)
     ...

测试的这个语句的执行时间,gu32RxSize=512
for(i = 0; i < gu32RxSize; i++)
            gUsbRxBuf = HSUSBD->EP[EPB].EPDAT_BYTE;

已经把所有中断都禁止了,单测了一下时间是170us,不知道哪里的问题。
另外想问下,如果端点2和端点3都作为bulkout,两个端点可以都使用dma吗,dma寄存器好像只能设置一个端点号,谢谢
回复 支持 反对

使用道具

chrishu 发表于 2024-4-7 15:01:47 | 显示全部楼层
游客 113.225.162.x 发表于 2024-4-5 09:25
测试的这个语句的执行时间,gu32RxSize=512
for(i = 0; i < gu32RxSize; i++)
            gUsbRxBuf = H ...

可以的。DMA只有一路,可以用基本模式,在某个端点收到数据后去设置DMA,根据设定值搬运完后,DMA就释放。其他通道可以再用它
回复 支持 反对

使用道具 举报

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

本版积分规则

新唐MCU