基于STM32 Datasheet (RM0008)上USB部分的Block Diagram谈谈个人的理解:
Block Diagram常见于MCU厂商官方提供的Datasheet中,用功能模块的方式描述外设的大致实现方式,以此让固件开发者了解外设硬件层的结构和到固件软件层的编程接口,简单地来说就是读写各个外设寄存器所能实现的功能。
USB模块的实现需要遵循USB协会制定的USB协议(USB2.0/3.0等),协议从USB接口的机械结构到USB的设备驱动均有定义,而固件开发主要关心内容有以下几个方面(由下到上),
1. MCU上USB模块的寄存器接口、内存映射。
2. 将数据包分发到对应的Endpoint或从对应的Endpoint接受数据包。
3. 将收发过程封装成函数供固件中的上层应用使用。
接下来先让我们来看看USB部分的Block Diagram(上面的大方框中)中各个模块的功能:
Analog transceiver
模拟信号收发器,接受数据包时将线路中的差分模拟信号转为数字信号供SIE使用,发送时反之。
SIE
Serial Interface Engine,使用USB2.0 Full-speed所需的48MHz时钟,需要与Packet Buffer Interface指定的专用数据包缓冲区交互。主要负责以下几方面的事务,
1. SYNC包识别、位填充、CRC生成/检查、PID确认/生成以及HANDSHAKE包评估。
2. 生成有关USB外设事件的信号(用于生成中断),比如SOF、USB_Reset和数据错误等。
3. 生成有关Endpoint事件的信号(用于生成中断),比如包发送/接受成功等。
Packet Buffer Interface
管理用于实现一系列收发buffer的local memory,
1. 根据SIE发来的请求选择正确的buffer并把数据放到Endpoint寄存器指向的地址。
2. 每收发一个word(16-bit),指向的地址加2。
3. 计数收发的字节数,防止超出buffer的最大容量。
Endpoint Registers
Endpoint的类型和当前的收发状态。对于单向/单buffer的Endpoint,单个寄存器能实现两个不同的Endpoint。
总共8个寄存器,所以最多能实现16个单向/单buffer或者7个双buffer的Endpoint(由于EP0只能为单buffer)。
Control Registers
USB外设的整体状态,比如重启和下电等。
Interrupt Registers
各种中断位。
接下来是与USB部分交互的APB1 Interface的Block Diagram(下面的大方框中)中各模块的功能:
Packet Buffer Memory
大小为512 byte,以256个16-bit word的形式组织,能够被应用程序访问。
Arbiter
仲裁器,同时接受来自USB外设和APB1总线的local memory访问请求,将时钟的前半个周期给APB1总线,后半个周期给USB外设。
Register Mapper
寄存器映射,收集USB外设中各种byte宽和bit宽的寄存器,用16-bit宽的word形式组织起来,来给APB1寻址。
APB1 Wrapper
为APB1访问内存和寄存器的接口,也将USB外设映射到APB1的地址空间。
Interrupt Mapper
收集USB外设发出的signal,将它们映射到NVIC的3种不同的中断线上,
1. USB低优先级中断(Channel 20),比如包发送/接受成功、USB_Reset等。
2. USB高优先级中断(Channel 19),只适用于同步传输和双buffer块传输模式中的发送/接受成功。
3. USB唤醒中断(Channel 42),USB挂起模式的wakeup事件。