Fifo_Addr[O]=buffer[i];//将要发送的数据放至相应的Fifo中
DeIay_28us();
if(MlSC&0x40=0)break;//N
otReady
}
MlSC工0X02;//改变TX位状态
DeIay_3us();
MISC&^OXFE;//ClearRequest
}
BOOLCheck_Real_Cmd()
{
BYTEbFlag_Real_Cmd二FALSE;
if(MlSC&0X20!
=0)bFIag_ReaI_Cmd=T
RUE;
if(MlSC&0X80!
二0)bFIag_ReaI_Cmd二T
RUE;
returnbFlag_Real_Cmd;
voidSendhand()
BOOLIsReaICmd,Status_FIag;
while
(1)
{
IsReaICmd=Check_Real_Cmd();
if(IsReaICmd二二TRUE)
return;
eIse
{
Status_FIag二FIFO_WR_CHECK
(0);
if(Status_FIag&OxOf!
二0)//Fifo_Ready
break;
eIse
continue;
}
}
MlSC|=0x01;//SetRequset
MlSC工0X02;//改变TX位状态
DeIay_3us();
MISC&=OXFE;//ClearRequest
}voidcontrol_read(WORD*rom_dataptr,BYTE*buffer)//从中读取数据,
{
//rom_dataptr是全局的在其
他函数中赋值改变
BYTEtemp,i=0;
if(buffer[7]!
=0)//FIFO_WLENGTHH
return;
if(buffer[6]==0)//FIFO_WLENGTHL
return;
if(buffer[6]>data_start[0])//请求的数据
超出ROM数据
return;
data_count二buffer[6];
if(MlSC&0x40匸0)//是控制指令
return;
if(datacount=0)
Send_Hand_Shake();
return;
}
//开始真正的control_read
while
(1)
{
if(bFIag_RD_HTabIe==0)//ReadLow
Byte
{
bFlag_RD_HTable=1;
buffer[i]=(BYTE)*rom_dat
aptr;//取其低位
i++;
data_count--;//全局变量,
要发送的总长度
if(data_count<=1)
break;
if(i+1=8)//FIF0_size二8
break;
}
eIse//ReadHightByte
bFlag_RD_HTable=O;buffer[i]=(BYTE)(*rom_dataptr)»8;//取其高位
rom_dataptr++;//将ROM指针前移
if(buffer[i]==0x3f)continue;
eIse
{
i++;
if(data_count<=1)break;
if(i+1==8)
break;
}
}
}//填充完毕,结束循环,开始向FIFO发送数据
while
(1)
if(CheckRealCmd()二二TRUE)
return;
if(FlFO_WR_CHECK(0)&0xff==0)continue;//NotReady
}
Write_FIF0(Fifo_0_Addr,0x02,buffer);
f/
//wT^T^^T^p、T^T^T^T^^TT1^T^T^T^T^T^^T
定Endpoint地址函数
f/
//^p、^p、^p、^T^p、^f、T^^p、g^^T^p、T^T^^p、g^^T
voidSetAddress(BYTE*buffer)
{
BYTEDev_Addr;
Dev_Addr=buffer[2]//FIF0_0UT3,FIF0_WVAL
UEL
SIES|=0x01;//主机从设备读操作后
将更新在AWR中的地址,否则为0则立即更新
Dev_Addr&=OXFE;
USB_AWR=Dev_Addr;
Send_Hand_Shake();
}
//
//
//^TT1^T^^p、j1^T1^j1^^p、T^j1^T1^T^^p、
SetConfiguration():
设置配置函数
f/
//^|wT^T^j^^T^p、^f、T^T^T^T^^TT1^T^T^T^T^T^^T
voidSetConfiguration(BYTE*buffer,BYTE
*USB_Configuration)
{
USVCl二0x80;
PGA_CTRL|二0x80;
*USB_Configuration=buffer[2];//FIF0_WVA
LUEL
STALL&=0x00;//设置好以上的寄存器
Send_Hand_Shake();
}
f/
//^Tj^j^j^j^*Tj^j^j^*T^T^j^*TT^
voidCIearFeature(BYTE*buffer)
{
BYTEtemp;
temp=buffer[2];//FIF0_wVaIueL
if(temp二0x01)
{
Send_Hand_Shake();
}
eIse
STALLO|=0x01;//SendStaI10();
}
voidCIearFeature_Endpoint(BYTE*buffer)
BYTEtemp;
temp=buffer[4];//FIFO_wIndexL
if(bFIag_SetConfiguration_Ready二二TRUE);
//表明已经配置过了
temp=GetPipeBit(temp);//获取对应位
temp=emp;//取反
STALL二temp&STALL;//与STALL寄存器相与,
将需要的位置0
Send_Hand_Shake();
}
//
置Feature函数
//
分
SetFeature():
设
包括Endpoint部
ff
//^TT^T^^T^Tj1^T^T^T^^TT^T^T^T^
voidSetFeature(BYTE*buffer)
{
BYTEFIF0_wVaIueL=buffer[2];
BYTEFIF0_wVaIueH=buffer[3];
if(FIFOwVaIueH==0x00)
if(FIF0_wValueL==0x01)
{
Send_Hand_Shake();
}
eIse
STALLO|=0x01;//SendStaI100;
}
elseif(FlF0_wVaIueH>二0X81〈二0X84)
{
if(FIF0_wValueL==0x00)
{
Send_Hand_Shake();
}
eIse
STALLO|二0x01;//SendStaI10
voidSetFeature_Endpoint(BYTE*buffer)
{
BYTEtemp;
temp=buffer[4];//FIF0_wIndexL
if(bFIag_SetConfiguration_