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

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

?? usb.c

?? 在C51上 mp3 開發程序 32M MP3 MP3功能的測試源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:

/*********************************************************************************************************
**                                        
**                                  MP3 and U Disk Source Code
**                           Copyright (c) 2005,北京博創興業科技有限公司
**                                      All Rights Reserved
**                                           V3.00.0
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名:	 USB.C
**創   建   人:	 Frank   Wang Xiao Jun
**創 建  日 期:  2003.12
**描        述:  ATMEL AT89C51SND1單片機USB硬件寄存器的配置以及Bulk_Only協議和U盤的實現
**
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: 	Frank   Wang Xiao Jun
** 版  本:	V1.00.0
** 日 期: 	2003.12
** 描 述:  ATMEL AT89C51SND1單片機USB硬件寄存器的配置以及Bulk_Only協議和U盤的實現
**
**------------------------------------------------------------------------------------------------------
** 修改人:	Kent   Zou Ying
** 版  本:  V2.00.0
** 日 期:	2004. 5
** 描 述:	ATMEL AT89C51SND1單片機USB硬件寄存器的配置以及Bulk_Only協議和U盤的實現
**
**--------------當前版本修訂------------------------------------------------------------------------------
** 修改人: 	Phoenix    Hua Yue Guang
** 版  本:  V3.00.0
** 日 期:	2005.3
** 描 述:	ATMEL AT89C51SND1單片機USB硬件寄存器的配置以及Bulk_Only協議和U盤的實現
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "REGSND1.H"
#include "USBDEF.H"
#include "UART.h"
/*
//時鐘參數宏
#define		Rdiv    	11
//USB寄存器設置相關的宏定義
#define		PLLRES		(0x1<<3)        //PLLCON
#define		PLLEN		(0x1<<1)
#define		USBE		(0x1<<7)        //USBCON
#define 	EEOFINT		(0x1<<4)
#define 	FEN			(0x1<<7)
#define 	FADDEN		(0x1)
#define 	CONFG		(0x1<<1)
#define 	DIR			(0x1<<7)		//UEPSTAX
#define 	RXOUTB1		(0x1<<6)
#define 	STALLRQ		(0x1<<5)
#define 	TXRDY		(0x1<<4)
#define 	STLCRC		(0x1<<3)
#define 	RXSETUP		(0x1<<2)
#define 	RXOUTB0		(0x1<<1)
#define 	TXCMP		(0x1<<0)

//USB 請求的bRequert的含意宏
#define	get_status			0x00		//取得狀態
#define	clear_feature 		0x01		//清除特性
#define	reserved			0x02		//保留
#define	set_feature			0x03		//設置特性

#define	set_address			0x05		//設置地址
#define	get_descriptor		0x06		//取得描述符

#define	get_configuration	0x08		//取得配置
#define	set_configuration	0x09		//設置配置
#define	get_interface		0x0a		//取得接口
#define	set_interface		0x0b		//設置接口



void AtmelUSBInit()		//用于USB的PLL時鐘20M晶振時如下設置
{
	int data i;	
	PLLNDIV	=	0x04;                     //設置PLL時鐘
	PLLCON |=	(0x3&Rdiv)<<6;
	PLLRDIV	=	(0x3ff&Rdiv)>>2;
	USBCLK=0;
	PLLCON&=(~PLLRES);                    //使能PLL
	PLLCON|=PLLEN;               
	USBCON&=(~USBE);                      //關閉USB并復位USB
	for(i=0;i<3000;i++);                  //等待PLL工作穩定
	USBCON|=USBE;                         //開啟USB控制器

}	

void EpEnable(void)				          //初始化USB端點
{
	UEPNUM=0x00;	UEPCONX=0x80;
	UEPNUM=0x01;	UEPCONX=0x86;
	UEPNUM=0x02;	UEPCONX=0x82;
	UEPRST=0x07;	UEPRST= 0x00;
	UEPIEN=0x07;	USBIEN|=EEOFINT;
	USBADDR=FEN;
}

unsigned char ReadEp(unsigned char EpNum,unsigned char *Data)   //讀取端口數據
{
	unsigned char data i=0;
	UEPNUM=EpNum;			 	          //指端口號
	while(i<UBYCTLX)	                  //讀數據到緩沖//UBYCTX得到數據長度
	{
		Data[i++]=UEPDATX;
	}	
	UEPSTAX&=~(RXOUTB0|RXOUTB1|RXSETUP);    				    //清除相關位
	return(i);
}

void WriteEp(unsigned char EpNum,unsigned char nLength,unsigned char *Data)     //寫端口數據
{
	unsigned char data i=0;
	UEPNUM=EpNum;											     //選擇端口
	UEPSTAX|=DIR;											     //控制方向
	while(nLength--) UEPDATX=Data[i++];	                         //寫入FIFO
	UEPSTAX|=TXRDY;											     //開始發送
	while(!(UEPSTAX&TXCMP)) ;
	UEPSTAX&=(~(TXCMP));								         //清除TXCMP
}

//-------------以下用于對端點進行處理

void Set_Address(unsigned char EpNum)	                         //設置USB地址1-127
{
	WriteEp(0,0,0);											     //在Status階段過后才能改變設備地址
	USBADDR|=EpNum;
	USBADDR|=FEN;											     //設置地址
	USBCON|=FADDEN;											     //地址使能
}

//設備描述符
code unsigned char Device_Descriptor[18] = {
								    	 0x12,			   //0x12
										 0x01,             //DEVICE descriptor
										 0x10, 0x01,       //spec rev level (BCD) 1.0
										 0x0,              //device class
										 0x0,              //device subclass
										 0x0,              //device protocol
										 0x20,             //max packet size
										 0x05, 0x82,       //National's vendor ID
										 0x00, 0x11,       //National's product ID  
										 0x00, 0x00,       //National's revision ID  
										 0,                //index of manuf. string   
										 0,                //index of prod.  string  
										 0,                //index of ser. # string   
										 0x01              //number of configs. 	
									};
//配置描述符
code unsigned char Configuration_Descriptor_All[32] = {

									    9,                 //Size of Descriptor in Bytes
									    2,                 //Configuration Descriptor (0x02)
									    0x20,              //Total length in bytes of data returned  LSB
										0x00,              //MSB
										1,                 //Number of Interfaces
										1,                 //Value to use as an argument to select this configuration
									    0,                 //Index of String Descriptor describing this configuration
										0x80,
										0xfa,              //Maximum Power Consumption in 2mA units 
									
									    9,
									    4,
									    0,                 //the index of the interface descriptor Number of Interface
									    0,                 //Value used to select alternative setting
										2,                 //EndPoint Number Used in this Descriptor
										8,                 //Class Code (Assigned by USB Org)
										6,	               //interface subclass1=RBC,2=SFF,3=QIC,4=UFI,5=SFF,6=SCSI
										0x50,              //bulk 0nly Transport
										0,                 //Index of String Descriptor Describing this interface

										                   //Bulk-in Endpoint
										 0x07,             //length of this desc.   
										 0x05,             //ENDPOINT descriptor TYPE
										 0x81,             //address (IN) Endpoint 4 84
										 0x02,             //attributes  (BULK)    
										 0x40, 0x00,       //max packet size (64)  
										 0x0,              //Does not apply to Bulk endpoints
							
										                   //Bulk-out Endpoint
										 0x07,             //length of this desc.   
										 0x05,             //ENDPOINT descriptor TYPE
										 0x02,             //address (OUT) Endpoint 5 05
										 0x02,             //attributes  (BULK)
										 0x40, 0x00,       //max packet size (64)
										 0x0               //Does not apply to Bulk endpoints
										};

void Get_Descriptor(unsigned char DesType,unsigned char nLength)           //得到描述符
{
	if(DesType==0x01)													   //取設備描述符
		WriteEp(0,18,Device_Descriptor);

	if((DesType==0x02)&&(nLength==0x09))					               //取端口描述符
		WriteEp(0,9,Configuration_Descriptor_All);

	if((DesType==0x02)&&(nLength==0xff)) 					               //取端點描述符
	{
	    WriteEp(0,32,Configuration_Descriptor_All);
	    WriteEp(0,2,&Device_Descriptor[4]);
	}

	if((DesType==0x02)&&(nLength==0x20)) 
		WriteEp(0,32,Configuration_Descriptor_All);	                       //取配置描述符
}

void Set_Configuration(unsigned char wValue)		//設置配置
{
  if(wValue == 0)
  {
		UEPNUM=0x00;	UEPCONX=0x80;
		UEPNUM=0x01;	UEPCONX=0x86;
		UEPNUM=0x02;	UEPCONX=0x82;
		USBCON&=(~CONFG);
		WriteEp(0,0,0);								//狀態傳送階段之前完成指定操作
  }
  else if(wValue == 1) 
  {
		UEPNUM=0x00;	UEPCONX=0x80;
		UEPNUM=0x01;	UEPCONX=0x86;
		UEPNUM=0x02;	UEPCONX=0x82;
		USBCON|=CONFG;
		WriteEp(0,0,0);								//狀態傳送階段之前完成指定操作
  }
}

void Ep0()                                          //---端點0處理主函數
{
  unsigned char data DT[32]={0,};
  unsigned char data i;
  i = ReadEp(0,DT);
  if (((DT[0] & 0x60)==0) && i)
  {
    switch (DT[1])
    {
      case set_address				:Set_Address(DT[2]);			break;  //設置地址
      case get_descriptor			:Get_Descriptor(DT[3],DT[6]);	break;  //取描述符
      case set_configuration	    :Set_Configuration(DT[2]);		break;  //設置配置
      default						:;					            break;
	}
  }
  else if(DT[0]==0xa1)								//非標準USB請求
	{
		WriteEp(0,0,0);
	}							  						
}

//-----------------------------------------------------------------------------/
//                   以下為利用Bulk_Only傳輸協議的函數部分                  //
//-----------------------------------------------------------------------------/
unsigned char data bulk_CSW[]={0x55,0x53,0x42,0x53,	// bytes 4 dCSWSignature
					      0x00,0x00,0x00,0x00,	    //bytes 4  dCSWTag
					      0x00,0x00,0x00,0x00,		//bytes 4 dDataResiduce
					      0x00};			        //bCSWStatus  00=good state.

typedef struct _STRUCT_CBW
{
	unsigned char CBWCB[12];                        //for UFI Command all have 12bit

} struct_CBW;

struct_CBW data bulk_CBW;

void WriteEpBulk(unsigned char EpNum,unsigned char nLength,unsigned char *Data)
{
	unsigned char data i;
	UEPNUM=EpNum;			                        //---設置端點號
	UEPSTAX|=DIR;			                        //...設置為In模式
	for(i=0;i<nLength;i++) UEPDATX=Data[i];         //---填緩沖區
	UEPSTAX|=TXRDY;		                            //---發送數據
}

void TransmitCSW()									//向Host返回CSW
{
  WriteEpBulk(1, sizeof(bulk_CSW), bulk_CSW);
  while(!(UEPSTAX&TXCMP)) ;
  UEPSTAX&=(~(TXCMP));				                //清除TXCMP
  UEPINT = 0;
}

void main_txdone()					                 //數據發送完畢給出回復
{
  UEPSTAX&=(~(TXCMP));				                 //清除TXCMP
  TransmitCSW();
}

//////////////////////////////////有關輸出端點的調用//////////////////////////////////////////////
#define Inquiry							0x12
#define	Mode_Sense						0x1A
#define	Read10							0x28
#define Read_Capacity 					0x25 
#define Read_Format_Capacities 	        0x23 
#define Test_Unit_Ready 				0x00 
#define Verify 							0x2F 
#define Write10 						0x2A 
#define Medium_Removal					0x1E

#define SCSI_MSPGCD_TPP		    	    0x1C
#define SCSI_MSPGCD_RETALL			    0x3F

//SCSI-Inquiry命令的返回數據  
code unsigned char B_InquiryData[] = {
							0x00,	                       //Direct Access Device
							0x80,	                       //RMB
							0x00,	                       //ISO/ECMA/ANSI
							0x01,	                       //Response Data Format
							0x1f,	                       //Additional Length
							0x00,	                       //Reserved
							0x00,	                       //Reserved
							0x00,	                       //Reserved 
							'U', 'P', '-', 'T', 'E', 'C', 'H', ' ',	       //Vendor Information
							'M', 'P', '3', ' ', 'P', 'l', 'a', 'y', 'e', 'r', ' ', 'V', '3', '.', '0', '0',//Product Identification
							0, 0, 0, 0};	               //Product Revision Level n.nn

//SCSI-Read_Format_capacities命令的返回數據	 
code unsigned char B_Read_Format_capacities[] = {0x00, 0x00, 0x00, 0x10,	        //capacity list header
									0x00, 0x00, 0x07, 0xf5,	0x01, 0x00, 0x02, 0x00,	//capacity descriptor
								    //Number of Blocks =2037,unformatted media,blocklength = 512Bytes
									0x00, 0x00, 0x07, 0xfd,	0x00, 0x00, 0x02, 0x00  //Formattable Capacity Descriptors
									};
//SCSI-Read_Capacity命令的返回數據
code unsigned char B_Read_Capacity[] = {
								0x00, 0x00, 0xfe, 0xa0,	   //Last  Logical Block Address for 32MB 
								0x00, 0x00, 0x02, 0x00	   //block length in bytes
								};
//SCSI-Mode_Sense命令的返回數據    	   		

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人精品在线观看| 国产日韩欧美精品一区| 亚洲午夜羞羞片| 欧美性猛片xxxx免费看久爱| 中文字幕欧美一区| 91女神在线视频| 夜夜操天天操亚洲| 欧美日本在线视频| 精品一区二区在线看| 日韩美女在线视频 | 精品久久久久久久久久久久包黑料 | 中文字幕在线免费不卡| 99久久精品国产一区| 亚洲伦理在线精品| 欧美日韩国产精品成人| 狠狠色狠狠色综合日日91app| 亚洲精品一区二区三区四区高清| 国产精品2024| 一区二区三区四区五区视频在线观看 | 亚洲人妖av一区二区| 色就色 综合激情| 日韩精品成人一区二区三区| 精品电影一区二区三区| 成人午夜碰碰视频| 亚洲国产精品一区二区www在线| 欧美日韩成人高清| 国产盗摄视频一区二区三区| 亚洲精品水蜜桃| 欧美一二三区在线| 成人黄色a**站在线观看| 亚洲午夜日本在线观看| 国产性色一区二区| 欧美日韩亚洲另类| 成人天堂资源www在线| 婷婷一区二区三区| 17c精品麻豆一区二区免费| 欧美一区二区视频在线观看2020| 成人夜色视频网站在线观看| 亚洲高清在线视频| 欧美国产成人精品| 欧美一卡二卡三卡| 在线免费观看不卡av| 韩国成人福利片在线播放| 亚洲曰韩产成在线| 亚洲少妇最新在线视频| 久久一二三国产| 欧美日韩久久久久久| 婷婷成人激情在线网| 久久色.com| 日韩欧美一卡二卡| 99国产精品久久久久久久久久| 日日夜夜精品视频免费| 日本一区二区三区四区| 欧美老肥妇做.爰bbww| 国产一区二区调教| 亚洲成a人v欧美综合天堂下载 | 欧美日韩不卡视频| 成人在线视频一区二区| 午夜精品123| 中文字幕乱码亚洲精品一区 | 亚洲裸体在线观看| 色激情天天射综合网| 国产在线精品一区二区夜色 | 91久久线看在观草草青青| 国产精品亚洲人在线观看| 亚洲一区二区三区四区的| 国产情人综合久久777777| 欧美日韩一卡二卡| www.欧美色图| 国产精品夜夜嗨| 蜜臀av性久久久久蜜臀aⅴ | 亚洲视频精选在线| 日韩精品一区二区三区在线| 欧美探花视频资源| 精品一区二区三区在线观看| 日韩中文字幕区一区有砖一区| 国产精品丝袜一区| 日韩精品资源二区在线| 欧美日韩国产综合久久| 91麻豆视频网站| 懂色中文一区二区在线播放| 国产在线精品视频| 男人的天堂亚洲一区| 午夜一区二区三区视频| 国产精品成人免费| 久久久久久毛片| 欧美精品一区二区精品网| 欧美亚洲动漫制服丝袜| 成人理论电影网| 高清beeg欧美| 成人精品在线视频观看| 国产成人一区在线| 成人黄色片在线观看| 成a人片国产精品| 成人福利电影精品一区二区在线观看| 午夜欧美视频在线观看| 免费成人美女在线观看| 日韩国产欧美视频| 中文字幕一区二区三中文字幕| 亚洲天堂2016| 亚洲影院免费观看| 午夜精品一区二区三区免费视频| 香蕉av福利精品导航| 亚欧色一区w666天堂| 日本欧美加勒比视频| 久久超碰97中文字幕| 精品一区免费av| 不卡电影免费在线播放一区| 91亚洲精华国产精华精华液| 色婷婷香蕉在线一区二区| 在线亚洲+欧美+日本专区| 欧美三级日本三级少妇99| 日本精品视频一区二区三区| 色视频成人在线观看免| 欧美色窝79yyyycom| 欧美精三区欧美精三区| 91精品国产福利| 久久青草国产手机看片福利盒子 | 精品国免费一区二区三区| 久久蜜桃av一区精品变态类天堂| 国产欧美日韩另类视频免费观看| 中文av字幕一区| 一区二区免费看| 日韩电影在线观看一区| 黑人巨大精品欧美一区| 国产精品66部| 在线观看中文字幕不卡| 欧美一区二区三区系列电影| 国产日韩欧美a| 中文字幕精品在线不卡| 三级久久三级久久久| 国产一区二区网址| 91行情网站电视在线观看高清版| 欧美一级日韩免费不卡| 欧美国产精品一区| 亚洲地区一二三色| 狠狠色综合播放一区二区| 色综合天天综合| 日韩免费高清视频| 一区二区三区中文字幕精品精品| 日本不卡1234视频| 成人国产精品免费| 91精品国产色综合久久久蜜香臀| 国产欧美综合在线观看第十页 | 欧美无砖砖区免费| 国产日韩av一区| 日产国产高清一区二区三区| 粉嫩av亚洲一区二区图片| 91精品蜜臀在线一区尤物| 国产精品麻豆久久久| 看国产成人h片视频| 色综合久久综合| 欧美va亚洲va| 亚洲成人午夜电影| kk眼镜猥琐国模调教系列一区二区| 99久久国产综合精品女不卡| 久久精品综合网| 免费成人在线视频观看| 欧美性高清videossexo| 国产精品久久久久一区二区三区| 美女在线一区二区| 99久久综合狠狠综合久久| 亚洲国产精品久久艾草纯爱| 精品美女一区二区三区| 天天综合色天天综合色h| 中文字幕一区二区三区在线播放 | 国产成人免费xxxxxxxx| 欧美一区二区免费观在线| 五月婷婷久久丁香| 国内偷窥港台综合视频在线播放| 亚洲欧美日韩在线不卡| 毛片av中文字幕一区二区| 国内成+人亚洲+欧美+综合在线 | 欧美精品丝袜中出| 亚洲综合一区二区精品导航| 91社区在线播放| 中文字幕av一区二区三区高| 激情五月激情综合网| 日韩三区在线观看| 日韩极品在线观看| 91精品国产综合久久久久| 亚洲第一二三四区| 在线观看亚洲一区| 欧美大白屁股肥臀xxxxxx| 日日夜夜免费精品视频| 91精品婷婷国产综合久久竹菊| 亚洲福利视频三区| 欧美精品少妇一区二区三区| 一二三区精品福利视频| 欧美综合色免费| 天天综合日日夜夜精品| 91精品国产美女浴室洗澡无遮挡| 丝袜国产日韩另类美女| 在线免费精品视频| 日本成人在线视频网站| 日韩视频一区二区三区在线播放| 蜜桃视频在线一区| 久久美女艺术照精彩视频福利播放| 国产精品一级片| 国产精品大尺度|