Edit online

功能描述

18 Sep 2024
Read time: 4 minute(s)

PHY 接口选择

USB Device 模块支持 UTMI 接口,UTMI 接口对应的采用内部 PHY0。UTMI 接口的相关配置采用默认值即可,无需配置。

FS/ HS 设备选择

USB Device 模块支持作为 FS 或 HS 设备,通过寄存器 USB_DEV_SPD_SET 进行配置,默认值为 HS 设备。

需在初始化完成后才能配置设备选项,配置后控制器会自动通过 PHY 配置相应的端接电阻。

枚举地址设置

在 USB 的枚举过程,USB Host 会通过 Set Address 命令对 USB Device 的地址进行枚举,枚举地址需写入 USB_DEV_ADDR 。

中断

USB Device 模块支持中断:
  • 对应的中断会有中断屏蔽控制,默认屏蔽所有中断。
    • 在 Interrupt Level 0 的 InEP 和 OutEP 中断,分别为所有 IN 和 OUT 端点的总中断状态。

      此位不能写 1 清除,如需清除此位,必须先清除所有端点产生的中断态。

    • Interrupt Level 1 是 InEP 和 OutEP 的下一层次逻辑,分别是 InEP0/ InEP1/ …/ InEP4 和 OutEP0/ OutEP1/ …/ OutEP4,表示各个端点的总中断态。默认屏蔽所有端点的中断态,通过屏蔽寄存器来使能某个端点的总中断态。

      此层的中断不能写 1 清 0,如需清除此层的中断,必须先清除下一层次的所有中断态。

    • Interrupt Level 2 是 IN/ OUT 端点的具体中断态,InEP 在此层次的中断屏蔽控制,共用一套屏蔽控制逻辑,由 INEP_INT_MSK 决定,默认屏蔽所有中断态。OutEP 在此层次的中断屏蔽控制,共用一套屏蔽控制逻辑,由 OUTEP_INT_MSK 决定,默认屏蔽所有中断态。
  • 根据不同应用场景,选择是否使能中断信号。
  • IN/ OUT 端点的中断信号存在层次结构的逻辑关系,具体可查看输入输出端点的终端结构图。


1. 输入输出端点的中断结构层次

DMA 控制

USB Device 控制器可以通过 EN_DMA,配置 FIFO 的读取方式:

  • EN_DMA = 0,默认值,通过 AHB 总线读写 FIFO 数据,需要软件介入控制读写过程。
  • EN_DMA = 1,使能 DMA,通过 DMA 读写 FIFO 数据,无需软件介入读写过程。
    • 采用使能 DMA 的方式,需注意 FIFO 的末端地址的保留,具体参见数据 FIFO 的说明。
    • 采用 DMA 读写 FIFO 数据,只需将接收/发送数据的 Buffer 地址,写入端点相应的 DMA 地址,DMA 会根据接收/ 发送数据的长度,读取 RXFIFO 的数据或者往 TXFIFO 里写入数据。

数据 FIFO

USB Device 的数据 FIFO 总深度为 4096 x 32 bits。数据 FIFO 组成如下:
  • DMA Reserved:USB Device 采用内部 DMA 读取 FIFO 数据时需要保留,即 FIFO 末端的 10 x 32 bits 的空间为 DMA 所用,不能作为其他功能的 FIFO 所用。如未采用内部 DMA,则无需保留,可用于其他功能。
  • RXFIFO:FIFO 起始位 ,为所有 OUT EP 的共用 FIFO。紧接着依次为 TXFIFO0(Control EP0 专用)、TXFIFO1、TXFIFO2 … TXFIFO14、TXFIFO15。
  • NP-TXFIFO:非周期的 TXFIFO,为所有的 Control/ Bulk 类型的 IN EP 的共用 FIFO。
  • P-TXFIFO1:周期的 TXFIFO1,Interrupt/ Isochronous 类型的 EP 对应 FIFO。无使用到此类型的 EP 可以设置该 FIFO 深度为 0。
  • P-TXFIFO2:周期的 TXFIFO2,Interrupt/ Isochronous 类型的 EP 对应 FIFO。无使用到此类型的 EP 可以设置该 FIFO 深度为 0。

通过 FIFO 对应的 FIFO 深度寄存器配置各个 FIFO 的大小,如果不需要,可配置为 0 深度。



2. 数据 FIFO 组成

接收控制

注:

所有的 OUT 端点共用 RXFIFO。所有 OUT 端点的接收方式都相同,RXFIFO 的读取基地址为 BASE_USB0 + 0x1000。接收的流程如下:

注: 如果 USB Device 模块设置为 DMA 模式,忽略以下操作,DMA 自动完成读数据操作。
  1. 中断 RxFLvl 产生,指示 RXFIFO 接收了至少一个数据包。此中断状态位为只读。
  2. 读取 RXFIFO_STS_POP 寄存器,将接收到的数据 POP 到端点相应的 FIFO 的起始地址,即 BASE_USB0 + 0x1000。

    其他非接收数据操作时,不允许对此寄存器进行读操作,避免造成接收数据错误。

  3. 通过读取 RXFIFO_STS_POP 寄存器可知接收数据的状态、接收到数据的 byte 数量、端点号、数据 PID 类型等信息。

    如果接收数据的状态是接收到 OUT 数据包或 SETUP 数据包,可以读取相应端点的 FIFO 起始地址,每次读出 4 byte 数据,根据获取的 byte 总数决定读取的次数,每次读 FIFO 的起始地址即可。

发送控制

注: 如果 USB Device 模块设置为 DMA 模式,忽略以下操作,DMA 自动完成写数据操作。
注: n = 1~15
控制类型端点的发送流程,即 IN EP0 的发送数据流程如下:
  1. 使能 NP_TXFIFO_EMP 中断。
  2. 当 NP-TXFIFO 半空或空(可通过寄存器 NP_TFTH 配置选择)时产生中断,对端点相应 FIFO 的起始地址进行写数据操作。

    写的次数取决于需要发送的数据长度。每个写操作可将 4 bytes 数据写入 FIFO,每次只需对 FIFO 的起始地址 BASE_USB0 + 0x1000 写即可。

  3. 完成数据的写入后,屏蔽 NP_TXFIFO_EMP 中断,以备下一次数据发送。

Bulk 类型端点的发送流程如下:

  1. 初始化时,需对此端点的 RX_INTOKEN_EMPTY_INT 中断使能,即对应的端点收到 IN Token 后则产生中断。
  2. 当 ITTXFE 中断到来,对端点相应的 FIFO 的起始地址进行写数据,写的次数取决于需要发送的数据长度。每个写操作可将 4 byte 数据写入 FIFO,每次只需对 FIFO 的起始地址 BASE_USB0 + 0x1000 * (n+1) 写即可。
  3. 完成数据的写入后,对 RX_INTOKEN_EMPTY_INT 中断写 1 清除中断态,完成一次写数据。

端点控制

通过寄存器 IN_EPn_CFG 以及 OUT_EPn_CFG 可对 IN/ OUT 端点进行以下的操作:

  • 使能端点 EP。
  • 设置 EP 的类型:Bulk/ Interrupt/ Iso。
  • 在当前配置下激活端点 EP。
  • 设置最大数据包大小。
  • 选择 TXFIFO 的编号,针对 EP。
  • 设置 Data0/ Data1 PID。
  • 设置 NACK。
  • 设置 STALL。
  • 设置接收或发送 Transaction 时所对应的奇/偶帧。