17666|24

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

usb的传输字节问题 [复制链接]

                                 我需要通用HID,接收和发送 是固定长度,都是64字节,stm32的usb库文件可以实现吗?怎么改动?
此帖出自stm32/stm8论坛

最新回复

                                 改过后通过端点1发送数据没有问题,但是我发现端点2好型不能正常收到数据啊,不明白怎么回事const u8 CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =  {        0x05, 0xFF,            /* USAGE_PAGE (User Define)           */                       0x09, 0xFF,            /* USAGE (User Define )               */        0xa1, 0x01,            /* COLLECTION (Application)       */                /* 6 */    /*in*/        0x05, 0x01,                    // USAGE_PAGE(1)    0x19, 0x00,                    //   USAGE_MINIMUM(0)    0x29, 0xFF,                    //   USAGE_MAXIMUM(255)    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)    0x25, 0xFF,                    //   LOGICAL_MAXIMUM (255)    0x75, 0x08,                    //   REPORT_SIZE (8)    0x95, 0x40,                    //   REPORT_COUNT (64)    0x81, 0x02,                    //   INPUT (Data,Var,Abs)    /*22*/    /*out*/    0x05, 0x02,                    // USAGE_PAGE(2)    0x19, 0x00,                    //   USAGE_MINIMUM (0)    0x29, 0xFF,                    //   USAGE_MAXIMUM (255)    0x15, 0x00,                    //   LOGICAL_MINIMUM (0)    0x25, 0xFF,                    //   LOGICAL_MAXIMUM (255)    0x75, 0x08,                    //   REPORT_SIZE (8)    0x95, 0x40,                    //   REPORT_COUNT (64)    0x91, 0x02,                    //   OUTPUT (Data,Var,Abs)    /* 38 */    0xc0               /*     END_COLLECTION                 */  }; /* CustomHID_ReportDescriptor */   详情 回复 发表于 2009-5-21 20:41
点赞 关注
 

回复
举报

64

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

请参考Joystick例程

                                 参考函数Joystick_Send()相关的程序,同时要修改HID描述符。
此帖出自stm32/stm8论坛
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

香版主


你还没说怎么改呀,关注中!
此帖出自stm32/stm8论坛
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

4
 

修改HID描述符,修改函数Joystick_Send()相关的程序

                                 打开程序看看就知道了。
此帖出自stm32/stm8论坛
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

5
 

哈哈~~~我来改一个玩玩~~~

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 

computer00

                                 谢谢你!  期待你改的结果! 
此帖出自stm32/stm8论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 

它的端点也像D12那样有端点1输入和端点1输出的

                                 应该可以实现同样的效果
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

8
 

圈圈太强了

                                 8楼说得对。
此帖出自stm32/stm8论坛
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

9
 

谢谢圈圈

 不过你的例子,在PC机周期发送数据的情况下 , STM32的USB发送数据到PC
有时会有错误,前10几个字节会在某次发送时,被清零。  出现的地方不是很规律,我找不到原因。


用另一个Keil的例子,就没事,不知为何?
此帖出自stm32/stm8论坛
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

10
 

看来这个端点1问题我还得去查下数据手册...

就是说,端点1同时有输入和输出两个端点吧?

10楼所说的问题,可能是我的缓冲区地址没设置对,因为我没有细看里面的缓冲地址如何设置,
可能是两个缓冲区重叠了??我只改了一些表面的东西,没有深入。你自己再仔细找找原因吧。

找个空我把数据手册好好看看,上次看了一部分又停下来了,晕。
此帖出自stm32/stm8论坛
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 

哈哈~~~搞定了,的确是缓冲区重叠的问题...

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楼的提示。
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

12
 

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

13
 

十分感谢:圈圈


实验通过,谢谢圈圈的资料,十分感谢!
此帖出自stm32/stm8论坛
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(初级)

14
 

顶圈圈,优秀帖子!

                                 顶圈圈,优秀帖子!
此帖出自stm32/stm8论坛
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

15
 

优秀贴给裤子

                                   我也想试一下USB功能,硬件要怎么接?USB发送数据到PC,在哪可以看到数据?
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

16
 

硬件?直接用万利的开发板。楼主倒是不见了,哈哈~~~~

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

86

帖子

0

TA的资源

一粒金砂(初级)

17
 

USB


例子修改管脚配置,英蓓特的也能用!
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

18
 

ding OO

                                 这帖子不能沉,呵呵!
此帖出自stm32/stm8论坛
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

19
 

ding OO

                                 不让沉!
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

20
 

ding OO

                                 不让沉!   呵呵!   没人这么用吗?
此帖出自stm32/stm8论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
有奖直播:当AI遇见仿真,会有什么样的电子行业革新之路?
首场直播:Simcenter AI 赋能电子行业研发创新
直播时间:04月15日14:00-14:50

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网 5

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表