×
单片机 > 单片机程序设计 > 详情

STM32的USB通信资料

发布时间:2020-05-22 发布时间:
|

以下资料由网上收集
usb的传输字节问题(来自computer00) 
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啦。


关键字:STM32  USB通信 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
Keil(MDK-ARM)系列教程(七)_菜单