[RISC-V MCU 应用开发]

USBFS—关于CH32系列USBFS的上传和接收机制

[复制链接]
683|27
手机看帖
扫描二维码
随时随地手机跟帖
Goodch|  楼主 | 2024-1-16 14:51 | 显示全部楼层 |阅读模式
来源:https://www.cnblogs.com/wchmcu/p/17913838.html
以V30x USBFS的CDC模拟串口为例,讲解通用的上下传机制,和注意事项
USB初始化:
5910565a6265cec002.png
USBFS_RCC_Init是USB时钟配置
USBFS_Device_Init是USB设备初始化,其中有一个USBFS_Device_Endp_Init端点初始化
7509165a6267b61381.png
配置了端点使能,设置DMA地址,长度、控制寄存器。
注意事项:
1.  关于DMA地址,FS的IN和OUT缓冲区是连在一起的,如果同时使能了某个端点的TX和RX,需要注意只有一个DMA地址,前64字节是OUT,后64字节是IN。这里是V20X、V30X的USBFS的,其它要看对应的RM手册,各有不同。
2.  USBFS_Endp_Busy端点标志位清零,有些例程中没有,需要加上。
5575565a6269bd0ac5.png

发送:
7559565a626b780ec9.png
先判断busy标志位是否忙,装载数据、设置长度、设置ACK,busy标志位置1

发送完成中断
2041565a626e054d62.png
翻转toggle,设置NAK,busy标志位清零

接收:
239565a62708ac52b.png
OUT完成中断,初始化的时候,设置的ACK,所以OUT数据来时,会进入OUT完成中断,翻转toggle,读取数据,然后还可以控制是否NAK,一般默认保持ACK。
注意:
  • 在中断里,没有清标志位之前,一直保持NAK,所以不用担心在中断里处理时,来了下一包数据的情况。
  • 当RX设置了NAK,处理完,需要重新开启接收的时候,设置ACK即可。
  • memcpy会占用时间,对速度有要求的,可以像例程中那样,直接改DMA地址。
  • 一般不加打印,此处只为了演示。
完整代码:V307_USBFS_CDC
其它:中断临界保护
中断抢占机制:没有配置NVIC的抢占优先级的话,默认是0,比如USB中断,默认是最高优先级。
临界保护:当有变量在主函数或多个中断里都有修改时,并且是++、--、与或操作等这种底层汇编是读-改-写的流程,需要加临界保护,先关闭中断,操作完在打开中断,__disable_irq是全局的中断,也可以改成某个指定的中断NVIC_DisableIRQ,执行两次Disable是因为关闭中断需要4个周期左右的时间。
5683065a6273ca0c48.png
2525565a62747c53ba.png
Value++;这个的汇编大概有这3步,t0是内核的通用寄存器
  • t0=value读
  • t0=t0+1改
  • value=t0写
当在第1步之后、第3步之前被高优先级中断打断时,如果那个高优先级的中断里也对value操作,无论怎么修改,退出后,返回这里,t0依然是进入中断前的t0值,也就是高优先级中断里的操作只修改了value,但是没有办法修改t0,所以执行第三步的时候,高优先级中断里的修改就相当于没有起作用。
在关闭中断期间产生了触发中断的事件,会挂起中断标志位,使能中断后,立即进入中断,不会丢失。

使用特权

评论回复

相关帖子

elsaflower| | 2024-2-2 20:17 | 显示全部楼层
USBFS的初始化过程可能会涉及到设置USB时钟(通过USBFS_RCC_Init函数)和设备初始化(通过USBFS_Device_Init函数)

使用特权

评论回复
usysm| | 2024-2-2 20:36 | 显示全部楼层
中断传输用于实时性要求较高的数据传输,例如鼠标和键盘的数据传输。中断传输保证了数据的实时性和顺序性,中断传输包括IN(上传)和OUT(接收)方向。

使用特权

评论回复
nomomy| | 2024-2-2 21:07 | 显示全部楼层
在CH32系列微控制器中,USBFS接口通常通过中断方式处理数据传输。

使用特权

评论回复
eefas| | 2024-2-2 21:36 | 显示全部楼层
在实际编程中,开发者需要配置USB的端点,处理USB请求,并在适当的时候发送或接收数据。使用DMA可以显著提高数据处理效率。

使用特权

评论回复
juliestephen| | 2024-2-2 22:08 | 显示全部楼层
使用USBFS接口时,需要注意USBFS的工作模式和端点数的选择

使用特权

评论回复
sanfuzi| | 2024-2-3 07:43 | 显示全部楼层
在建立USBFS连接之后,可以使用USBFS接口的发送和接收功能来进行数据的发送和接收。

使用特权

评论回复
beacherblack| | 2024-2-3 08:26 | 显示全部楼层
FS的IN和OUT缓冲区是相连的,如果同时使能了某个端点的TX和RX,则需要正确配置前64字节用于OUT,后64字节用于IN。

使用特权

评论回复
kmzuaz| | 2024-2-3 17:35 | 显示全部楼层
在USB通信中,当设备需要向主机发送数据时,会通过OUT端点将数据传输给主机。CH32系列MCU中的USBFS模块提供了相应的机制来处理数据的上传。首先,MCU需要将要上传的数据准备好,并将其存储在指定的缓冲区中。然后,通过设置相应的控制寄存器来配置端点,以便将数据传输给主机。一旦端点被配置好,MCU就可以通过检查控制寄存器和状态寄存器来等待主机请求数据的传输。当主机请求数据时,MCU将数据从缓冲区中读取并通过OUT端点发送给主机。

使用特权

评论回复
ulystronglll| | 2024-2-3 18:36 | 显示全部楼层
在中断服务程序中,会检查busy标志位,若非忙则装载数据、设置长度、设置ACK,并将busy标志位置为1。传输完成后,需要翻转toggle位,并根据需要控制是否发送NAK。

使用特权

评论回复
loutin| | 2024-2-3 20:10 | 显示全部楼层
通过file_operations结构体定义了USB设备文件的操作函数,如read、write、ioctl等。

使用特权

评论回复
hudi008| | 2024-2-3 20:36 | 显示全部楼层
设备想要向主机发送数据时,先将数据写入到一个已配置为OUT方向的端点缓冲区。
应用程序通过调用USB库函数通知USB控制器数据已准备好,等待主机拉取数据。
主机检测到设备端数据准备就绪,从设备的OUT端点读取数据。

使用特权

评论回复
alvpeg| | 2024-2-3 21:35 | 显示全部楼层
等时传输用于同步数据的传输,例如音频和视频流。等时传输保证了数据的实时性和顺序性,等时传输包括IN(上传)和OUT(接收)方向。

使用特权

评论回复
dspmana| | 2024-2-3 22:37 | 显示全部楼层
CH32系列MCU一般会提供配套的USB固件库,其中包含了设置USB描述符、初始化USB控制器、配置端点、处理中断以及执行数据传输等功能函数。

使用特权

评论回复
vivilyly| | 2024-2-4 20:59 | 显示全部楼层
当主机需要向设备发送数据时,会通过IN端点将数据传输给设备。CH32系列MCU中的USBFS模块接收到数据后,会将其存储在指定的缓冲区中。然后,MCU可以通过检查控制寄存器和状态寄存器来确认数据是否已经成功接收。一旦数据被成功接收,MCU就可以对数据进行处理或进一步的操作。

使用特权

评论回复
dspmana| | 2024-2-4 22:28 | 显示全部楼层
对于上传(OUT方向)数据,当主机向设备发送数据且数据被存入端点缓冲区后,设备端的USB OUT中断将会触发,并在ISR中读取该缓冲区中的数据。

使用特权

评论回复
tifmill| | 2024-2-5 17:07 | 显示全部楼层
在某些情况下,如果使用的是轮询方式而非中断方式,则应用程序需定期检查USB控制器的状态,以判断是否有新的数据到来或是否可以发送数据。

使用特权

评论回复
51xlf| | 2024-2-5 17:39 | 显示全部楼层
在中断处理程序中,微控制器会根据收到的数据包类型和方向,调用相应的数据处理函数。这些函数负责将数据包从USB接口读取到内存,或将内存中的数据写入USB接口。在数据传输过程中,可以使用DMA(直接内存访问)控制器来提高数据传输效率。

使用特权

评论回复
earlmax| | 2024-2-5 18:09 | 显示全部楼层
在使用USBFS接口之前,需要先配置USBFS接口的相关参数,包括USBFS的工作模式、端点数等。

使用特权

评论回复
gygp| | 2024-2-5 21:42 | 显示全部楼层
控制传输用于设备和主机之间的握手和配置过程,包括设备枚举、设置接口和端点等操作。控制传输遵循特定的请求和响应格式,包括 SETUP、DATA 和 STATUS 阶段。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

16

帖子

0

粉丝