本帖最后由 tanmingjin 于 2020-7-10 22:52 编辑
测试STM32F103和AT32F403 USB Bulk传输速度
这两款芯片都只支持USB2.0 Full Speed,USB的总线频率为12MHz,
如下是USB2.0 Spec的定义:
当设备需要有大量数据传输的时候,此时就可以选择Bulk传输。
如下是USB2.0 Full speed Bulk 传输速度理论值,按照每次传输最大字节64 Byte,
那么1秒可以传输1216000 Byte的有效数据,约为1.16MB/s。
下面来看一下STM32F103和AT32F403 USB Bulk实际的吞吐量:
如下我们通过抓USB总线上的数据包来分析,通过一个帧间隔SOF(1ms)内数据的多少来计算USB可以达到的吞吐量。
用此方法计算出来的吞吐量可能并不代表我们应用中实际的吞吐量,实际应用中会受到主机以及设备端数据处理的影响。
测试程序都使用虚拟串口Demo程序,Demo可以在对应厂商官网下载,将Demo发送和接收部分做一下处理。
上位机使用使用串口工具发送和接收数据。
发送部分:每次发送完成之后写入64 Byte数据
void EP1_IN_Callback(void)
{
uint8_t buffer[64];
UserToPMABufferCopy(buffer, ENDP1_TXADDR, 64);
SetEPTxCount(ENDP1, 64);
SetEPTxValid(ENDP1);
}
接收部分:接收到数据之后,将数据拷贝出来之后就继续接收下一包数据
void EP3_OUT_Callback(void)
{
uint8_t buffer[64];
usb_Receive_length = GetEPRxCount(ENDP3);
PMAToUserBufferCopy(buffer, ENDP3_RXADDR, usb_Receive_length);
SetEPRxValid(ENDP3);
}
1. 单一IN传输 (设备上传数据到PC) 如下图:在一个帧间隔内 AT32F403上传了13个64Byte的数据,理论上1ms可以上传 64Byte*13=832Byte,1s可以上传832000 Byte STM32F103上传了12个64Byte的数据,理论上1ms可以上传 64Byte*12=768Byte,1s可以上传768000 Byte 实际应用中可能会收到主机的影响。
2. 单一OUT传输(设备接收主机数据)
如下图:在一个帧间隔内 AT32F403接收了11个64Byte的数据,理论上1ms可以接收 64Byte*13=704Byte,1s可以接收704000 Byte STM32F103接收了9个64Byte的数据,理论上1ms可以接收 64Byte*12=576Byte,1s可以接收576000 Byte
实际应用中可能会受到主机的影响。
USB2.0 理论上1ms可以传输19个64Byte的数据,分析这里OUT传输速度比较低的原因是当主机传完一个 数据包之后,会马上发起下一个数据,但此时USB设备端并没有处理完成上一个数据包(将数据包拷贝到内存)。 这样就导致设备会回复主机NAK,造成带宽浪费,如下图:
3. IN&OUT同时传输
如下图:在一个帧间隔内
AT32F403传输了18个64Byte的数据,理论上1ms可以接收 64Byte*18=1152Byte,1s可以传输1152000 Byte
STM32F103传输了15个64Byte的数据,理论上1ms可以接收 64Byte*15=960Byte,1s可以传输960000 Byte
总结:
对于USB来说,不管是AT32F403还是STM32F103,USB总线频率12MHz是固定的,也就是总线传输的速度其实是
相同的,实际测试出来的传输吞吐量有差异,实际上是因为AT32F403(系统时钟最大支持200MHz)和STM32F103(系统时钟最大支持72MHz)
在数据处理阶段的速度不一样,例如,OUT传输时,都是从USB缓冲区将数据拷贝到内存,AT32F403拷贝数据更快,
就能更快的接收下一包数据,总的吞吐量就更高。
|