Edit online

Device 接收和发送控制

3 Mar 2025
Read time: 1 minute(s)

接收控制

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

  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 的起始地址即可。

发送控制

注: n = 1/ 2
控制类型端点的发送流程,即 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 时所对应的奇/偶帧。