完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
Hi 各位大神,
项目上使用 STM32F405的芯片,并且通过虚拟串口, VCP与主机进行通讯。 开发上,直接基于stm32_f105-07_f2_f4_u***-host-device_lib进行修改。 ARM向主机发送数据的时候,直接调用的了DCD_EP_Tx。由于数据量比较大,经常发生上次数据还未发送完成,就被新数据覆盖的问题。 不知使用DCD_EP_Tx时候,有没有什么条件可以判断是否可以调用DCD_EP_Tx,以保证这次数据不会覆盖上次数据。 目前我的实现方式,但是不能满足要求。 void USB_send_packet(uint8_t * buf, uint16_t len) { int i = 0; while(DCD_GetTxFifoStatus(&USB_OTG_dev, CDC_IN_EP & 0x7F) < 128); // 判断EP1 剩余的FIFO长度大于512 byte while(g_tx_completed == 0); // EP1 TX FIFO EMPTY中断里面 设置为1 __disable_irq; g_tx_completed = 0; __enable_irq; memset(ep_in_buf, 0, sizeof(ep_in_buf)); // ep_in_buf为长度固定为512的一个全局数组 memcpy(ep_in_buf, buf, len); DCD_EP_Tx(&USB_OTG_dev, CDC_IN_EP, ep_in_buf, len); // len 固定为 512 } 非常感谢, /Jaret |
|
相关推荐
9个回答
|
|
由于需要通过vcp发送的数据量很大,不是通过uart进来了。而且对速度要求比较高。
在stm32f103上,使用u***_sil.c可以这样实现 if (GetEPTxStatus(ENDP1) == EP_TX_NAK) { USB_SIL_Write(EP1_IN, InReport, 64); SetEPTxCount((EP1_IN & 0x7F), 64); SetEPTxValid(ENDP1); return 1; } 切换到stm32f405上,想使用高速u***,有没有类似的实现方法? /Jaret |
|
|
|
Hi Creep,
非常感谢你的回答。 我改成这样实现EP1中断处理函数函数。但貌似数据还是会出现覆盖的情况。顺便说一下,我编译的时候,采用了USB_OTG_HS_DEDICATED_EP1_ENABLED uint8_t g_tx_completed = 1; uint32_t USBD_OTG_EP1IN_ISR_Handler (USB_OTG_CORE_HANDLE *pdev) { USB_OTG_DIEPINTn_TypeDef diepint; uint32_t fifoemptymsk, msk, emp; msk = USB_OTG_READ_REG32(&pdev->regs.DREGS->DINEP1MSK); emp = USB_OTG_READ_REG32(&pdev->regs.DREGS->DIEPEMPMSK); msk |= ((emp >> 1 ) & 0x1) << 7; diepint.d32 = USB_OTG_READ_REG32(&pdev->regs.INEP_REGS[1]->DIEPINT) & msk; if ( diepint.b.xfercompl ) { fifoemptymsk = 0x1 << 1; USB_OTG_MODIFY_REG32(&pdev->regs.DREGS->DIEPEMPMSK, fifoemptymsk, 0); CLEAR_IN_EP_INTR(1, xfercompl); /* TX COMPLETE */ g_tx_completed = 1; //USBD_DCD_INT_fops->DataInStage(pdev , 1); } if ( diepint.b.epdisabled ) { CLEAR_IN_EP_INTR(1, epdisabled); } if ( diepint.b.timeout ) { CLEAR_IN_EP_INTR(1, timeout); } if (diepint.b.intktxfemp) { CLEAR_IN_EP_INTR(1, intktxfemp); } if (diepint.b.inepnakeff) { CLEAR_IN_EP_INTR(1, inepnakeff); } if (diepint.b.emptyintr) { DCD_WriteEmptyTxFifo(pdev , 1); CLEAR_IN_EP_INTR(1, emptyintr); } return 1; } 想请教一下,这个传输完成中断 是指传完一帧数据 (USB高速为512 Byte),还是指TX FIFO里面的数据全部传完啊? 我在调试的时候,曾经试着在TX complete里面设置断点,然后在bus hound里面看什么时候才接收完一帧数据。发现TX complete中断要进很多次,bus hound上才能看到接收完一帧数据。 /Jaret |
|
|
|
|
|
求关注
|
|
|
|
|
|
|
|
不懂,帮顶
|
|
|
|
顶一下
|
|
|
|
你好楼主!我在这个帖子(http://www.stmcu.org/module/forum/thread-603430-1-1.html)看到你的问题。觉得和我现在遇到的问题有点相似。我现在是在校学生。目前做的项目是在stm32f405rgt6上做一个u***虚拟串口。我想请问您是怎么根据stm32_f105-07_f2_f4_u***-host-device_lib进行修改的……我是stm32的新手。。您介意给我看看您的代码吗?万分感谢!
|
|
|
|
帮顶~~~~~~~~~~ ~~~~~~
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1619 浏览 1 评论
1356 浏览 1 评论
MCU友好过渡MPU,米尔基于STM32MP135开发板裸机开发应用笔记
673 浏览 0 评论
自定义系统时钟频率后,用库函数和微带两种方式点亮LED灯,为什么灯的闪烁频率不一致?
1850 浏览 2 评论
2102 浏览 2 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-5-5 10:03 , Processed in 0.574477 second(s), Total 76, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号