打印
[应用相关]

usb的传输字节问题

[复制链接]
15592|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()相关的程序

打开程序看看就知道了。

使用特权

评论回复
5
computer00| | 2008-6-4 19:28 | 只看该作者

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

使用特权

评论回复
6
nomoneyiv| | 2008-6-4 21:30 | 只看该作者

computer00

谢谢你!  期待你改的结果! 

使用特权

评论回复
7
starm| | 2008-6-5 04:10 | 只看该作者

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

应该可以实现同样的效果

使用特权

评论回复
8
香水城| | 2008-6-5 08:11 | 只看该作者

圈圈太强了

8楼说得对。

使用特权

评论回复
9
nomoneyiv| | 2008-6-5 11:06 | 只看该作者

谢谢圈圈

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


用另一个Keil的例子,就没事,不知为何?

使用特权

评论回复
10
computer00| | 2008-6-5 12:30 | 只看该作者

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

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

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

找个空我把数据手册好好看看,上次看了一部分又停下来了,晕。

使用特权

评论回复
11
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楼的提示。

使用特权

评论回复
12
dkill| | 2008-6-5 14:53 | 只看该作者

使用特权

评论回复
13
nomoneyiv| | 2008-6-5 19:01 | 只看该作者

十分感谢:圈圈


实验通过,谢谢圈圈的资料,十分感谢!

使用特权

评论回复
14
nomoneyiv| | 2008-6-6 14:26 | 只看该作者

顶圈圈,优秀帖子!

顶圈圈,优秀帖子!

使用特权

评论回复
15
computer00| | 2008-6-6 16:33 | 只看该作者

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

使用特权

评论回复
16
nomoneyiv| | 2008-6-6 19:47 | 只看该作者

USB


例子修改管脚配置,英蓓特的也能用!

使用特权

评论回复
17
nomoneyiv| | 2008-6-14 18:44 | 只看该作者

ding OO

这帖子不能沉,呵呵!

使用特权

评论回复
18
nomoneyiv| | 2008-6-20 09:01 | 只看该作者

ding OO

不让沉!

使用特权

评论回复
19
nomoneyiv| | 2008-6-25 15:52 | 只看该作者

ding OO

不让沉!   呵呵!   没人这么用吗?

使用特权

评论回复
20
cpufan| | 2008-7-4 17:16 | 只看该作者

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

微软自带的hid驱动认不出设备。。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

92

主题

260

帖子

0

粉丝