USB的枚举.doc_第1页
USB的枚举.doc_第2页
USB的枚举.doc_第3页
USB的枚举.doc_第4页
USB的枚举.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

USB的枚举:本文指的是Avr m16和d12搭配usb枚举。一实验准备1硬件图:(本文以下面电路为准)注意对于d12_CS和d12的复位引脚RES可分别接固定电平0(GND),1(VCC)。由于d12可能会发生错乱,一些资料建议要对引脚进行控制。发生问题时可送一个低电平进行复位。d12_CS如果接高电平,d12无效,数据端口为高阻态。下面的是我的实物图片:自制并口下载器,采用并口偷电,可不接外电源。用于调试的串口线搭建的实验板建议大家把下载线直连到avr的下载端口,省得每次烧录都要插拔,超麻烦。D12和avr使用usb的5v供电。省去外接电源。2软件平台:avrstudio4.12+sp4,gccWinAVR-200604213.调试工具:下载器,串口,串口小精灵。4新建一个project,将周立功例子的头文件和c文件添加到项目。注意所有的头文件,c文件(包括下面的main.h文件应该放在同一项目文件夹,否者有路径错误)5点击编译编译后提示出错,现在进行错误的初步修改(直到不提示出错):(1)更换头文件将所有#include 更改为#include main.h新建一个头文件main.h,并添加下面内容:/usb.h : header file for the usb project/#ifndef _main_H_#define _main_H_#ifndef _AVR_ATmega16_#define _AVR_ATmega16_#endif#include #include #include #include #include #include #ifndef cbi #define cbi(reg,bit) reg &= (_BV(bit) #endif #ifndef sbi #define sbi(reg,bit) reg |= (_BV(bit) #endif #endif对于一些头文件可能编译提示找不到路径,就要手动添加路径。不过一般不会出现这种情况,除非你的软件装不好,或gcc版本不对。 这里要说明为什么要加sbi,cbi的宏定义。因为比较新的版本不支持这两条语句,所以要自己定义。(2)删除discriptor.h里面的以下内容#define DATA_BUS P0sbit MCU_A0 = P35;sbit MCU_WR = P36;sbit MCU_RD = P37;sbit MCU_D12CS = P25;sbit MCU_D12RST = P24;sbit MCU_D12SUSPD = P23;sbit LED1 = P20;sbit LED2 = P21;sbit LED3 = P22;将d12HAL.c的出现上面定义的语句全注释掉举个例:outportb,inportb的部分语句注释掉(原因不用说了吧!),如下:void outportb(INT16U Addr, INT8U Data)/*(INT8U xdata *) Addr) = Data; if(Addr = D12_DATA)/send the data /MCU_A0 = 0; /MCU_WR = 0; /DATA_BUS = Data;else/send the command /MCU_A0 = 1; /MCU_WR = 0; /DATA_BUS = Data; /MCU_WR = 1;INT8U inportb(INT16U Addr)/return *(INT8U xdata *) Addr); INT8U i; Addr = Addr;/avoid the warning /MCU_RD = 0; /i=DATA_BUS; /MCU_RD = 1;return i;(3)变量修改主要把带code属性的变量中的”code”去掉,如下:extern code USB_DEVICE_DESCRIPTOR DeviceDescr;改为:extern USB_DEVICE_DESCRIPTOR DeviceDescr;还有几个这样的变量我不一一列举了,大家按错误提示逐个修改就行了。(一句话见到:变量定义有code杀无赦。)注意:这里大家不要想当然的把它定义为avr flash里面的变量(用_attribute_(progmem))。因为51定义在flash的数据可以在c语言里可当做变量读出,而avr在flash的数据要用专用的flash读函数读出。我就因为这样郁闷了一整天。最后在bozai的帮助下才发现,这里要感谢他的热心帮助。为了与其他程序兼容就把它作为内存变量好了。还有把带idata属性的变量中的” idata”去掉,如下:INT8U idata GenEpBufEP1_PACKET_SIZE;/端点1接收缓冲区改为:INT8U GenEpBufEP1_PACKET_SIZE;/端点1接收缓冲区还有几个这样的变量我不一一列举了,大家按错误提示逐个修改就行了。(一句话见到:变量定义有idata杀无赦。)(4)中断修改将下面语句#define DISABLE() EA = 0 /关总中断 disable all interrupt #define ENABLE() EA = 1/开总中断 enable all interrupt改为:#define DISABLE() cli() /关总中断 disable all interrupt #define ENABLE() sei()/开总中断 enable all interrupt将下面语句去掉void init_special_interrupts(void)IT1 = 0;/低电平有效EX1 = 1;PX1 = 0;改为:void init_special_interrupts(void) MCUCR |= 0x00;MCUCSR |= 0x00;GICR = 0x80; 上面的设置为使能中断1,中断方式为低电平将中断调用程序更改:void Usb_Exception(void) interrupt 2改为:SIGNAL(SIG_INTERRUPT1)将定时器有关的语句去掉,void timer_interrupt(void) interrupt 1 DISABLE(); TL0 = 0XB0;TH0 = 0X3C; time_count+; if(time_count = 10) time_count = 0; led_tem = led_tem 1; bEPPflags.bits.timer = 1; ENABLE();d12driver.c的上面语句去掉。经过上面修改编译通过。但程序还有很多错误要修改的。5串口设置与printf语句为了具有代表性采用单片机内部的4M晶振,波特率设为9600。具体设置程序如下:/* 函数名称:串口通讯初始化函数 函数功能: 输入参数:无(初始化波特率) 返回参数:无 影响的全局变量:无 */ void uart_init(void) UBRRH=0; UBRRL=25; /波特率 ,可查波特率表更改 UCSRB=(1RXEN)|(1TXEN); /收发允许 UCSRA = 0x00; UCSRB = 0x18; UCSRC = 0x86; 还要两个接收与发送函数,用作串口调试的/* 函数名称:串口发送函数 函数功能: 输入参数:要发送的字节 返回参数:无 影响的全局变量:无 */ int putbyte(unsigned char c) /UART发送一个8位的数据 while (!(UCSRA&(1UDRE); UDR=c; return 0; /* 函数名称:串口接收函数 函数功能: 输入参数:无 返回参数:接收到的数据,一个byte 影响的全局变量:无 */ uint8_t getbyte(void) /UART接收一个byte的数据 while (!(UCSRA&(1RXC); return UDR; 注意:上面程序应放在main()的上面。否则会提示函数没定义。为什么?如果函数在调用前没声明就会这样。初学者可参考c语言的书籍。在使用printf语句前还要给出下面语句 while(1) printf(start!n); 是用来测试串口的。用串口精灵会不断接收到start。记得测试完后去掉while。 至此,所用准备工作完成。下面正式进行枚举调试。二枚举调试1正确读写d12怎么为之正确读写d12呢?最主要是向d12发出0xfd命令,可以返回的chip_id值为0x1012。如果返回的书有问题,那证明你还不能正确地操作d12。那后面的过程肯定没法进行了。这一步程序的流向是:Init_D12()Init_D12Port()Rst_D12()reconnect_USB()D12_ReadChipID()是否为0x1012下一步是否对于片选和复位引脚接固定电平的可以不理会Init_D12Port()和Rst_D12()这两个函数,由于我要控制着两个脚所以我的更改如下:void Init_D12Port(void) / MCU_D12CS = 1;/释放D12 sbi(DDRD,2); /设为输出方式 sbi(PORTD,2); /MCU_D12CS = 0;/选择D12cbi(PORTD,2);void Rst_D12(void)INT16U i; /MCU_D12RST = 0;/D12的 RESET引脚置0 sbi(DDRD,7); /设为输出方式 cbi(PORTD,7);for(i = 0; i 8) & 0xFF)为什么呢?因为读进80,6,0,1,0,0,12,0,经过ControlData.DeviceRequest.wValue = req3 * 256 + req2;得出的ControlData.Dev

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论