STM32的USB通信资料

以下资料由网上收集
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啦。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值