USB协议详解第20讲(USB包-帧首包SOF)
1.包的四种类型
根据包的组成把包分为四种类型,分别是、帧首包SOF(Start of Frame)、命令包(Token)、数据包(Data)、握手包(Handshake),如下图(大家一定要把PID类型和包类型分开)。
4种PID类型和4种包类型(按照组成分类)的区别如下,大家注意区分。
2.SOF包组成
我们今天看SOF包的详细结构。SOF包由USB主机控制器以全速总线的标称速率每1.00 ms±0.0005 ms发出一次,对于高速总线则为125μs±0.0625μs。SOF数据包由PID域+帧号域+5bit CRC域,下图为SOF包各个域和抓包协议的对应图。
3.SOF包发送时间及USB总线包结构
SOF包的发送时间和USB总线的包数据结构大家可以看下图。
(1)SOF包的发送时间
(2)USB总线包组成
4.SOF包其它核心概念
所有高速和全速功能(包括集线器)都接收SOF数据包。SOF包不会引起任何功能生成应答包,因此,无法保证所有的功能都能收到SOF包。
(1)SOF包的主要作用:
- 帧同步: SOF 包作为帧的起始标记,使得所有的 USB 设备能够同步到同一个时间基准上。通过 SOF 包,所有设备可以准确地知道当前处于哪个帧,从而实现同步通信。
- 时钟同步: SOF 包的周期性发送有助于 USB 设备保持内部时钟的准确性。设备可以通过检测 SOF 包的到来来调整自己的时钟,保证系统时钟的同步。
- 唤醒设备: SOF 包可以用来唤醒处于低功耗状态的 USB 设备。当设备检测到 SOF 包时,会从休眠状态中恢复,准备进行数据传输。
- 周期性传输调度: SOF 包的周期性发送为 USB 设备提供了固定的时间基准,使得设备可以根据 SOF 包来安排周期性的数据传输。
- 错误检测: SOF 包中的 CRC 校验可以帮助检测数据传输过程中的错误。如果设备收到的 SOF 包校验失败,则可以判定数据传输可能存在问题。
(2)SOF包的发送:
- SOF 包由 USB 主机周期性地发送,其发送频率取决于 USB 总线的速率。
- 全速 USB 总线每毫秒发送一个 SOF 包,而高速 USB 总线每 125 微秒发送一个 SOF 包。
5.STM32 SOF包处理机制
STM32的对SOF包的处理代码如下。ISTR_SOF中断位 指示一个新的USB帧的开始,它是在SOF数据包通过USB总线到达时设置的。中断服务例程可以监视SOF事件,使其具有到USB主机的1 ms同步事件,并安全地读取在SOF数据包接收处更新的USB_FNR(USB frame number register),当发生SOF中断时,我们可以读取USB_FNR寄存器来判断帧号并且计算出当前时间或者做其他事情。
//读出的中断标志是SOF中断标志,且SOF中断使能了
if (wIstr & ISTR_SOF & wInterrupt_Mask)
{
//清除SOF中断标志
_SetISTR((uint16_t)CLR_SOF);
//统计共接收到多少SOF
bIntPackSOF++;
//当定义了SOF_CALLBACK,则调用SOF_Callback,
//像钩子函数一样,在发生SOF中断时做点什么
#ifdef SOF_CALLBACK
SOF_Callback();
#endif
}
标签:20,USB,SOF,中断,总线,发送,数据包
From: https://www.cnblogs.com/linhaostudy/p/18503782