一,试用介绍
GD32F427RK支持USBFS和USBHS。我试用的是USBFS功能,所以在此只关注FS相关特性。
GD32F427RK USBFS不仅提供了主机模式和设备模式,也提供了遵循HNP(主机协商协议)和SRP(会话请求协议)的OTG模式。 USBFS包含了一个内部的全速USB PHY,并且不再需要外部PHY芯片。 USBFS可提供USB2.0协议所定义的所有四种传输方式(控制传输、批量传输、中断传输和同步传输)。结构框图如下所示:
二,试用过程
USB设备模式,相关寄存器操作流程如下:
全局寄存器初始化顺序:
1、 根据应用的需求,如Tx FIFO的空阈值等,设置寄存器USBFS\\_GAHBCS,此时, GINTEN位需要保持清零状态。
2、 根据应用的需求,如操作模式(主机、设备或OTG)、某些OTG参数、 USB协议,设置寄存器USBFS\\_GUSBCS。
3、 根据应用的需求,设置寄存器USBFS\\_GCCFG。
4、 根据应用的需求,设置寄存器USBFS\\_GRFLEN、USBFS\\_HNPTFLEN\\_DIEP0TFLEN、USBFS\\_HPTFLEN,配置数据FIFO。
5、 通过设置寄存器USBFS\\_GINTEN使能模式错误、挂起、 SOF、枚举完成和USB复位中断,置位USBFS\\_GAHBCS寄存器的GINTEN位使能全局中断。
6、 根据应用的需求,如设备的地址和设备的速度等,设置寄存USBFS\\_DCFG。
7、 在设备连接上主机上后,主机在USB总线上执行端口复位,触发寄存器USBFS\\_GINTF的RST中断。
8、 等待寄存器USBFS\\_GINTF的ENUMF中断。
端点初始化和使能顺序:
1、 根 据 预 期 的 传 输 类 型 、 包 大 小 等 信 息 , 设 置 寄 存 器 USBFS\\_DIEPnCTL 或USBFS\\_DOEPxCTL。
2、 设定寄存器 USBFS\\_DIEPINTEN 或 USBFS\\_DOEPINTEN,置位相应中断使能位。
3、 设定寄存器USBFS\\_DIEPxLEN或USBFS\\_DOEPxLEN, PCNT表示一次传输中的包数,TLEN 表示一次传输中发送或接收的数据包的总字节数。
4、 对于 IN 端点,如果 PCNT 等于 1,单数据包的大小等于 TLEN。 如果 PCNT 大于 1,前PCNT-1 个包被认定为最大包长度的包,其大小是由寄存器 USBFS\\_DIEPxCTL 的位 MPL所定义。最后一包的大小可通过 PCNT、 TLEN 和 MPL 计算得到。如果程序想要发出一个零长度的包,应该设定 TLEN 为 0, PCNT 位 1。
5、 对于 OUT 端点,因为在 IN 事务结束之前,程序不知道实际接收的数据大小,程序可将TLEN 设定为 Rx FIFO 所支持的最大值。
6、 置位 USBFS\\_DIEPxCTL 或 USBFS\\_DOEPxCTL 寄存器 EPEN 位使能端点。
端点除能顺序:
当USBFS\\_DIEPnCTL或USBFS\\_DOEPnCTL寄存器的EPEN位被清除时,程序可以在任何时候除能端点。
IN传输操作顺序:
1、 初始化USBFS全局寄存器。
2、 初始化和使能IN端点。
3、 将数据包写入端点的Tx FIFO,每当包数据写入FIFO, USBFS减少USBFS\\_DIEPxLEN寄存器的TLEN域的数值,其减少的数值等于已写的包数据大小。
4、 当IN令牌接收后, USBFS发送数据包,在USB总线上的事务完成后, USBFS\\_DIEPxLEN寄存器的PCNT值减1。如果事务成功完成(接收到ACK握手包), ACK标志被触发,或者,其他状态标志表示事务的结果。
5、 在一次传输的所有数据包都被成功发送, USBFS生成一个TF标志位表明传输成功结束,除能相应IN端点。
OUT传输操作顺序:
1、 初始化USBFS全局寄存器。
2、 初始化和使能端点。
3、 当OUT令牌接收后, USBFS接收包数据或基于Rx FIFO状态和寄存器配置回复NAK握手包。如果事务成功完成(USBFS接收并保存数据到Rx FIFO,发送ACK握手包),USBFS_DOEPxLEN寄存器的PCNT值减1。如果事务成功完成(接收到ACK握手包),ACK标志被触发,或者,其他状态标志表示事务的结果。
4、 在一次传输的所有数据包都被成功接收, USBFS将TF状态条目压入Rx FIFO的最后的数据包的顶部,这样,软件在读取所有接收的包数据后,再读取TF状态条目。 USBFS生成TF标志来指示传输成功结束。 USBFS生成一个TF标志位表明传输成功结束,除能相应OUT端点。
打开GD32F4xx_Firmware_Library_V3.0.2路径\Examples\USB\USB_Device\standard_hid_keyboard\EWARM的工程,将device改为gd32f427rk。然后代码如下:
USB相关初始化操作:
hid——keyboard相关设置更改如下:
hid——keyboard的检测按键发送的代码做如下修改:
屏蔽掉427板子上没有的按键。
然后将代码编译烧录进开发板。
三,试用展示
PC端将记事本打开,然后按K1按键,可以看到,记事本上面有输入b。(相当于键盘的b键)
~~~~