⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usb.c

📁 基于ADU812+PDIUSBD12的数据采集板源代码发布!这一回是用C写的!!!!!强烈推荐
💻 C
字号:
//usb.c
#include "head.c"
#include "ADUC812.H"
#include "stdio.h"
//#include "USB_protocol.c""


/////////////////////////////////////////////////////////////////////
union rec_data_cache//数据接收缓冲 
{
 struct setup_package//setup包专用区
 {
 unsigned char RequestType;
 unsigned char Request;
 unsigned char ValueL;       
 unsigned char ValueH;  
 unsigned char IndexL;
 unsigned char IndexH;
 unsigned char LengthL;
 unsigned char LengthH;       
 //int b;
 //int c;
 //int d;
 }setup; 
unsigned char buffer[64];
struct cbw_package//CBW包专用区
{unsigned long dCBWSignature;//offset 0
 unsigned long dCBWTag;//offset 4
 unsigned long dCBWDataTransferLength;//offset 8
 unsigned char bmCBWFlags;//offset 12 
 unsigned char bCBWLUN;
 unsigned char bCBWCBLength;//offset 14
 unsigned char CBWCB_Operation_Code;                  
 unsigned char CBWCB_Logicol_unit_Number;//offset 16                 
 unsigned long CBWCB_Logical_block_address;//offset 17                 
 unsigned long CBWCB_length;//offset 21               
 unsigned char CBWCB10;                 
 unsigned char CBWCB_control;                                  
 unsigned char CBWCB12;                
 unsigned char CBWCB13;               
 unsigned char CBWCB14;                
 unsigned char CBWCB15;//offset 30         
 }CBW;
}USB;
unsigned long dCBWTag;
//unsigned long dCSWDataResidue;
//unsigned char bCSWStatus;
/////////////////////////////////////////
 bit bulk_Transfer_data;     //bulk数据
 bit bulk_Transfer_code;     //bulk命令
 bit bsetup                 ;//:1;//收到setup包标志位
 bit bSuspend               ;//:1;//挂起标志位
 bit bBusreset              ;//:1;//总线复位标志位
 bit bEndpointRequest       ;//:1;//对端点请求处理标志位
 bit bInterfaceRequest      ;//:1;//对接口请求处理标志位
 bit bBusDataPID            ;//:1;//设备端当前传送数据pid
 bit bDataTransmittal       ;//数据传送状态标识
 bit bconfiguration         ;//;配置标志位
 bit ADbusy                 ;//AD忙碌
////////////////////////////////////////////////////
//extern void StandardRuest(void);//标准请求处理 
extern code unsigned char DDescriptor[18];
extern code unsigned char SDescriptor[46];
extern code unsigned char subitID[];
extern code unsigned char subit1[];
extern code unsigned char subit2[];
extern code unsigned char subit3[];
extern code unsigned char subit4[];
extern code unsigned char subit5[];
extern code unsigned char INQUIRYinformation[36];
//extern code unsigned char audio[5360];//={//0x14f0//
void UsbMassStorgeClassRequest(void);
extern void DAC(void);//DA转换
///////////////////////////////////////////////////////
void T0_initializtion(void);//初始化定时器0
void ADC(void);//AD转换
//////////////////////////////////////////////////////
//公用函数
unsigned char  read_d12(unsigned int rp)//d12读函数
{
unsigned char xdata *data p;
p=rp;
return(*p);
}

void write_d12(unsigned char wd,unsigned int wp)//d12写函数     
{
unsigned char xdata *data p;
p=wp;
*p=wd;
return ;
}

void AcknonwledgeEndpoint (unsigned char point)//端点应答
{
write_d12(point,order);
write_d12(0xf1,order);
if(point==0)
write_d12(0xf2,order);
return;}

/*
void EndpointStop(unsigned char point)//停止握手
{
write_d12(point|0x40,order);
write_d12(0x01,digital);
return;} 
*/

/*void UnLinkUSB(void)//断开usb总线
{
write_d12(0xf3,order);
write_d12(0x0e,digital);
return;}
*/
void ReLinkUSB()//重连usb ()(重连后时钟从4M->16M)12m
{
/*unsigned int a;
 
write_d12(0xF3,order);//0xF3
write_d12(0x0e,digital);//0x0e
write_d12(0x0b,digital);//0x0b
for(;a<=0x00ff;)
{a++;
}*/
write_d12(0xF3,order);//0xF3
//write_d12(0x0e,digital);//0x0e
write_d12(0x16,digital);//0x16
write_d12(0x03,digital);//0x03;分频系数16
 
return;
}

/*void GetAddress(void)//设置地址
{
write_d12(0xd0,order);
write_d12(USB.setup.ValueL|0x80,digital);
return;
}*/


/*void Rorder(void)//发送恢复命令
{
return;}
*/

/*void stall(void)//stall握手
{
write_d12(0x40,order);
write_d12(0x01,digital);
write_d12(0x41,order);
write_d12(0x01,digital);
write_d12(0x42,order);
write_d12(0x01,digital);
write_d12(0x43,order);
write_d12(0x01,digital);
write_d12(0x44,order);
write_d12(0x01,digital);
write_d12(0x45,order);
write_d12(0x01,digital);
return;}
*/
void SetEndpointEnable_No(unsigned char i)//普通/同步端点使能_禁止
{
write_d12(0xd8,order);
write_d12(i,digital);
return;}


/*void Endpointnew(unsigned char point)//端点刷新
{
write_d12(point|0x40,order);
write_d12(0x00,digital);
return;}
*/

//USB;
unsigned char read_point(unsigned char point)//读端点
{
unsigned char buffer_long=0;
unsigned char j;
j=0;
write_d12(point,order);
buffer_long=read_d12(digital);
write_d12(point|0x80,order);
buffer_long=read_d12(digital);
if(buffer_long^2)
{bsetup=1;}
write_d12(0xf0,order);
buffer_long=read_d12(digital);
buffer_long=read_d12(digital);
  if(buffer_long!=0)//
   {while(j<buffer_long)
     {
     USB.buffer[j]=read_d12(digital);
	 j=j+1;
	 }
 	 write_d12(0xf2,order);
   }
  else
  {
  AcknonwledgeEndpoint (0x00);
  AcknonwledgeEndpoint (0x01);
  }
return buffer_long;
}

void write_point(unsigned char point,buffer_long)//写端点
{
unsigned char nextsendL,j=0;
if(/*(point==0x02)||*/(point==0x03))
  {
    if(bDataTransmittal==1)
    {j=USB.setup.RequestType;}
    if(buffer_long>16)
    {bDataTransmittal=1;
	 nextsendL=buffer_long-16;
     buffer_long=16;
	}
    else
    {bDataTransmittal=0;
	}
  }
write_d12(point,order);
write_d12(0xf0,order);
write_d12(0x00,digital);
write_d12(buffer_long,digital);
while(j<buffer_long)
     {
     write_d12(USB.buffer[j],digital);
	 j=j+1;
	 }
if(bDataTransmittal==1)
{USB.setup.RequestType=j;
USB.setup.Request=nextsendL;}
write_d12(0xfa,order);//写数完毕使能缓冲区
write_d12(point+1,order);///发数之前将指针切换到out区
return;
}


///////////////////////////////////////
////////////标准设备请求处理

/*void GetStatus(void)//获取状态
{
return;}
void ClearFeature(void)//清除特性选择符
{
return;}
void SetFeature(void)//设置特性选择符
{
return;}

void SetAddress(void)//分配地址
{
return;}
*/
/*void GetDescriptor(void)//获取描述符(类型)
{
return;}*/



void StandardRuest(void)//标准请求处理
{
/*if(USB.setup.Request==0x00)
  {GetStatus();}//获取状态
if(USB.setup.Request==0x01)
  {ClearFeature();}//清除特性选择符
if(USB.setup.Request==0x03)
  {SetFeature();} //设置特性选择符
*/
  
if(USB.setup.Request==0x05)
  {/*GetAddress;*/
  write_d12(0xd0,order);
  write_d12(USB.setup.ValueL|0x80,digital);
  write_point(0x01,0);}//分配地址
else if(USB.setup.Request==0x06)
     {/*GetDescriptor;*/
        if(USB.setup.ValueH==0x01)//获取设备描述符
         { 
		 unsigned char i=0;
		 if(USB.setup.LengthL==0x40){USB.buffer[63]=0x10;}
	     else{USB.buffer[63]=USB.setup.LengthL;}
	       while (i<18)
	       {USB.buffer[i]=DDescriptor[i];i=i+1;}
         write_point(0x01,USB.buffer[63]);
         }
         else if(USB.setup.ValueH==0x02)//获取配置描述符 
         {
         unsigned char i=0;
		 if(USB.setup.LengthL==0xff){USB.buffer[63]=0x2e;}
	     else{USB.buffer[63]=USB.setup.LengthL;}
	       while (i<46)
	       {USB.buffer[i]=SDescriptor[i];i=i+1;}
         write_point(0x01,USB.buffer[63]);
         }
        else if(USB.setup.ValueH==0x03);//获取字符串描述符
		{ unsigned char i=0;
		      if(USB.setup.ValueL==0x00){while(i<subitID[0]){USB.buffer[i]=subitID[i];i=i+1;}
         write_point(0x01,subitID[0]);}
         else if(USB.setup.ValueL==0x01){while(i<subit1[0]){USB.buffer[i]=subit1[i];i=i+1;}
         write_point(0x01,subit1[0]);}
		 else if(USB.setup.ValueL==0x02){while(i<subit2[0]){USB.buffer[i]=subit2[i];i=i+1;}
         write_point(0x01,subit2[0]);}
		 else if(USB.setup.ValueL==0x03){while(i<subit3[0]){USB.buffer[i]=subit3[i];i=i+1;}
         write_point(0x01,subit3[0]);}
		 else if(USB.setup.ValueL==0x04){while(i<subit4[0]){USB.buffer[i]=subit4[i];i=i+1;}
         write_point(0x01,subit4[0]);}
		 else if(USB.setup.ValueL==0x05){while(i<subit5[0]){USB.buffer[i]=subit5[i];i=i+1;}
         write_point(0x01,subit5[0]);}
		 
		}
      }//获取描述符(类型)
if(USB.setup.Request==0x07)
  {/*SetDescriptor;*/}//;设置描述符类型
if(USB.setup.Request==0x08)
  {USB.buffer[0]=bconfiguration;
   write_point(0x01,1);   
     /*GetConfiguration;*/}//;读配置值

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -