EDN首页   博客首页

1

关于投票
对AVR-USB的初步研究(四)

连着搞了好几个晚上的AVR-USB,总是只有一个Report Descriptor好用,反而以前测试没有问题的Report Descriptor,竟然也不能用了。发帖子问,也没有可以解答是为什么。今天死马当活马医,换了一个usbdrv,结果就好了!

点击看大图

系统分类: 单片机
用户分类: AVR
标签: avr usb
来源: 原创
发表评论 阅读全文(981) | 回复(5)

1

关于投票
对AVR-USB的初步研究(三)

        找了一份工作之后,对AVR-USB的研究停止了大概两个月。最近,由于和几位网友交流,又开始搞AVR-USB做HID设备了。

这次使用了Mega16的做的电路,一开始始终没有试验成功,即使使用原来的Mega8上运行没有问题程序也是如此。我分析是因为M16和M8的引脚有些差别,所以在初始化的部分肯定会有区别,经过三个晚上的试验却没有什么好转,结果在搜索的时候,看到一段代码,将他的初始化部分移植到我的代码中,竟然识别了!

更奇怪的是:当我使用多轴的HID Descriptor时,竟然也成功了!最近一直没有看USB specification,所以还不了解为什么会出现这类问题。

系统分类: 单片机
用户分类: AVR
标签: AVR USB
来源: 原创
发表评论 阅读全文(1021) | 回复(3)

1

关于投票
对AVR-USB的初步研究(二)

    自己搞AVR-USB的开发已经是第五天了,现学现卖,网上的资料似多非多:源代码很多、USB规范很多,但是这么多东西,都很长、枯涩,这么几天能看懂、理解的东西微乎其微。

    自己的目标很明确,做一下HID摇杆。我首先去大概浏览了如下资料:

USB1.1 Specification,USB in a NutshellAVR309三个文档

这样,自己对USB的工作原理有了一个了解(没能细看,特别是USB1.1规范。刚才看了一个人学习USB的过程,他花了两、三个月才能把它消化掉。USB in a Nutshell是一本非常不错的入门书)。

    之后我下载了PowerSwitch。看了一下代码,根据自己的情况修改了一下(我用的是atmega8),编译,Flash——OK,成功在自己的板子上运行了。

    然后发现,PS并不适合自己,它没有使用标准的驱动程序,和我做的东西并不一样。然后我就下载了HID Keys代码——这个接近我的目标了!同样修改、编译,Flash——错误!

    仔细看资料,看我的电路板和他使用的电路板——原来我们使用的电路不是很一样。HIDKeys使用的是PORTD的PD0和PD2脚,而我的电路(是根据另一个项目作的电路板)使用的是PB0,PB1,PB2和PD2四个引脚。

    为什么它的电路使用两个口而我的使用四个口呢?

    首先,USB数据接口的D+和D-两个接口对应在单片机上,必须是同一个端口。这里,HIDKeys使用PD0接D-,PD2接D+,作为数据口。而我的电路则使用PB0接D-,PB1接D+,同时D+接在PD2上。

    PD2在单片机为外部中断INT0的接口,接在D+,AVR-USB程序使用INT0作为USB事件外部中断(具体的代码我没有看,我分析是这样的)。

    那我的PB2是作什么用的呢?根据USB规范,在D-上接一个1K5的电阻,可以控制USB设备的连接和卸载。我这个电路上,PB2就是通过一个2K2的电阻接在D-上,控制设备连接。

    电路连接不同,那么反映在程序中也不同。AVR-USB在usbconfig.h文件有所定义:


/* ---------------------------- Hardware Config ---------------------------- */

#define USB_CFG_IOPORTNAME   B
#define USB_CFG_DMINUS_BIT  0
#define USB_CFG_DPLUS_BIT  1
#define USB_CFG_PULLUP_IOPORTNAME   B
#define USB_CFG_PULLUP_BIT         2

    宏的功能可以顾名思义了。

    最后两行是选填的。根据你的电路,可以注释掉。

    当你选用了这一个控制用的上拉电阻以后,你还需要在USB初始化代码之后、循环开始之前增加一个函数:usbDeviceConnect();

    这样,设备就正常连接到系统驱动了。

    不过,对于HIDKeys还有许多的东西要修改的。

    主要是数据处理方面。这时,我又找到了一个avr-hid项目,这两个项目相互参考。我发现avr-hid的数据处理要简单得多,我就按avr-hid的数据处理方式,把HIDKeys的修改了。

static uchar    reportBuffer[1];
PROGMEM char usbHidReportDescriptor[26] = { /* USB report descriptor */
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x04,                    // USAGE (Joystick)
    0xa1, 0x01,                    // COLLECTION (Application)
    0x05, 0x01,                    // USAGE_PAGE (Generic Desktop)
    0x09, 0x01,                    //   USAGE (Pointer)
    0xa1, 0x00,                    //   COLLECTION (Physical)
    0x15, 0x0,                    //     LOGICAL_MINIMUM (-128)
    0x25, 0x7f,                    //     LOGICAL_MAXIMUM (127)
    0x75, 0x08,                    //     REPORT_SIZE (8)
 0x95, 0x01,                    //     REPORT_COUNT (1)
    0x09, 0x30,                    //     USAGE (X)
 0x81, 0x02,                    //     INPUT (Data,Var,Abs)

   0xc0,                          //     END_COLLECTION
    0xc0                            // END_COLLECTION
};
 

uchar usbFunctionSetup(uchar data[8])
{

usbMsgPtr = reportBuffer;

 if(data[1] == 1) /* GET REPORT */
 {
  reportBuffer[0] = 0;
  return sizeof(reportBuffer);
 }
 
 return 0;

}

int main(void)


 wdt_enable(WDTO_1S);
    hardwareInit();
 odDebugInit();
 usbInit();
 sei();
 usbDeviceConnect();
    DBG1(0x00, 0, 0);

 for(;;){ /* main event loop */

  wdt_reset();
  usbPoll();
  
  reportBuffer[0]=你需要的数据;//实际中使用ADC读取的值

usbSetInterrupt(reportBuffer, sizeof(reportBuffer));

  if(TIFR & (1 << TOV0)){
   TIFR |= 1 << TOV0; /* clear pending flag */
  }
 }

return 0;
}

     这样,做的USB HID设备就可以正常在控制面板中查看了。

待续... ...

系统分类: 单片机
用户分类: AVR
标签: AVR USB
来源: 原创
发表评论 阅读全文(2275) | 回复(3)

1

关于投票
对AVR-USB的初步研究(一)

        刚毕业就失业,真是悲哀。不过在家里也不能闲着,找点事做。

     一个玩友让我帮忙做一个玩飞行游戏用的脚跎,电路简单,主要是编程他不行,让我帮忙。反正没什么事,而且自己也是飞行游戏爱好者,所以就答应了。

      自学单片机有一段时间了,但第一次搞USB,下载了不少资料,花了四天时间才初见成效——也真够慢的。本着GNU的精神,所自己的经验写出来,希望对各位有帮助。

   对于使用AVR软件模拟USB,最早的代码可能是Atmel的AVR Application Notes AVR309-Software Universal Serial Bus (USB)文档,文中介绍了使用软件模拟方式构建的USB to RS232电路。由于AVR单片机本身计算能力和USB规范中对时序的限制,AVR单片机软件模拟USB方式仅支持1.5Mb/s的低速工作模式(Low Speed)。而实际上,软件USB的最大传输速率可能远低于此(大概几百Kb/s)。然而,这对于简单的USB应该已经足够了——至少已经比串口的速度快,而在许多方面上可以省略驱动程序的编写。

        AVR309中提供的代码是基于AVR汇编的,使用起来较为困难。Objective Development公司开发了使用C接口的函数库AVR-USB,大大方便了构建软件模拟usb设备的工作。然而,根据Objective Development为AVR-USB的用户提供四种许可证协议(http://www.obdev.at/products/avrusb/license.html):

GNU General Public License Version 2 (GPL):用户可以免费使用avrusb软件,但必须遵循GPL2v协议并将自己设计制作的电路的电路图、固件软件、主机软件都公开。

Hobby License:付费协议(9.90 EUR),但用户可以得到自己独有的VID/PID,而使用此协议,用户只能以非商业形式制造最多5件此协议的设备。

Entry Level License:付费协议(199.00EUR),用户以自己独有的VID/PID,最多生产150件设备

Professional License: 付费协议 (500.00 EUR),用户可以得到两对独有的VID/PID,在100,000件以下时可以任意生产。

 

在avrusb的官方网站上提供了许多使用avr-usb软件构建的项目。其中,PowerSwitch和HID Keys两个项目被官方网站认为是学习使用AVR-USB的入门项目,特别是PowerSwitch是最简单的。不过,使用PowerSwitch软件,还必须编写PC端的相应驱动才可以使用;而HID Keys使用了PC上(Windows)上通用的HID(Human Interface Device)驱动,所以应该说更容易使用一些。

 

待续。。。

系统分类: 单片机
用户分类: AVR
标签: AVR USB 软件模拟
来源: 原创
发表评论 阅读全文(2385) | 回复(4)

1

关于投票
真晕,发现AVR Instruction Set上的所有字操作指令的Summary与详细格式不一致
    前两天用WinAVR写汇编代码的精确延迟程序, 看着AVR Instruction Set(版本号:Rev.0856E-AVR-11/05,目前仍为Atmel官方网站最新下载版本,updated:11/05)的格式写了如下一条指令:
adiw r25:r24,1
编译出错,仔细看了手册发现,在Instruction Set Summary上的指令格式为:
adiw Rd,K
而在adiw指令详细介绍上的格式却为:
adiw Rd+1:Rd,K
而WinAVR(avr-as)支持前一种格式。
 
    本来我修改了,在WinAVR正常运行也没什么了,但今天在将一段代码从AVRStudio上转换为WinAVR代码时,发现AVRStudio竟然是使用后一种格式的。本来汇编指令应该是一种标准的格式,这下搞得各自为政了。
 
    我也仔细看了一下,在这个版本的指令手册上,所有的字操作指令都存在这一问题,再如movw指令,在Summary上的是:
movw Rd,Rr
但在详细介绍中却是:
movw Rd+1:Rd, Rr+1,Rr
 
在编译器中,同样是avr-as支持前一种,AVRStudio支持的是后一种。
系统分类: 单片机
用户分类: AVR
标签: AVR 汇编 指令
来源: 原创
发表评论 阅读全文(1016) | 回复(0)
总共 , 当前 /