Fork me on GitHub

USB协议详解第20讲(USB包-帧首包SOF)

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包的主要作用:

  1. 帧同步: SOF 包作为帧的起始标记,使得所有的 USB 设备能够同步到同一个时间基准上。通过 SOF 包,所有设备可以准确地知道当前处于哪个帧,从而实现同步通信。
  2. 时钟同步: SOF 包的周期性发送有助于 USB 设备保持内部时钟的准确性。设备可以通过检测 SOF 包的到来来调整自己的时钟,保证系统时钟的同步。
  3. 唤醒设备: SOF 包可以用来唤醒处于低功耗状态的 USB 设备。当设备检测到 SOF 包时,会从休眠状态中恢复,准备进行数据传输。
  4. 周期性传输调度: SOF 包的周期性发送为 USB 设备提供了固定的时间基准,使得设备可以根据 SOF 包来安排周期性的数据传输。
  5. 错误检测: 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
}
posted @ 2024-10-26 11:06  yooooooo  阅读(2)  评论(0编辑  收藏  举报