功能描述
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 。
中断
- 对应的中断会有中断屏蔽控制,默认屏蔽所有中断。
- 在 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 决定,默认屏蔽所有中断态。
- 在 Interrupt Level 0 的 InEP 和 OutEP 中断,分别为所有 IN 和 OUT
端点的总中断状态。
- 根据不同应用场景,选择是否使能中断信号。
- IN/ OUT 端点的中断信号存在层次结构的逻辑关系,具体可查看输入输出端点的终端结构图。
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
- 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 深度。
接收控制
所有的 OUT 端点共用 RXFIFO。所有 OUT 端点的接收方式都相同,RXFIFO 的读取基地址为 BASE_USB0 + 0x1000。接收的流程如下:
- 中断 RxFLvl 产生,指示 RXFIFO 接收了至少一个数据包。此中断状态位为只读。
- 读取 RXFIFO_STS_POP 寄存器,将接收到的数据 POP 到端点相应的 FIFO 的起始地址,即 BASE_USB0 +
0x1000。
其他非接收数据操作时,不允许对此寄存器进行读操作,避免造成接收数据错误。
- 通过读取 RXFIFO_STS_POP 寄存器可知接收数据的状态、接收到数据的 byte 数量、端点号、数据 PID
类型等信息。
如果接收数据的状态是接收到 OUT 数据包或 SETUP 数据包,可以读取相应端点的 FIFO 起始地址,每次读出 4 byte 数据,根据获取的 byte 总数决定读取的次数,每次读 FIFO 的起始地址即可。
发送控制
- 使能 NP_TXFIFO_EMP 中断。
- 当 NP-TXFIFO 半空或空(可通过寄存器 NP_TFTH 配置选择)时产生中断,对端点相应 FIFO
的起始地址进行写数据操作。
写的次数取决于需要发送的数据长度。每个写操作可将 4 bytes 数据写入 FIFO,每次只需对 FIFO 的起始地址 BASE_USB0 + 0x1000 写即可。
- 完成数据的写入后,屏蔽 NP_TXFIFO_EMP 中断,以备下一次数据发送。
Bulk 类型端点的发送流程如下:
- 初始化时,需对此端点的 RX_INTOKEN_EMPTY_INT 中断使能,即对应的端点收到 IN Token 后则产生中断。
- 当 ITTXFE 中断到来,对端点相应的 FIFO 的起始地址进行写数据,写的次数取决于需要发送的数据长度。每个写操作可将 4 byte 数据写入 FIFO,每次只需对 FIFO 的起始地址 BASE_USB0 + 0x1000 * (n+1) 写即可。
- 完成数据的写入后,对 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 时所对应的奇/偶帧。