ccd007 发表于 2018-2-2 08:19:50

STM32F105 USB接收数据不断进入中断,出现“死机”现象

程序不断进入USBD_OTG_ISR_Handler中断下面的DCD_HandleOutEP_ISR(pdev);   和   DCD_HandleInEP_ISR(pdev);中,不知什么原因。 此问题偶然出现,同样的数据我发送几十次甚至几百次会出现一次死机现象。不知道是不是我的接收处理问题,由于设备接收缓冲满时我会暂缓写 DCD_EP_PrepareRx(pdev, D_OUT_EP, (uint8_t*)(USB_Rx_Buffer), D_OUT_PACKET)函数,等接收缓冲有空间时才会进行DCD_EP_PrepareRx(pdev, D_OUT_EP, (uint8_t*)(USB_Rx_Buffer), D_OUT_PACKET)。不知道是不是这个原因引起的。但除了这个方法我不知怎么向发送端提示USB_BUSY,暂不接收数据的意思。谁知道我的问题出在什么地方?谢谢

随风飘扬 发表于 2018-2-2 09:55:36

这个问题没有遇到过,不过大概看了一下数据手册,发现下面两处内容


第一个说明只要有数据,就会进入中断
第二个算是一种方法吧,有数据的时候屏蔽掉中断,读取完成在打开,如果怕丢数据,则在通信协议上想想办法,比如上位机在接受到下位机继续的指令之前,不会继续发送数据

ccd007 发表于 2018-2-2 10:40:50

yu0405jie 发表于 2018-2-2 09:55
这个问题没有遇到过,不过大概看了一下数据手册,发现下面两处内容




谢谢。关闭中断我试过,但会出现丢数据的现象。DCD_EP_PrepareRx是不是代表该数据已经读出?

feixiang20 发表于 2018-2-2 11:39:10

本帖最后由 feixiang20 于 2018-2-2 11:41 编辑

ccd007 发表于 2018-2-2 10:40
谢谢。关闭中断我试过,但会出现丢数据的现象。DCD_EP_PrepareRx是不是代表该数据已经读出?
...
我偶然看到这么一句, USBD_GetRxCount 通过这个函数可以获取到DCD_EP_PrepareRx传输的数据长度DCD_EP_PrepareRx 只是把buf地址告诉otg库 数据不是立即返回 USBD_GetRxCount 读取的是上一次DCD_EP_PrepareRx 操作后 otg库拷贝到buf里的数据长度。串口清中断后下次再接收数据会不会再次进入中断。。是否对你有个帮助?

KEVIN.Z 发表于 2023-8-26 03:40:07

USB_OTG_GetEPStatus和USB_OTG_SetEPStatus不知道能否直接对端点是否忙进行控制
页: [1]
查看完整版本: STM32F105 USB接收数据不断进入中断,出现“死机”现象