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

📄 d12.c

📁 c51单片机+pdiusbd12芯片的假u盘设计
💻 C
📖 第 1 页 / 共 2 页
字号:
		{0x07,0x05,0x02,0x02,0x4000,0}
	}
};






//D12底层硬件接口函数
void Write_Com(uchar idata A)   //写命令到D12
{D12_A0=1;D12_Data=A;D12_WR=0;D12_WR=1;}

void Write_Data(uchar idata B)  //写数据到D12
{D12_A0=0;D12_Data=B;D12_WR=0;D12_WR=1;}

uchar Read_Data()		//从D12读数据
{uchar idata C;D12_A0=0;D12_RD=0;C=D12_Data;D12_RD=1;return C;}
//D12底层硬件接口函数

void Enable_Enp()
{
	Write_Com(enable_enp);
	Write_Data(0x01);	
}
void Set_Address(uchar idata add)
{
	Write_Com(set_address);
	Write_Data(add|0x80);
	Enable_Enp();
}
void Set_Mode(uchar idata A,uchar idata B)
{
	Write_Com(set_mode);
	Write_Data(A);
	Write_Data(B);	
}

void D12_Init()
{
	TMOD=0X20;
	TH1=TL1=0XF3;
	SCON=0X50;
	TR1=1;
	TI=1;
//设定波特率
	Set_Mode(0x0e,0x47);//断开D12连接
	Set_Address(0x00);//设置默认地址,使能端点
	Set_Mode(0x1e,0x47);//连接D12连接
	printf("初始化D12完毕\n");	
}

void Read_Interrupter_Register()
{
	uchar temp;
	Write_Com(read_interrupter_register);
	temp=Read_Data();
	Interrupter_register=temp;
	Interrupter_register=Interrupter_register<<8;
	temp=Read_Data();
	Interrupter_register=Interrupter_register|temp;
}


uchar Read_Enp_Last_Status(uchar idata enp)
{
	Write_Com(enp+0x40);
	return Read_Data();	
}

uchar Select_Enp(uchar idata enp)
{
	Write_Com(enp);
	return Read_Data();	
}

uchar Read_Enp_Status(uchar idata enp)
{
	Write_Com(enp+0x80);
	return Read_Data();
}

void Validate(uchar idata enp)
{
	Select_Enp(enp);
	Write_Com(0xfa);
}


uchar Read_Enp_Buffer(uchar idata enp,uchar idata len,uchar *pData)
{
	uchar length,i;
	while(!(Select_Enp(enp)&Enp_Full_Empty));//端点接满了数据
	Write_Com(0xf0);                         //
	Read_Data();	
	length=Read_Data();
	if(length<len)
	len=length;
	//printf("输入"); 
	for(i=0;i<len;i++)
	{
		*(pData+i)=Read_Data();
	//	printf("%x ",(uint16)*(pData+i)); 
	}
	//printf("\n");
	return len;
}


void Write_Enp_Buffer(uchar idata enp,uchar idata len,uchar * pData)
{
	uchar i;
	Select_Enp(enp);
	Write_Com(0xf0);
	Write_Data(len);     
	Write_Data(len);
	//printf("输出");	
	for(i=0;i<len;i++)
	{
		Write_Data(*(pData+i));
	//	printf("%x  ",(uint16)*(pData+i)); 
	}
	//printf("\n");
	Validate(enp);	
}

void ACK(uchar idata enp)
{
	Select_Enp(enp);
	Write_Com(0xf1);	
}

void Clean_Enp_Buffer(uchar idata enp)
{
	Select_Enp(enp);
	Write_Com(0xf2);	
}




void Get_Device_Descriptor()
{
	Device_Request_Buffer.pData=(uchar *)(&Device_Descriptor);
	if(Device_Request_Buffer.wLength>sizeof(Device_Descriptor)) 
		Device_Request_Buffer.wLength=sizeof(Device_Descriptor);	
}

void Get_Construction_Descriptor()
{
	Device_Request_Buffer.pData=(uchar *)(&Con_Inter_Endp_Descriptor);
	if(Device_Request_Buffer.wLength>sizeof(Con_Inter_Endp_Descriptor)) 
		Device_Request_Buffer.wLength=sizeof(Con_Inter_Endp_Descriptor);		
}


void Set_D12_Address()
{
	Set_Address(LSB(Device_Request_Buffer.Device_Request.wValue));	
}

void Get_Max_Lun()
{
	Device_Request_Buffer.wLength=1;
	Device_Request_Buffer.pData=&Max_Lun;
}

void Fail()
{
	csw.dCSWSignature=0x55534253;
	csw.dCSWTag=cbw.dCBWTag;
	csw.dCSWDataResidue=0;
	csw.bCSWStatus=1;
	Write_Enp_Buffer(5,sizeof(CSW),(uchar *)(&csw));
	Soft_Flag.success=0;		
	Soft_Flag.Enp4=0;
	Soft_Flag.Enp5=0;
	Soft_Flag.Allow_Main_In=0;
	Soft_Flag.Data=0;	
}


void Success()
{
	csw.dCSWSignature=0x55534253;
	csw.dCSWTag=cbw.dCBWTag;
	csw.dCSWDataResidue=0;
	csw.bCSWStatus=0;
	Write_Enp_Buffer(5,sizeof(CSW),(uchar *)(&csw));
	Soft_Flag.success=0;		
	Soft_Flag.Enp4=0;
	Soft_Flag.Enp5=0;
	Soft_Flag.Allow_Main_In=0;
	Soft_Flag.Data=0;
}


void Inquire1()
{
	Write_Enp_Buffer(5,36,Inquire);
//	wCount=36;
//	printf("Inquire!\n");
}


void Read_Format_Cap()
{
	Write_Enp_Buffer(5,20,Format_Cap);
//	wCount=20;	
//	printf("Format_Cap\n");
}

void Request_Sense()
{	
	Write_Enp_Buffer(5,0x12,Sense);	
}


void Read_Cap()
{
	Write_Enp_Buffer(5,8,Cap);
//	wCount=8;
//	printf("Read Cap!\n");	
}

void Read10()
{			
	if(cbw.cbwcb.LBA==0)
		Device_Request_Buffer.pData=DBR;
	Soft_Flag.Data=1;			
}

//void Mode_Sence6()
//{
	
//}

void Enp0()
{
	Device_Request_Buffer.wLength=0;
	Device_Request_Buffer.wCount=0;
	if(!(Read_Enp_Last_Status(0)&Setup_Pack))
	{return;}//printf("PC return ACK!");
	//接受到的是一个setup包

⌨️ 快捷键说明

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