OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4570|回复: 11

想在原子哥的mini板触摸的触摸鼠标实验基础上改成键盘,目前状态是电脑可以识别为键盘,但是却每次上电会弹出不可识别的设备

[复制链接]

2

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-12-16
在线时间
8 小时
发表于 2016-1-12 13:23:44 | 显示全部楼层 |阅读模式
17金钱
本帖最后由 疯疯 于 2016-1-12 18:35 编辑

1.原子哥的发送数据函数不明白,“Joystick_Send(0,0,0,0); //发送松开命令给电脑”进入函数定义后发现
       void Joystick_Send(u8 buf0,u8 buf1,u8 buf2,u8 buf3)
      {
        uint8_t Mouse_Buffer[4] = {0, 0, 0, 0};
        Mouse_Buffer[0]=buf0;
        Mouse_Buffer[1]=buf1;
        Mouse_Buffer[2]=buf2;
        Mouse_Buffer[3]=buf3;   
        USB_SIL_Write(EP1_IN, Mouse_Buffer, 4);    /* Copy mouse position info in ENDP1 Tx Packet Memory Area*/
        SetEPTxValid(ENDP1);  /* Enable endpoint for transmission */
} 这里我理解的是向端点1发送数据而不是向电脑,应该还得有一个设置输出端点啊,可是怎么没发现啊?为什么只有输入端点1,却没有输出端点 ,怎么传数据啊?不明白这一个端点是怎么工作的,因为我没有找到这个输出端点这个函数。
   2.看资料说端点0的收发是必打开的,可是我怎么找不到在哪里设置的啊!
   void EP1_IN_Callback(void)
{
   PrevXferComplete = 1; /* Set the transfer complete token to inform upper layer that the current  transfer has been complete 回调函数,告诉上一层,当前的发送已完成*
}
  3.若改为键盘,是否需要增加一个输出端点?
  4.端点收发的收据字节长度问题,原子哥的鼠标是设置了左中右滚轮四个字节,所以需要修改端点描述符最大字节长度,这个我明白,但是不明白这个端点设置是否与键盘的报告描述符
    有关系???我理解的是没有关系。
  5.为了测试数据是否正常,原子哥的主函数中设置了一个死循环给电脑不停发数据,然后用busbund抓数据,发现没有数据,只有上电时的枚举过程,截图如下。最后附上修改的原子哥
   的程序。
   主函数死循环入下(初始化部分省落)while(1)
  {  
    Joystick_Send(0,0,0,0); //发送松开命令给电脑
    delay_ms(100);
  }
  6.我对这个自定义HID设备不太理解,我做的这个键盘不是标准键盘,是属于自定义HID设备的范畴么???因为我看键盘报告描述符描述的都是一些标准键盘的数据。
    非常着急,已经困这里很久了,实在不知道下一步如何进行了,希望大神们不吝赐教啊!

这是上电的时候busbund抓的,只有枚举却没数据

这是上电的时候busbund抓的,只有枚举却没数据

能识别

能识别

MINI键盘1.12.rar

394.93 KB, 下载次数: 467

最佳答案

查看完整内容[请看2#楼]

我看set idle和set report两条类相关命令都没有实现,怎么可能枚举成功呢? 除非有现成的基于原子mini的键盘例程,否则也远水解不了近渴。 端点长度是在端点描述符中描述的,连同配置描述符、接口描述符一起返回的,但是键盘返回的数据格式是在报告描述符中描述的。 键盘不需要专门的输出端点,HID输出端点是可选的,一般用控制端点0。 键盘是标准的HID设备,自定义设备的类型是FF。 后续你可以仔细看一下HID官方协议,以及ST ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2015-12-21
在线时间
18 小时
发表于 2016-1-12 13:23:45 | 显示全部楼层
我看set idle和set report两条类相关命令都没有实现,怎么可能枚举成功呢?
除非有现成的基于原子mini的键盘例程,否则也远水解不了近渴。
端点长度是在端点描述符中描述的,连同配置描述符、接口描述符一起返回的,但是键盘返回的数据格式是在报告描述符中描述的。
键盘不需要专门的输出端点,HID输出端点是可选的,一般用控制端点0。
键盘是标准的HID设备,自定义设备的类型是FF。
后续你可以仔细看一下HID官方协议,以及ST的USB固件包。
你说找不到一些函数,要么是没有理清USB固件包的结构,要么还不是特别清楚HID的协议。
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-12-16
在线时间
8 小时
 楼主| 发表于 2016-1-12 13:28:50 | 显示全部楼层
顶一下吧
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-12-16
在线时间
8 小时
 楼主| 发表于 2016-1-12 15:12:34 | 显示全部楼层
原子哥给我看看啊
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-12-16
在线时间
8 小时
 楼主| 发表于 2016-1-12 21:27:45 | 显示全部楼层
zzu65 发表于 2016-1-12 17:47
我看set idle和set report两条类相关命令都没有实现,怎么可能枚举成功呢?
除非有现成的基于原子mini的键 ...

非常感谢大哥的细心解答,解答了心中许多困惑。但是我还是有些问题不明白:
1.你说这个没有枚举成功,set idle和set report两条类相关命令都没有实现,你是在源程序上看到,还是在上面枚举过程的图中看的,那我就不太明白了,busbund上明明显示有这两个过程啊。难道这是枚举成功了么,我再截下图。
2.端点问题。我看你的回答,我又细细的查看了一遍,确实没找到,这可能与我的理解有些误差。但是我发现端点1的输出确实没有打开入下:
/* #define  EP1_IN_Callback   NOP_Process*/ //这里屏蔽了宏定义,然后又在另一个文件中定义了,很明显端点1的输出是没有打开的,NOP_Process是表示不处理的。

#define  EP2_IN_Callback   NOP_Process
#define  EP3_IN_Callback   NOP_Process
#define  EP4_IN_Callback   NOP_Process
#define  EP5_IN_Callback   NOP_Process
#define  EP6_IN_Callback   NOP_Process
#define  EP7_IN_Callback   NOP_Process

#define  EP1_OUT_Callback   NOP_Process
#define  EP2_OUT_Callback   NOP_Process
#define  EP3_OUT_Callback   NOP_Process
#define  EP4_OUT_Callback   NOP_Process
#define  EP5_OUT_Callback   NOP_Process
#define  EP6_OUT_Callback   NOP_Process
#define  EP7_OUT_Callback   NOP_Process
3.对于这里的回调函数的应用不理解,我理解的是回调函数是在中断中处理,做一些响应的,怎么感觉这里完全没用到啊。这是另一个文件中关于它的描述
//USB传输是否正在进行的标志(本例程没用到)
//1,空闲;0,正在传输。
volatile u8 PrevXferComplete = 1;
。。。。。。
void EP1_IN_Callback(void){PrevXferComplete = 1;}/*用来判断当前的发送已完成*/
应该是和这个
uint32_t USB_SIL_Write(uint8_t bEpAddr, uint8_t* pBufferPointer, uint32_t )
USB_SIL_Read(uint8_t bEpAddr, uint8_t* pBufferPointer)
我理解的是上面的的两个函数分别向输入端点写数据和从输出端点读数据
UserToPMABufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes
PMAToUserBufferCopy(uint8_t *pbUsrBuf, uint16_t wPMABufAddr, uint16_t wNBytes)
这两个表示复制一个缓冲用户存储区到数据包存储区,不太明白这user memory area与packet memory area有什么区别。

加班加点终于把问题描述明白了,问题有点多了,还希望你能看下去,谢谢,回答多少都可以的,非常感谢,希望能得到你的回复!
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-12-16
在线时间
8 小时
 楼主| 发表于 2016-1-13 15:47:27 | 显示全部楼层
zzu65 发表于 2016-1-12 17:47
我看set idle和set report两条类相关命令都没有实现,怎么可能枚举成功呢?
除非有现成的基于原子mini的键 ...

今天又仔细看了固件,在Joystick_Reset(void)函数中找到了端点0和端点1的配置!你说"除非有现成的基于原子mini的键盘例程,否则也远水解不了近渴."我不太明白了,原子的也是基于官网改的,而且我看网上许多例程都是基于官网鼠标的demo改的啊,这么改应该是没有问题的啊!
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-1-13
在线时间
0 小时
发表于 2016-1-13 16:11:17 | 显示全部楼层
以前有用KEIL的sample改的。
http://www.openedv.com/posts/list/10971.htm
你似乎有些概念都理解错了
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-12-16
在线时间
8 小时
 楼主| 发表于 2016-1-13 17:02:49 | 显示全部楼层
weib20082009 发表于 2016-1-13 16:11
以前有用KEIL的sample改的。
http://www.openedv.com/posts/list/10971.htm
你似乎有些概念都理解错了

恩恩是的,有些概念确实理解错了,还有这个帖子我也是看了好多遍了,我也是照这个改的,可以识别为键盘,但我现在问题是数据的收发有异常啊!我在主函数里加了死循环不停发数据给电脑,理论上应该是 BUS Hound上应该有不断有数据显示的啊!
回复

使用道具 举报

16

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2015-12-21
在线时间
18 小时
发表于 2016-1-13 21:45:21 | 显示全部楼层
有一个帖子,你可以看一下,希望能帮到你,祝好运。
http://www.openedv.com/thread-65837-1-1.html
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-12-16
在线时间
8 小时
 楼主| 发表于 2016-1-14 13:16:21 | 显示全部楼层
本帖最后由 疯疯 于 2016-1-14 13:22 编辑
zzu65 发表于 2016-1-13 21:45
有一个帖子,你可以看一下,希望能帮到你,祝好运。
http://www.openedv.com/thread-65837-1-1.html


非常感谢这个文档对将要进行的工作,会很有帮助!现在问题解决了,程序是没什么问题的,是有数据的,而是我对BUS Hound理解有问题,IN输入端一直是在接收数据的,只是一直停留在那一行在不停的计数,我以为是要不停的往下打印的,有点太低级了,竟然困我两周,害我失眠,哎!虽然走了许多弯路但是却对USB有了更深的了解,后续我会把自己的理解贴上去,省得有人再多走弯路!至于上面贴的图可能是有问题的!
回复

使用道具 举报

16

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2015-12-21
在线时间
18 小时
发表于 2016-1-14 17:31:08 | 显示全部楼层
bushound有一个设置项是设置重复的包要不要合并,如果合并的话就一直计数,不合并的话就会一直往下打印。
回复

使用道具 举报

2

主题

12

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2015-12-16
在线时间
8 小时
 楼主| 发表于 2016-1-18 10:10:39 | 显示全部楼层
zzu65 发表于 2016-1-14 17:31
bushound有一个设置项是设置重复的包要不要合并,如果合并的话就一直计数,不合并的话就会一直往下打印。

还可以这么设置啊,学习了,谢谢谢谢!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 14:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表