自制USB MIDI键盘来玩玩~~~

[复制链接]
10972|22
 楼主| computer00 发表于 2007-9-13 09:53 | 显示全部楼层 |阅读模式
<br />这个是个简单的USB&nbsp;MIDI设备演示程序.&nbsp;MCU接收串口发来的音符,&nbsp;变成MIDI格式通过USB发给电脑。在电脑上装个能够使用MIDI键盘的软件(例如cakewalk,&nbsp;happyEO等),就可以让它发声拉。<br />现在使用的是串口,在电脑上打开超级终端,设置波特率为9600,&nbsp;然后使用数字小键盘上的数字,就可以弹奏了.&nbsp;你可以自己做个小键盘,由MCU扫描,然后将扫描到的按键转换为MIDI,发给USB,这样就成了一个真正的MIDI键盘拉。<br />原理图见以前的USB键盘/鼠标等。<br />&nbsp;<br /><img src="http://space.**/Upload/Blog/2007/9/13/da97ea66-c4c5-45a1-bcde-a773cbe30524.JPG"><br />&nbsp;<br />下载整个工程包:&nbsp;去USB小组,嘿嘿&nbsp;:(<br />&nbsp;<br />&nbsp;<br />(来自USB小组专区:<font color=#333333>http://group.**/93/</font><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By&nbsp;computer00&nbsp;@&nbsp;2007-09-12)
 楼主| computer00 发表于 2007-9-13 21:21 | 显示全部楼层

不会吧?居然没一个人玩这个的?

  
devusb 发表于 2007-9-13 21:44 | 显示全部楼层

USB MINI键盘需要MCU太多按键

比较少人完!
 楼主| computer00 发表于 2007-9-13 21:47 | 显示全部楼层

只是学习而已拉,又不是做产品的。

我现在用串口发送音符,都没用键盘呢。
 楼主| computer00 发表于 2007-9-14 11:08 | 显示全部楼层

这个是unicode字符串~~~~你将要显示的东西,编码成unicode就行

  
huangqi412 发表于 2007-9-14 14:18 | 显示全部楼层

00,请教个d12问题

00,我的用的类似zlg的结构。请教一个问题<br />我的描叙符是普通的,没有模仿成hid或者u盘&nbsp;为什么读完描叙集就停了呢?电脑中已经提示安装驱动。但是应该还没每举完啊,还要设置配置啊,发现是主机没有进一步发送请求包。我的led现在还不亮,好象是要设置配置后才会亮。<br /><br />还有&nbsp;字符串请求是如何区分各种字符串请求的,比如描叙设备的,描叙接口的,&nbsp;&nbsp;我试着把字符串索引改1会出现字符串请求,而且是在描叙集请求之后,但是没有看到区分要求发送哪个字符串的字段啊。好象至于类型是3既字符串,长度是ff,其他什么都没了
devusb 发表于 2007-9-14 19:36 | 显示全部楼层

设备描述符里的索引分别对应厂家,产品,序列号的索引号

这些字符串都是一UNICODE编码(占2个字节)的,如果是英文字母基本上就是把单字节的字符扩展成2个字节,汉字就查查表.<br />获取描述符时尤其获取字符串描述符时的索引号就是对应该描述符里的索引号了.
devusb 发表于 2007-9-14 19:36 | 显示全部楼层

我也加入学习行业

  
 楼主| computer00 发表于 2007-9-14 20:23 | 显示全部楼层

在标准请求的第一个字节里面就定义了该请求是发给谁的

你使用自己定义的描述符,或许有地方搞错了,这样USB&nbsp;HOST检测到错误,就不会再请求你的描述符了。
hpy013 发表于 2007-9-15 09:58 | 显示全部楼层

关于HID Descriptor的资料,有吗?

关于HID&nbsp;Descriptor,Report&nbsp;Descriptor,Physical&nbsp;Descriptor的资料,哪儿有啊,我在USB1.1协议里,没看到,谁能帮告诉我哪个有啊?谢谢。
huangqi412 发表于 2007-9-15 20:46 | 显示全部楼层

哦,那就是说请求字节第一个字节应该是80+索引?

比如81h.&nbsp;&nbsp;<br />看了好象前面也没有出错啊,我在usb&nbsp;view里看了自己发送的都显示出来了。<br /><br />还有,为什么我的bus&nbsp;hound不好使呢,我从头看到尾都没有看到一个以80h或者00h开头的8字节请求啊。&nbsp;全部是a3之类开头的,也没看到我发送的16字节一串的数据.<br />我的是笔记本,难道和这个有关系?但是usbview里面可以看到我发送的描叙符啊.
 楼主| computer00 发表于 2007-9-17 09:19 | 显示全部楼层

re hpy013:HID方面的资料在我的小组里面有,看我的签名

re&nbsp;huangqi412:&nbsp;也许吧。你可以换台电脑试试?设备一定要选对。还有命令也要选择,不过默认是选了一些的。
hpy013 发表于 2007-9-17 22:46 | 显示全部楼层

谢谢!

/*************************读终端点缓冲****************************************/<br />uint8&nbsp;read_endpoint_buff(uint8&nbsp;endp,uint8&nbsp;len,uint8&nbsp;*&nbsp;buff)<br />{<br />&nbsp;uint8&nbsp;i,j;<br />&nbsp;read_last_status(endp);<br />&nbsp;if(!(select_endpoint(endp))&0x01){error(0);&nbsp;return&nbsp;0;}<br />&nbsp;read_endpoint_status(endp);<br />&nbsp;write_usb_command(Read_Buffer);<br />&nbsp;read_a_usb_data();<br />&nbsp;j=read_a_usb_data();<br />&nbsp;if(j&gtlen)<br />&nbsp;&nbsp;j=len;<br />&nbsp;for(i=0;i&ltj;i++)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;USB_RD=0;<br />&nbsp;&nbsp;&nbsp;*(buff+i)=USB_DATA;<br />&nbsp;&nbsp;&nbsp;USB_RD=1;<br />&nbsp;&nbsp;}<br />&nbsp;clear_buffer();<br />&nbsp;return&nbsp;j;<br />}<br />/******************************************************************************/<br />//<br />&nbsp;read_last_status(endp);<br />&nbsp;read_endpoint_status(endp);这两个读有用吗?<br />computer00能不能解释一下,这段程序啊,看到现在,还没看明白,谢谢!
hpy013 发表于 2007-9-18 22:35 | 显示全部楼层

我下载了一个学习笔记,效果不错!

理解了上面一段。但还不全。<br />to&nbsp;COMPUTER00能否把你的这些程序,后面多加一注释啊?
 楼主| computer00 发表于 2007-9-19 17:00 | 显示全部楼层

基本上从函数名和变量名可以看懂程序了吧?

read_last_status(endp);<br />read_endpoint_status(endp);<br /><br />这个好象是清除中断标志用的,也许没用吧,你可以删了试试。
huangqi412 发表于 2007-9-20 18:38 | 显示全部楼层

00,问题还是没有解决啊,

我把那个bus&nbsp;hound反复的弄了,各种选项都看了,也读了古道热肠的翻译pdf,还是搞不定,一直就是a3开头的一些东西,实在没摺了,我还是用的串口调试,<br />那个为什么不发送设置配置也没搞定,我应该没发错的。不过在一本书上看到这样的一段,难道要装驱动才会设置配置//??不知道是不是,哪天该成&nbsp;hid描叙符试下<br />成功得到9字节的配置描述符后,主机向D12发送第五个Setup包,要求得到设备的配置描述符、接口描述符、端点描述符的集合。这次Setup包的内容是:80&nbsp;06&nbsp;00&nbsp;02&nbsp;00&nbsp;00&nbsp;FF&nbsp;00&nbsp;。由于不知道描述符集合的真实长度,因此它要求得到256字节。<br />到这一步,主机现在应该已经发现新硬件并为新设备安装好驱动程序。对于以上过程,主机是在总线驱动层处理,下面的一步,也是典型枚举过程的最后一步,就需要设备驱动程序来做了。<br />数值配置。主机得到各种描述符之后,认为设备的信息已经齐全,便对设备进行配置,使设备从地址状态进入配置状态。
 楼主| computer00 发表于 2007-9-20 21:08 | 显示全部楼层

也许你应该找机会换台电脑试试?

主机怎么会不知道配置描述符集合的长度呢?这个在9字节的配置描述符里面就有了,<br />主机会先执行读9字节的配置描述符的步骤,目的就是为了获取这个集合的长度,接<br />下来它就会用后面的长度进行请求。这个你可以看我写枚举过程中的数据包,刚好是<br />那么多的。
huangqi412 发表于 2007-9-21 15:30 | 显示全部楼层

呵呵,这个是书上写的,

明天找台电脑试试,别人的不让装软件,而且都在玩游戏,比较麻烦,<br />现在的情况是我的已经要求安装驱动了,在usb&nbsp;view里可以看道我发送的东西,用串口调试证明读完配置集就停了,bus&nbsp;hound常识了各种设置都没有找道需要的数据.
hpy013 发表于 2007-9-24 11:28 | 显示全部楼层

有一个问题

关于MSB(Control_Data.DeviceRequest.wValue)和LSB(Control_Data.DeviceRequest.wValue)<br />我现在只知道前者描述的是描述符类型,后者是描述符的索引。哪位能提供一下LSB(Control_Data.DeviceRequest.wValue)究竟有哪些内容啊?谢谢!
 楼主| computer00 发表于 2007-9-28 10:00 | 显示全部楼层

就是字符串索引,你在描述符里面会说明索引值。

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

本版积分规则

247

主题

14716

帖子

213

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