USB协议详解:帧首包SOF(Start of Frame)深度解析
USB协议详解:帧首包SOF(Start of Frame)深度解析
USB协议中的帧首包SOF(Start of Frame)是确保设备同步和数据传输准确性的关键组件。本文将详细介绍SOF包的结构、功能及其在USB总线中的作用,并通过STM32的具体实例展示其处理机制。
包的四种类型
根据包的组成,USB协议将包分为四种类型:帧首包SOF(Start of Frame)、命令包(Token)、数据包(Data)和握手包(Handshake)。这四种类型的包在USB通信中扮演着不同的角色。
四种PID类型和四种包类型(按照组成分类)的区别如下:
- PID类型:包括同步包、数据包、握手包和预留类型。
- 包类型:包括帧首包SOF、命令包、数据包和握手包。
SOF包组成
SOF包由USB主机控制器以全速总线的标称速率每1.00 ms±0.0005 ms发出一次,对于高速总线则为125μs±0.0625μs。SOF数据包由PID域+帧号域+5bit CRC域组成。
SOF包发送时间及USB总线包结构
SOF包的发送时间和USB总线的包数据结构如下:
SOF包的发送时间
USB总线包组成
USB总线包由多个部分组成,包括同步段、PID字段、数据段和CRC校验段。
SOF包的其他核心概念
所有高速和全速功能(包括集线器)都接收SOF数据包。SOF包不会引起任何功能生成应答包,因此,无法保证所有的功能都能收到SOF包。
SOF包的主要作用:
帧同步:SOF包作为帧的起始标记,使得所有的USB设备能够同步到同一个时间基准上。通过SOF包,所有设备可以准确地知道当前处于哪个帧,从而实现同步通信。
时钟同步:SOF包的周期性发送有助于USB设备保持内部时钟的准确性。设备可以通过检测SOF包的到来来调整自己的时钟,保证系统时钟的同步。
唤醒设备:SOF包可以用来唤醒处于低功耗状态的USB设备。当设备检测到SOF包时,会从休眠状态中恢复,准备进行数据传输。
周期性传输调度:SOF包的周期性发送为USB设备提供了固定的时间基准,使得设备可以根据SOF包来安排周期性的数据传输。
错误检测:SOF包中的CRC校验可以帮助检测数据传输过程中的错误。如果设备收到的SOF包校验失败,则可以判定数据传输可能存在问题。
SOF包的发送:
- SOF包由USB主机周期性地发送,其发送频率取决于USB总线的速率。
- 全速USB总线每毫秒发送一个SOF包,而高速USB总线每125微秒发送一个SOF包。
STM32 SOF包处理机制
STM32对SOF包的处理代码如下:
//读出的中断标志是SOF中断标志,且SOF中断使能了
if (wIstr & ISTR_SOF & wInterrupt_Mask)
{
//清除SOF中断标志
_SetISTR((uint16_t)CLR_SOF);
//统计共接收到多少SOF
bIntPackSOF++;
//当定义了SOF_CALLBACK,则调用SOF_Callback,
//像钩子函数一样,在发生SOF中断时做点什么
SOF_Callback();
}
这段代码展示了STM32如何处理SOF中断,包括清除中断标志、统计接收到的SOF包数量以及调用回调函数。