牛卧堂MCU技术交流

标题: M463的hsusbd收发速度慢是什么原因 [打印本页]

作者: 匿名    时间: 2024-3-28 13:29
标题: M463的hsusbd收发速度慢是什么原因
  /* 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
用软件去读会慢一些,可以用DMA的去搬,参考HSUSBD_Mass_Storage_ScatterGather例程。你说的30M是怎么测试的?用usb分析仪去抓的总线上的传输还是测试的主机开始发,到从机处理完?
USB不是所有时间全部用于传输:要遵循USB协议,传输由事务组成,事务不能跨帧(高速125us/微帧)
也不是说每帧里的所有数据都是有效数据,还包含了协议的开销。

理论上高速USB 批量传输最大传输速率50.78MB/s

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

还有一点,如果 USB 走线不好,或者USB 线缆差,传输出错,再发起数据重传,速率就更低了。
作者: 匿名    时间: 2024-3-31 08:42
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
是测试的下面这两条语句的执行时间吗?还是测的整个中断处理时间?
for(i = 0; i < gu32RxSize; i++)
            gUsbRxBuf[i] = HSUSBD->EP[EPB].EPDAT_BYTE;
应该不需要170us那么长,有设置其他优先级高的中断嵌套吗?
批量传输 建议用DMA

作者: 匿名    时间: 2024-4-5 09:25
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
游客 113.225.162.x 发表于 2024-4-5 09:25
测试的这个语句的执行时间,gu32RxSize=512
for(i = 0; i < gu32RxSize; i++)
            gUsbRxBuf = H ...

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




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