STM32
直播中

刘辉

7年用户 1089经验值
私信 关注
[问答]

需要用f4xx做usb vcp host端,请问有没有办法让host端不轮询读呢?

请教一下
我们需要用f4xx做usb vcp host端,用cubeide生成了usb host端的 virtual com port代码工程,能够正常识别插入的vcp设备,但是发现usb vcp device端发的数据,host不会主动收,
需要host端定时调用receive的函数才能收到,请问有没有办法让host端不轮询读呢?像串口中断接收那样,不是很懂usb cdc,请各位大佬帮帮忙

回帖(2)

孙洪山

2024-3-26 15:19:36
USB通信基于主从结构,所有的通信传输都是由HOST发起的。即使从设备要向主发数据,也得等主发读取命令才可以,否则HOST就没法正常接收来自从设备的数据的。所以你的代码也得按这个机制来安排。
举报

旧念

2024-3-26 18:08:20
在使用F4xx作为USB VCP Host端时,可以通过使用USB中断传输来实现中断接收数据的功能,而不需要轮询读取数据。

首先,确保你的USB Host代码中已经正确设置了USB中断传输的配置参数,包括USB中断传输的端点的设置、中断传输的大小等。

然后,在应用程序中,你需要实现USB中断传输的中断处理函数。在这个中断处理函数中,你可以使用USB层提供的API函数来接收数据。

具体步骤如下:

1. 定义一个全局的缓冲区变量,用来存储接收到的数据。例如:

```c
#define RX_BUFFER_SIZE 64
uint8_t rxBuffer[RX_BUFFER_SIZE];
```

2. 在USB中断传输的中断处理函数中,调用USB层提供的API函数来接收数据。例如:

```c
void USB_HP_IRQHandler(void)
{
    uint32_t status = USBx_HP->INTR;

    // 检查是否收到了USB中断传输的数据包
    if (status & USB_OTG_GINTSTS_RXFLVL)
    {
        // 获取接收数据包的数量
        uint32_t numPackets = (USBx_HP->RxFIFOQ[0].STS & USB_OTG_GRXSTS_PKTSTS) >> 17;

        // 循环接收每个数据包
        for (uint32_t i = 0; i < numPackets; i++)
        {
            // 获取数据包长度
            uint32_t length = (USBx_HP->RxFIFOQ[0].STS & USB_OTG_GRXSTS_BCNT) >> 4;

            // 将数据包从USB FIFO中读取到缓冲区中
            for (uint32_t j = 0; j < length; j++)
            {
                rxBuffer[j] = USBx_HP->RxFIFOQ[0].DATA;
            }

            // 处理接收到的数据,例如打印到终端
            // ...

            // 准备接收下一个数据包
            USBx_HP->GRXSTSP;
        }
    }
}
```

在这个例子中,我们定义了一个全局的rxBuffer数组来存储接收到的数据。在中断处理函数中,我们通过轮询检查接收数据包的状态,并读取数据包的长度和内容。然后,我们可以根据需要进行处理,例如打印到终端。

请注意,在使用上述方法之前,你需要确保你的USB主机硬件支持使用中断传输。另外,具体的USB中断处理函数名称和操作可能会根据你所使用的硬件和驱动库而有所不同。请参考相关的文档和代码示例来了解更详细的信息。

希望以上信息能对你有所帮助,如果你有任何进一步的问题,请随时提问。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分