亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? usbd12.c

?? avr usb Visual C++環境下的開發
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*******************************************
  文件:USBD12.C
  環境:編譯為ICC AVR6.25A,仿真為AVR Studio4.10 
  硬件:ATMEGA16芯片
  日期:2006年12月10日 
  功能:驅動開發板上的USBD12
  備注:參考《PDIUSBD12USB固件編程與驅動開發》(北航出版社)
/******************************************/
#include <iom16v.h>			//包含型號頭文件
#include <macros.h>			//包含"位"操作頭文件
#include <stdio.h>			//標準輸入輸出頭文件
#include <AVR_PQ1A.h>		//包含自定義常量頭文件
#include "LED.C"
#include "SKEY.C"

#pragma interrupt_handler USB_INT1:3//外部中斷1中斷服務函數聲明
struct flags
{
	uchar bus_reset           	;	//總線復位標志
	uchar suspend             	;	//掛起改變標志
	uchar setup_packet  	  	;	//收到SETUP包
	uchar remote_wakeup			;
	uchar in_isr		      	;	//USB中斷服務標志
	uchar control_state			;	//控制端點處理標志
													//0: IDLE	   空閑狀態
													//1: TRANSMIT  數據發送狀態
													//2: RECEIVE   數據接收狀態
 	uchar configuration			;	//配置標志(0: 未配置; 1: 已經配置)		
	uchar ep1_rxdone			;	//端點 1 收到數據標志
	uchar ep2_rxdone			;	//端點 2 收到數據標志
	uchar ep2buf_full			;	//端點 2 接收雙緩沖區滿標志
}USB_FLAG={0,0,0,0,0,0,0,0,0,0};
typedef struct request
{
	uchar bmRequestType;
	uchar bRequest;
	uint wValue;
	uint wIndex;
	uint wLength;
}DEVICE_REQUEST;
typedef struct xfer
{
	DEVICE_REQUEST DeviceRequest;
	uint wLength;
	uint wCount;
	uchar * pData;
	uchar dataBuffer[MAX_CTLDAT_SIZE];
}CONTROL_XFER;
typedef struct _USB_DEVICE_DESCRIPTOR 
{
    uchar bLength;
    uchar bDescriptorType;
    uchar bcdUSB0;
    uchar bcdUSB1;
    uchar bDeviceClass;
    uchar bDeviceSubClass;
    uchar bDeviceProtocol;
    uchar bMaxPacketSize0;
    uchar idVendor0;
    uchar idVendor1;
    uchar idProduct0;
    uchar idProduct1;
    uchar bcdDevice0;
    uchar bcdDevice1;
    uchar iManufacturer;
    uchar iProduct;
    uchar iSerialNumber;
    uchar bNumConfigurations;
} USB_DEVICE_DESCRIPTOR;
/***********  USB  接口描述符結構體  ****************/
typedef struct _USB_INTERFACE_DESCRIPTOR 
{
    uchar bLength;
    uchar bDescriptorType;
    uchar bInterfaceNumber;
    uchar bAlternateSetting;
    uchar bNumEndpoints;
    uchar bInterfaceClass;
    uchar bInterfaceSubClass;
    uchar bInterfaceProtocol;
    uchar iInterface;
} USB_INTERFACE_DESCRIPTOR;
/***********  USB  配置描述符結構體  ****************/
typedef struct _USB_CONFIGURATION_DESCRIPTOR 
{
    uchar bLength;
    uchar bDescriptorType;
    uchar wTotalLength0;
    uchar wTotalLength1;
    uchar bNumInterfaces;
    uchar bConfigurationValue;
    uchar iConfiguration;
    uchar bmAttributes;
    uchar MaxPower;
} USB_CONFIGURATION_DESCRIPTOR;
/***********  USB  端點描述符結構體  ****************/
typedef struct _USB_ENDPOINT_DESCRIPTOR 
{
    uchar bLength;
    uchar bDescriptorType;
    uchar bEndpointAddress;
    uchar bmAttributes;
    uchar wMaxPacketSize0;
    uchar wMaxPacketSize1;
    uchar bInterval;
} USB_ENDPOINT_DESCRIPTOR;
/***********  D12 USB 各種描述符結構體 *********************/
typedef struct _USB_DESCRIPTOR 
{
	USB_CONFIGURATION_DESCRIPTOR ConfigDescr;		//配置描述符
	USB_INTERFACE_DESCRIPTOR InterfaceDescr;		//接口描述符
	USB_ENDPOINT_DESCRIPTOR EP1_TXDescr;			//端點1輸入描述符
	USB_ENDPOINT_DESCRIPTOR EP1_RXDescr;			//端點1輸出描述符
	USB_ENDPOINT_DESCRIPTOR EP2_TXDescr;			//端點2輸入描述符
	USB_ENDPOINT_DESCRIPTOR EP2_RXDescr;			//端點2輸出描述符
} USB_DESCRIPTOR;
CONTROL_XFER ControlData;
uchar GenEpBuf[EP1_PACKET_SIZE];			//端點1接收緩沖區
uchar EpBuf[EP2_PACKET_SIZE];				//端點2接收緩沖區
//#pragma data:code
//設備描述符
USB_DEVICE_DESCRIPTOR DeviceDescr =
{
	sizeof(USB_DEVICE_DESCRIPTOR),				//設備描述符長度,= 12H
	USB_DEVICE_DESCRIPTOR_TYPE,					//設備描述符類型,= 01H
	0x00,0x10,										//協議版本,= 1.10
	USB_CLASS_CODE_TEST_CLASS_DEVICE,			//測試設備類型, = 0DCH	
	0, 0,										//設備子類,設備協議
	EP0_PACKET_SIZE,							//端點0最大數據包大小,= 10H	
	0x71,0x04,									//PHILIPS公司的設備ID	
	0x66,0x06,									//設備制造商定的產品ID
	0x00,0x01,									//設備系列號
	0, 0, 0,									//索引
	1											//可能的配置數
};
USB_DESCRIPTOR usb_descr =
{
//配置描述符
{
	sizeof(USB_CONFIGURATION_DESCRIPTOR),		//配置描述符長度,= 09H
	USB_CONFIGURATION_DESCRIPTOR_TYPE,			//配置描述符類型,= 02H
	CONFIG_DESCRIPTOR_LENGTH,0x00,				//描述符總長度, = 002EH
	1,											//只支持1個接口
	1,											//配置值
	0,											//字符串描述符指針(無)
	0xa0,										//自供電,支持遠程喚醒
	0x32										//最大功耗(100mA)
},
//接口描述符
{
	sizeof(USB_INTERFACE_DESCRIPTOR),			//接口描述符長度,= 09H
	USB_INTERFACE_DESCRIPTOR_TYPE,				//接口描述符類型,= 04H
	0,											//接口數,只有1個
	0,											//可選配置,只有1個
	NUM_ENDPOINTS,								//除端點0的端點索引數目,= 04H
	USB_CLASS_CODE_TEST_CLASS_DEVICE,			//測試設備類型,= 0DCH
	USB_SUBCLASS_CODE_TEST_CLASS_D12,			//子類代碼,= 0A0H	
	USB_PROTOCOL_CODE_TEST_CLASS_D12,			//協議代碼,= 0B0H
	0											//字符串描述符索引
},
//端點描述符,端點1輸入
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),			//端點描述符長度,= 07H
	USB_ENDPOINT_DESCRIPTOR_TYPE,				//端點描述符類型,= 05H
	0x81,										//端點1 IN
	USB_ENDPOINT_TYPE_INTERRUPT,				//中斷傳輸, = 03H
	EP1_PACKET_SIZE,0x00,						//端點最大包的大小,= 0010H
	10											//傳輸間隔時間,= 10ms
},
//端點描述符,端點1輸出
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),			//端點描述符長度,= 07H
	USB_ENDPOINT_DESCRIPTOR_TYPE,				//端點描述符類型,= 05H
	0x1,										//端點1 OUT
	USB_ENDPOINT_TYPE_INTERRUPT,				//中斷傳輸,= 03H
	EP1_PACKET_SIZE,0x00,						//端點最大包的大小,= 0010H
	10											//傳輸間隔時間,= 10ms
},
//端點2輸入
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),			//端點描述符長度,= 07H
	USB_ENDPOINT_DESCRIPTOR_TYPE,				//端點描述符類型,= 05H
	0x82,										//端點2 OUT
	USB_ENDPOINT_TYPE_BULK,						//批量傳輸,= 02H
	EP2_PACKET_SIZE,0x00,						//端點最大包的大小,= 0040H
	10											//批量傳輸時該設備無效
},
//端點2輸出
{
	sizeof(USB_ENDPOINT_DESCRIPTOR),			//端點描述符長度,= 07H
	USB_ENDPOINT_DESCRIPTOR_TYPE,				//端點描述符類型,= 05H
	0x2,										//端點2 IN	
	USB_ENDPOINT_TYPE_BULK,						//批量傳輸,= 02H
	EP2_PACKET_SIZE,0x00,						//端點最大包的大小,= 0040H
	10											//批量傳輸時該設備無效
} 
};
//#pragma data:data
//#pragma data:code
void (*StandardDeviceRequest[])(void)=
{
	Get_status,
	Clr_feature,
	Reserved,
	Set_feature,
	Reserved,
	Set_addr,
	Get_descriptor,
	Reserved,
	Get_config,
	Set_config,
	Get_interface,
	Set_interface,
	Reserved,
	Reserved,
	Reserved,
	Reserved
};
//#pragma data:data
/*******************************************
函數名稱: D12_init
功    能: 初始化D12接口(包括數據接口和控制接口)
參    數: 無
返回值  : 無
/********************************************/
void D12_init(void)
{
 DDRA|=BIT(CSUSB); 				//USB的573鎖存端設置為輸出			  
 PORTA&=~BIT(CSUSB);			//573鎖存端關閉
 USBDAT_DDR|=0xFF;				//數據端口設置為輸出
 USBCTL_DDR|=BIT(WR_N)|BIT(RD_N)|BIT(C_D)|BIT(D12_CS);//控制引腳設置為輸出
 USBCTL_DDR&=~BIT(D12_INT);							  //中斷引腳設置為輸入				  
 USBCTL_PORT|=BIT(D12_INT);							  //上拉使能
 USBCTL_PORT|=BIT(WR_N)|BIT(RD_N)|BIT(D12_CS);		  //控制引腳無效
 PORTA|=BIT(CSUSB);									  //送出控制信號
 
 SREG|=BIT(GLOBAL);					//使能全局中斷
 MCUCR&=0xF3;						//外部中斷1采用低電平觸發
 GICR|=BIT(EXTINT1);	//使能外部中斷0和1  
 
 USBCTL_PORT&=~BIT(D12_CS);
}
/*******************************************
函數名稱: OutB
功    能: 向D12寫入一個字節數據或者命令
參    數: cmd--命令標識(為CMD是命令,為DAT是數據)
	  	  dat--要寫入的字節數據
返回值  : 無
/********************************************/
void OutB(uchar cmd,uchar dat)
{
 if(cmd==CMD)
 {
  USBCTL_PORT|=BIT(C_D); 
  Delayus(5);
  USBCTL_PORT&=~BIT(WR_N);
  Delayus(5);
  USBDAT_PORT=dat;  
  Delayus(5);
  USBCTL_PORT|=BIT(WR_N);
 }
 else
 {
  USBCTL_PORT&=~BIT(C_D);
  Delayus(1);
  USBCTL_PORT&=~BIT(WR_N);
  Delayus(1);
  USBDAT_PORT=dat;  
  Delayus(1);
  USBCTL_PORT|=BIT(WR_N);
 }
}
/*******************************************
函數名稱: InB
功    能: 從D12讀出一個字節數據
參    數: 無
返回值  : dat--讀出的字節數據
/********************************************/
uchar InB(void)
{ 
  uchar dat;
  USBDAT_DDR=0x00;
  USBDAT_PORT=0xFF;
  USBCTL_PORT&=~BIT(C_D);
  Delayus(1);
  USBCTL_PORT&=~BIT(RD_N);
  Delayus(1);
  dat=USBDAT_PIN;
  Delayus(1);
  USBCTL_PORT|=BIT(RD_N);
  USBDAT_DDR=0xFF;
  return dat;
}
/*******************************************
函數名稱: Set_addren
功    能: 設置地址/使能----------------------------
參    數: addr--設置的地址
	  	  enable--使能標志(為1使能,為0禁止)
返回值  : 無
/********************************************/
void Set_addren(uchar addr, uchar enable)
{
	if(USB_FLAG.in_isr == 0)
		UEN_GINT();

	OutB(CMD, 0xD0);	//輸出設置地址/使能指令
	Delayus(1);
	if(enable)
	{
		addr|=0x80;		//bit7置1,使能
	}
	Delayus(1);
	OutB(DAT,addr);		//輸出設置值

	if(USB_FLAG.in_isr == 0)
		EN_GINT();
}
/*******************************************
函數名稱: Set_EPen
功    能: 設置端點使能
參    數: enable--使能標志(為1使能,為0禁止)
返回值  : 無
/********************************************/
void Set_EPen(uchar enable)
{
	if(USB_FLAG.in_isr == 0)
		UEN_GINT();

	OutB(CMD,0xD8);	//輸出設置端點使能指令
	Delayus(1);
	if(enable)
		OutB(DAT,1);		//設置端點允許
	else
		OutB(DAT,0);		//設置端點禁止

	if(USB_FLAG.in_isr == 0)
		EN_GINT();
}
/*******************************************
函數名稱: Set_mode
功    能: 設置模式
參    數: config--配置字節信息
	  	  clkdiv--分頻因子
返回值  : 無
/********************************************/
void Set_mode(uchar config,uchar clkdiv)
{
	if(USB_FLAG.in_isr == 0)
		UEN_GINT();

	OutB(CMD,0xF3);		//輸出設置模式指令
	Delayus(1);
	OutB(DAT,config);		//輸出配置字節信息
	OutB(DAT,clkdiv);		//輸出時鐘分頻因數字節

	if(USB_FLAG.in_isr == 0)
		EN_GINT();	
}
/*******************************************
函數名稱: Set_DMA
功    能: 設置DMA工作方式設置
參    數: bMode--設置值
返回值  : 無
/********************************************/
void Set_DMA(uchar bMode)
{
	if(USB_FLAG.in_isr == 0)
		UEN_GINT();

	OutB(CMD, 0xFB);	//設置DMA工作方命令
	Delayus(1);
	OutB(DAT, bMode);		//輸出設置值

	if(USB_FLAG.in_isr == 0)
		EN_GINT();			
}

/*******************************************
函數名稱: Read_IntR
功    能: 讀取中斷寄存器值
參    數: 無
返回值  : intreg--16位中斷寄存器值
/********************************************/
uint Read_IntR(void)
{
	uchar regl;
	uint  intreg;

	OutB(CMD,0xF4);	//讀取中斷寄存器命令
	Delayus(5);
	regl=InB( );			//讀取低8位字節
	intreg=InB( );			//讀取高8位字節

	intreg<<=8;
	intreg+=regl;			//組合為16位

	return intreg;
}
/*******************************************
函數名稱: Sel_EP
功    能: 端點選擇,將內部指針初始化到選擇的緩沖區起始位置
參    數: endp--端點索引號,取值0 ~ 5
返回值  : byte--一個字節的返回數據
/********************************************/
uchar Sel_EP(uchar endp)
{
	uchar byte;
	if(USB_FLAG.in_isr == 0)
		UEN_GINT();

	OutB(CMD,endp);	//端點選擇
	Delayus(1);
	byte=InB( );			//讀出一個字節

	if(USB_FLAG.in_isr == 0)
		EN_GINT();

	return byte;
}
/*******************************************
函數名稱: Sel_EP
功    能: 讀取端點狀態
參    數: endp--端點索引號,取值0 ~ 5
返回值  : status--端點狀態
/********************************************/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
青青草原综合久久大伊人精品优势 | 亚洲mv大片欧洲mv大片精品| 亚洲国产视频一区| 国产综合色产在线精品| 欧美视频在线不卡| 久久久久久久免费视频了| 亚洲欧美日韩在线不卡| 精品无人码麻豆乱码1区2区| 在线这里只有精品| 日本一区二区动态图| 日本不卡视频在线| 日本韩国欧美一区| 亚洲天堂精品在线观看| 国产麻豆9l精品三级站| 欧美一区二区日韩一区二区| 亚洲色图一区二区| 国产精品99久久久久| 日韩视频一区二区三区在线播放| 一区二区三区久久| 99re这里只有精品视频首页| 久久久久久综合| 青娱乐精品在线视频| 欧美日韩成人高清| 亚洲一区影音先锋| 色爱区综合激月婷婷| 国产精品久久午夜夜伦鲁鲁| 国产一区二区精品在线观看| 欧美电影免费观看高清完整版 | 日本美女视频一区二区| 欧美日韩久久一区二区| 久久精品免费观看| 日韩午夜中文字幕| 日韩精品国产精品| 91精品久久久久久久99蜜桃| 婷婷六月综合网| 91精品国产色综合久久ai换脸| 亚洲小少妇裸体bbw| 欧美唯美清纯偷拍| 亚洲综合一区二区精品导航| 91美女在线看| 一区二区三区中文字幕精品精品| 97久久精品人人爽人人爽蜜臀| 国产精品久久久久aaaa樱花| av动漫一区二区| 国产精品久久久久久久久快鸭 | 亚洲成人一二三| 欧美日韩不卡一区| 日本中文字幕一区| 精品精品国产高清a毛片牛牛| 免费在线观看视频一区| 日韩午夜激情视频| 国产jizzjizz一区二区| 国产精品久久久久久久久久久免费看 | eeuss影院一区二区三区| 成人免费在线播放视频| 国产91在线|亚洲| 中文字幕一区二区三区四区不卡 | 国产99久久久精品| 国产农村妇女毛片精品久久麻豆| 国产99久久久精品| 综合av第一页| 欧美一区二区三区四区在线观看| 久久aⅴ国产欧美74aaa| 久久久精品人体av艺术| 91视频国产资源| 视频一区二区不卡| 亚洲国产高清在线| 欧美午夜片在线看| 国产一区二区在线观看免费| 亚洲色图在线视频| 精品欧美一区二区在线观看| 成人手机在线视频| 婷婷久久综合九色综合伊人色| 欧美精三区欧美精三区| 国产v综合v亚洲欧| 亚洲精品国产高清久久伦理二区| 欧美一区二区三区婷婷月色| av影院午夜一区| 麻豆精品一区二区综合av| 国产精品久久久久久久久晋中 | 国产欧美日韩在线观看| 色综合天天天天做夜夜夜夜做| 免费的国产精品| 一区二区三区电影在线播| 26uuu精品一区二区| 在线观看亚洲一区| 成人小视频免费观看| 亚洲第一二三四区| 亚洲欧洲国产专区| 精品国产精品一区二区夜夜嗨| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 久久久久久久久99精品| 欧美日韩一区国产| 不卡一区二区三区四区| 韩国一区二区视频| 日韩1区2区日韩1区2区| 亚洲人成在线播放网站岛国| 久久精品男人的天堂| 日韩女优电影在线观看| 欧美日韩一区高清| 日本韩国欧美一区| 99re在线精品| 成人av电影免费在线播放| 黄色资源网久久资源365| 亚洲bt欧美bt精品| 亚洲精品你懂的| 国产精品丝袜一区| 精品精品国产高清一毛片一天堂| 欧美午夜免费电影| 欧美午夜理伦三级在线观看| 99在线精品一区二区三区| 国产精品性做久久久久久| 精品写真视频在线观看| 久久精品国产免费看久久精品| 日韩成人午夜电影| 免播放器亚洲一区| 免费观看30秒视频久久| 美女视频第一区二区三区免费观看网站| 伊人开心综合网| 亚洲精品视频在线观看免费| 亚洲人成小说网站色在线 | 在线一区二区观看| 一本大道av一区二区在线播放| av不卡免费电影| 99久久国产综合精品女不卡| 99久免费精品视频在线观看| 91在线国内视频| 欧洲另类一二三四区| 欧美三级中文字幕| 4438x亚洲最大成人网| 日韩一级完整毛片| 久久在线免费观看| 国产亚洲成av人在线观看导航| 国产精品麻豆网站| 亚洲特级片在线| 亚洲二区视频在线| 美女在线视频一区| 国产精品一线二线三线精华| 成人久久18免费网站麻豆| 成人午夜在线免费| 日本高清不卡一区| 91精品婷婷国产综合久久竹菊| 精品区一区二区| 亚洲色图19p| 久久精品免费观看| av爱爱亚洲一区| 欧美一区二区三区在线观看| 国产精品久久二区二区| 亚洲综合久久av| 久久99精品久久久久久| 99精品黄色片免费大全| 欧美色中文字幕| 日韩小视频在线观看专区| 日本一区二区视频在线观看| 综合电影一区二区三区 | 精品国产人成亚洲区| 国产精品午夜久久| 午夜精品久久久久久久| 高清视频一区二区| 欧美日韩激情一区二区| 国产欧美一区二区在线观看| 亚洲综合在线第一页| 国产黄色91视频| 日本乱人伦一区| 久久精品综合网| 日本欧美加勒比视频| 色94色欧美sute亚洲线路二| 久久免费看少妇高潮| 首页综合国产亚洲丝袜| av影院午夜一区| 久久久久久久性| 蜜臀精品久久久久久蜜臀| 日本高清不卡aⅴ免费网站| 国产性做久久久久久| 日韩专区在线视频| 91网站黄www| 国产精品污www在线观看| 美女爽到高潮91| 欧美日韩美少妇| 亚洲一区二区三区四区在线观看 | 日本aⅴ免费视频一区二区三区| 成人午夜激情影院| 精品噜噜噜噜久久久久久久久试看 | 91久久精品网| 国产精品久久毛片a| 国产成人激情av| 久久久三级国产网站| 美女看a上一区| 欧美酷刑日本凌虐凌虐| 亚洲一级二级在线| 91高清视频免费看| 亚洲精选在线视频| 91精品国产欧美一区二区18| 一区二区三区在线观看动漫| av在线这里只有精品| 国产精品毛片大码女人| caoporn国产一区二区| 国产精品无码永久免费888| 成人av在线观| 亚洲欧美在线视频观看|