|
哈哈~~~搞定了,的确是缓冲区重叠的问题...
STM32的USB端点缓冲不是固定的,由寄存器设置。 而我的程序中,是如下定义的,端点大小为0x40,端点2做为输出端点, 0xD8+0x40=0x118,也就是说,端点1缓冲前24个字节重叠,被输出数据覆盖了。 /* EP1 */ /* tx buffer base address */ #define ENDP1_TXADDR (0x100) /* EP2 */ /* Rx buffer base address */ #define ENDP2_RXADDR (0xD8)
将端点1的发送地址设置为0x98即可解决此问题。 /* EP1 */ /* tx buffer base address */ #define ENDP1_TXADDR (0x98)
至于端点1,的确也是可以做为输出的,程序做如下修改: 端点2接收地址改成端点1接收: /* EP1 */ /* Rx buffer base address */ #define ENDP1_RXADDR (0xD8)
然后在端点描述符中,将原来的端点输出2,改为端点输出1: 0x01, /*bEndpointAddress: Endpoint Address (OUT endp 1)*/
原来的端点2初始化改为初始化端点1: /* Initialize Endpoint 1 */ // SetEPType(ENDP1, EP_INTERRUPT); SetEPRxAddr(ENDP1, ENDP1_RXADDR); SetEPRxCount(ENDP1, 64); // SetEPTxStatus(ENDP1, EP_TX_DIS); SetEPRxStatus(ENDP1, EP_RX_VALID);
将原来的端点2回调函数改成端点1回调: /******************************************************************************* * Function Name : EP1_OUT_Callback. * Description : EP1 OUT Callback Routine. * Input : None. * Output : None. * Return : None. *******************************************************************************/ void EP1_OUT_Callback(void) { u8 DataLen; DataLen = GetEPRxCount(ENDP1); PMAToUserBufferCopy(OutBuffer, ENDP1_RXADDR, DataLen); SetEPRxValid(ENDP1); }
头文件usb_conf.h中修改: //#define EP1_OUT_Callback NOP_Process void EP1_OUT_Callback(void); #define EP2_OUT_Callback NOP_Process
然后重新编译之,就可以用端点1啦。谢谢8楼的提示。 |
|