Hi 各位大神, 项目上使用 STM32F405的芯片,并且通过虚拟串口, VCP与主机进行通讯。 开发上,直接基于stm32_f105-07_f2_f4_usb-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 |
stm32 USB的CDC类传输掉数据
STM32F105 USB接收数据不断进入中断,出现“死机”现象
关于STM32CubeMX配置的USB例程电脑无法识别问题
STM32F407 USB-HS-OTG是否不外接PHY可以做虚拟串口?
如何做一个USB从机键盘用stm32f407
用STM32F4 Cube MX生成的USB Device C代码的BUG
USB Device + FatFS + SDIO 模拟U盘意外只读问题
USB Device + FatFS + SDIO 问题
STM32H7配置成USB DEVICE时,连接电脑时不进入中断
STM32F446 USB和串口1 冲突
中断中调用的处理函数也就是下面的结构体中的一个函数:
也就下面的函数,在这个函数中做个标记可以用于指示上一次数据已经传送完成。
由于需要通过vcp发送的数据量很大,不是通过uart进来了。而且对速度要求比较高。
在stm32f103上,使用usb_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上,想使用高速usb,有没有类似的实现方法?
/Jaret
非常感谢你的回答。
我改成这样实现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
非常感谢Creep。问题解决。