hqw 发表于 2019-1-14 18:25:43

USB EP2没写对应的接收函数,但为什有能接收到PC发的数据?

请教下大家,用USB调试助手来调试USB所遇到的困惑。问题如下面截图;

在程序只找到一个MCU接收PC所发数据的函数(如下)。但这是EP1的,而非EP2的。但在调试时,确发现PC通过EP2下发的数据,mcu却能收得到。(因为在在程序里,是有EP2对PC发送数据的函数的)
void EP1_OUT_Callback(void){      #ifndef STM32F10X_CL      PMAToUserBufferCopy(USB_Receive_Buffer, ENDP1_RXADDR, REPORT_COUNT);          SetEPRxStatus(ENDP1, EP_RX_VALID);         USB_Received_Flag=1;      #else                   // USB_SIL_Read(EP1_OUT,USB_Receive_Buffer);                   // USB_Received_Flag=1;      #endif}

程序是有EP2对PC的发送数据函数。但没找得到EP2接收PC所发数据的函数。uint32_t USB_SendData(uint8_t *data,uint32_t dataNum){      #ifndef STM32F10X_CL      //数据通过USB送出去      UserToPMABufferCopy(data, ENDP2_TXADDR, dataNum);      SetEPTxCount(ENDP2, REPORT_COUNT);      SetEPTxValid(ENDP2);      #else      USB_SIL_Write(EP2_IN, data, dataNum);      #endif      return dataNum;}
而且,看程序另一个地方的设置,#defineEP2_OUT_Callback   NOP_Process,这个也没加屏蔽,也就是 EP2接收PC所发数据的函数或功能也没使能/* CTR service routines *//* associated to defined endpoints *///#defineEP1_IN_Callback   NOP_Process//#defineEP2_IN_Callback   NOP_Process#defineEP3_IN_Callback   NOP_Process#defineEP4_IN_Callback   NOP_Process#defineEP5_IN_Callback   NOP_Process#defineEP6_IN_Callback   NOP_Process#defineEP7_IN_Callback   NOP_Process
//#defineEP1_OUT_Callback   NOP_Process#defineEP2_OUT_Callback   NOP_Process#defineEP3_OUT_Callback   NOP_Process#defineEP4_OUT_Callback   NOP_Process#defineEP5_OUT_Callback   NOP_Process#defineEP6_OUT_Callback   NOP_Process
#defineEP7_OUT_Callback   NOP_Process
请高手们分析下,谢谢

斜阳__ 发表于 2019-1-15 13:13:20

MC端点1收到数据,修改标志


读取数据,并发送



通过端点2发送出去



所以你端点2能发出数据。至于端点2能收到数据,不知道你怎么判断的


731260702 发表于 2019-1-16 10:00:45

在EP2的接收缓冲区中打一个数据断点,到了断点的时候看代码,是哪里的代码把数据写入了EP2的接收缓冲,个人观点:lol

hqw 发表于 2019-1-16 10:02:36

斜阳__ 发表于 2019-1-15 13:13
MC端点1收到数据,修改标志




EP2能发送接收到的数据给到PC,这个流程我是请楚的。我就是弄不清,调试助手是通过EP2向MCU来发送数据,而我在例程里根本是没找到EP2的接收函数(EP1的接收函数倒是有的)。这个是买开发板送的例程,不是我自己写的。

而且从下面例程的设定来看,EP2的接收(这里的接收是指接收PC发的数据)压根就没打开,红体字所示。难道说,调试助手上PC通过EP2向MCU来发送数据,MCU其实是通过EP1来接收的吗?
/* EP1*/
/* tx buffer base address */
//地址为32位对其,位4的倍数,不能超过 bMaxPacketSize

#define ENDP1_RXADDR      (0x98)
#define ENDP1_TXADDR      (0xD8)
//EP2
//#define ENDP2_RXADDR      (0x118)
#define ENDP2_TXADDR      (0x118)

/* CTR service routines */
/* associated to defined endpoints */
//#defineEP1_IN_Callback   NOP_Process
//#defineEP2_IN_Callback   NOP_Process
#defineEP3_IN_Callback   NOP_Process
#defineEP4_IN_Callback   NOP_Process
#defineEP5_IN_Callback   NOP_Process
#defineEP6_IN_Callback   NOP_Process
#defineEP7_IN_Callback   NOP_Process

//#defineEP1_OUT_Callback   NOP_Process
#defineEP2_OUT_Callback   NOP_Process
#defineEP3_OUT_Callback   NOP_Process
#defineEP4_OUT_Callback   NOP_Process
#defineEP5_OUT_Callback   NOP_Process
#defineEP6_OUT_Callback   NOP_Process
#defineEP7_OUT_Callback   NOP_Process


Kevin201707 发表于 2019-1-16 10:10:48

应该是buf被写入了,不是收到的数据吧?

hqw 发表于 2019-1-16 14:32:25

Kevin201707 发表于 2019-1-16 10:10
应该是buf被写入了,不是收到的数据吧?

在程序里,你找得到BUF被写入的内容吗?我每次连上USB,调试助手上,EP2接收区的数据是和发送区一致的,不过,若此后再改变发送区的数据,EP2接收区的数据就还是原来的,不会跟着发送区的数据而变化

yue_viper 发表于 2019-1-16 16:13:59

EP1怎么不能发送数据

hihi22 发表于 2019-1-24 13:36:34

只要描述符里有EP2out端点,上位机软件就能发送数据出去,至于MCU接受,可以看接收中断是如何执行的。

天臆弄人 发表于 2019-1-24 14:04:39

这是上位机问题,包括我自己写的HID 上位机也有这问题,都是直接调用调底的write,read 所以,,,
页: [1]
查看完整版本: USB EP2没写对应的接收函数,但为什有能接收到PC发的数据?