[应用相关] usb的传输字节问题

[复制链接]
16987|23
 楼主| jackbao 发表于 2008-6-4 17:07 | 显示全部楼层 |阅读模式
我需要通用HID,接收和发送 是固定长度,都是64字节,stm32的usb库文件可以实现吗?怎么改动?
香水城 发表于 2008-6-4 17:33 | 显示全部楼层

请参考Joystick例程

参考函数Joystick_Send()相关的程序,同时要修改HID描述符。
nomoneyiv 发表于 2008-6-4 18:20 | 显示全部楼层

香版主


你还没说怎么改呀,关注中!
香水城 发表于 2008-6-4 19:09 | 显示全部楼层

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

打开程序看看就知道了。
computer00 发表于 2008-6-4 19:28 | 显示全部楼层

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

nomoneyiv 发表于 2008-6-4 21:30 | 显示全部楼层

computer00

谢谢你!  期待你改的结果! 
starm 发表于 2008-6-5 04:10 | 显示全部楼层

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

应该可以实现同样的效果
香水城 发表于 2008-6-5 08:11 | 显示全部楼层

圈圈太强了

8楼说得对。
nomoneyiv 发表于 2008-6-5 11:06 | 显示全部楼层

谢谢圈圈

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


用另一个Keil的例子,就没事,不知为何?
computer00 发表于 2008-6-5 12:30 | 显示全部楼层

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

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

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

找个空我把数据手册好好看看,上次看了一部分又停下来了,晕。
computer00 发表于 2008-6-5 14:16 | 显示全部楼层

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

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楼的提示。
dkill 发表于 2008-6-5 14:53 | 显示全部楼层
nomoneyiv 发表于 2008-6-5 19:01 | 显示全部楼层

十分感谢:圈圈


实验通过,谢谢圈圈的资料,十分感谢!
nomoneyiv 发表于 2008-6-6 14:26 | 显示全部楼层

顶圈圈,优秀帖子!

顶圈圈,优秀帖子!
computer00 发表于 2008-6-6 16:33 | 显示全部楼层

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

nomoneyiv 发表于 2008-6-6 19:47 | 显示全部楼层

USB


例子修改管脚配置,英蓓特的也能用!
nomoneyiv 发表于 2008-6-14 18:44 | 显示全部楼层

ding OO

这帖子不能沉,呵呵!
nomoneyiv 发表于 2008-6-20 09:01 | 显示全部楼层

ding OO

不让沉!
nomoneyiv 发表于 2008-6-25 15:52 | 显示全部楼层

ding OO

不让沉!   呵呵!   没人这么用吗?
cpufan 发表于 2008-7-4 17:16 | 显示全部楼层

oo的这个例子需要安装oo自己的win平台驱动么?

微软自带的hid驱动认不出设备。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

92

主题

260

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部