完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
我正在尝试将 VCP 功能添加到 UVC 应用程序代码中。 我的平台是CYUSB3011-BZXC
UsbUart 示例代码已添加到现有的 UVC 应用程序中。 初始化和主循环: voidCDCAppThread_Entry (uint32_t input){CyU3PReturnStatus_t apiRetStatus = CY_U3P_SUCCESS;uint32_t regValueEn = 0, regValueDs = 0;CyU3PDmaBuffer_t dmaInfo;/* Initialize the USBUART Example Application */ CyFxUSBUARTAppInit();CyU3PDmaChannelConfig_t dmaCfg;CyU3PMemSet ((uint8_t *)&dmaCfg, 0, sizeof (dmaCfg));/* Create a DMA_MANUAL channel between uart producer socket and usb consumer socket *//* Use a smaller buffer size (32 bytes) to ensure that packets get filled in a short time. */ dmaCfg.size = 32; dmaCfg.prodSckId = CY_FX_EP_PRODUCER2_SOCKET; dmaCfg.consSckId = CY_FX_EP_CONSUMER2_SOCKET; dmaCfg.notification = CY_U3P_DMA_CB_PROD_EVENT; dmaCfg.cb = CyFxUSBUARTDmaCallback; dmaCfg.count = CY_FX_USBUART_DMA_BUF_COUNT; dmaCfg.dmaMode = CY_U3P_DMA_MODE_BYTE; dmaCfg.prodHeader = 0; dmaCfg.prodFooter = 0; dmaCfg.consHeader = 0; dmaCfg.prodAvailCount = 0; apiRetStatus = CyU3PDmaChannelCreate (&glChHandleUarttoUsb,CY_U3P_DMA_TYPE_MANUAL, &dmaCfg);if (apiRetStatus != CY_U3P_SUCCESS) { CyFxAppErrorHandler(apiRetStatus); }/* Set DMA Channel transfer size */ apiRetStatus = CyU3PDmaChannelSetXfer (&glChHandleUarttoUsb, 0);if (apiRetStatus != CY_U3P_SUCCESS) { CyFxAppErrorHandler(apiRetStatus); }/* Create a DMA_AUTO channel between usb producer socket and uart consumer socket */ dmaCfg.size = 512; dmaCfg.prodSckId = CY_FX_EP_PRODUCER1_SOCKET; dmaCfg.consSckId = CY_FX_EP_CONSUMER1_SOCKET; dmaCfg.notification = 0; dmaCfg.cb = NULL; apiRetStatus = CyU3PDmaChannelCreate (&glChHandleUsbtoUart,CY_U3P_DMA_TYPE_AUTO, &dmaCfg);if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrintTime (4, "CyU3PDmaChannelCreate failed!"); CyFxAppErrorHandler(apiRetStatus); }/* Set DMA Channel transfer size */ apiRetStatus = CyU3PDmaChannelSetXfer (&glChHandleUsbtoUart, 0);if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrintTime (4, "CyU3PDmaChannelSetXfer failed!"); CyFxAppErrorHandler(apiRetStatus); } /* UART Config Value for Enabling Rx Block */ regValueEn = UART->lpp_uart_config;/* UART Config Value for Disabling the Rx Block */ regValueDs = UART->lpp_uart_config & (~(CY_U3P_LPP_UART_RTS | CY_U3P_LPP_UART_RX_ENABLE));for (;;) {if (glPktsPending == 0) {/* Disable UART Receiver Block */ UART->lpp_uart_config = regValueDs; apiRetStatus = CyU3PDmaChannelSetWrapUp (&glChHandleUarttoUsb);if (apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrintTime (4, "CyU3PDmaChannelSetWrapUp apiRetStatus: %d", apiRetStatus); }/* Enable UART Receiver Block */ UART->lpp_uart_config = regValueEn; } glPktsPending = 0; CyU3PThreadSleep (100); }} DMA中断: voidCyFxUSBUARTDmaCallback(CyU3PDmaChannel *chHandle, /* Handle to the DMA channel. */CyU3PDmaCbType_t type, /* Callback type. */CyU3PDmaCBInput_t *input) /* Callback status. */{CyU3PReturnStatus_t apiRetStatus;if (type == CY_U3P_DMA_CB_PROD_EVENT) { apiRetStatus = CyU3PDmaChannelCommitBuffer (&glChHandleUarttoUsb, input->buffer_p.count, 0);if ( apiRetStatus != CY_U3P_SUCCESS) { CyU3PDebugPrintTime (4, "CyU3PDmaChannelCommitBuffer apiRetStatus: %d", apiRetStatus); } glPktsPending++; }}[size=1 2 3 4 5 6 7]VCP 发送的所有数据均已通过 UART 成功打印,但[size=1 2 3 4 5 6 7]发送到 UART 的数据却滞留在 USB 级别的某处。 CyU3PDmaChannelCommitBuffer 和 DMA 中断成功处理,没有错误。 这种行为的原因是什么? 如何实现它? |
|
相关推荐
1个回答
|
|
|
将VCP(虚拟串口)功能集成到现有的UVC应用程序中,需要仔细处理USB复合设备配置、资源分配以及数据传输的协调。以下是分步解决方案: 1. USB复合设备描述符配置
2. 初始化顺序与资源分配
3. DMA通道配置
4. 主循环与数据传输
5. 调试与验证
常见问题解决
通过以上步骤,您应该能够在UVC应用中成功集成VCP功能。若问题仍存,请提供更详细的错误日志或描述符内容以便进一步分析。 |
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2353 浏览 0 评论
1425 浏览 0 评论
1874 浏览 0 评论
CYUSB3014烧录失败Cypress Benicia USB Boot Device
7868 浏览 1 评论
11294 浏览 0 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 16:23 , Processed in 0.780524 second(s), Total 75, Slave 57 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
3717