访问电脑版页面

导航:老古开发网手机版STM32单片机的USB

STM32的USB通信资料

导读:以下资料由网上收集usb的传输字节问题(来自computer00)STM32的USB端点缓冲不是固定的,由寄存器设置。而我的程序中,是如下定义的,端点大小为0x40,端点2做为输出端点,0xD8+0x40=0x118,也就是说,端点1缓冲前2
关键字:
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啦。


来源:互联网   作者:karen  2018/7/9 18:00:01
栏目: [ STM32单片机的USB]

相关阅读

STM32单片机USB速度慢的原因解析

基于STM32 HID例程生成不小于64字节传输的移植过程

聊聊STM32芯片的DFU编程及相关话题

STM32F4 Discovery USB HID 用到的文件图解

STM32F205双USB开发做device

STM32 keyboard USB键盘功能的实现

STM32单片机的usb上电和断电函数的定义

基于STM32的传统USB 2.0接口到Type-C的转换方案

基于STM32单片机的USB时钟配置设计

STM32F107 USB作为device的插拔检测

STM32的USB通信资料

STM32F105系列单片机对USB设备电路的设计

STM32F107系列单片机USB通信的用法解析

STM32F107 之USB通信

STM32 USB设计 单片机程序篇