USB通信协议源代码.docx

上传人:b****3 文档编号:1496366 上传时间:2022-10-22 格式:DOCX 页数:25 大小:201.89KB
下载 相关 举报
USB通信协议源代码.docx_第1页
第1页 / 共25页
USB通信协议源代码.docx_第2页
第2页 / 共25页
USB通信协议源代码.docx_第3页
第3页 / 共25页
USB通信协议源代码.docx_第4页
第4页 / 共25页
USB通信协议源代码.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

USB通信协议源代码.docx

《USB通信协议源代码.docx》由会员分享,可在线阅读,更多相关《USB通信协议源代码.docx(25页珍藏版)》请在冰豆网上搜索。

USB通信协议源代码.docx

USB通信协议源代码

做了一段时间的USB方面的开发,虽然是现成的方案,我们只需要搞清楚它的架构,再添加我们的代码就行了。

空闲之余,研究了一下USB通信过程,也把82A851R部分的汇编代码重新用C语言描述了一篇(仅

是描述,不代表能真正运行)。

发现汇编代码条理性太

在太差了,不好读。

一把C语言的代码一写,马上觉

得清楚很多。

废话少说,开始贴图,贴代码。

gsu.gg

下面是将一些函

数重新用C语言描述了一遍

#defineBYTEunsignedchar

f/

//^|wT^g^j^^T^p、^f、T^T^T^T^^TT1^T^T^T^T^T^^T

//

基本定义函数

//

//j^j^^p、j^j^T^^p、T^j^T^j^^TT1^j^T^^p、T^j^T^^TT^T^^TT1^T^T^T^

BYTEFIFO_RD_CHECK(BYTEnum)

{

BYTEFIFO_FLAG=O;

UCC|=num;//选择Endpoint,0,1,2,3,4,

MISC&=0xf8;//低3位置0

MISC|=0X00;//TX位置0;

DeIay_3us();

MlSC|=0X01;//SetRequest

DeIay_28us();

if(MlSC&0X40匸0)FlF0_FLAG=0x0f;/

/READY

if(MlSC&0x80!

=0)FlF0_FLAG&=0xf0;

//LenODetected

MISC&=Oxfe;//clearREQ

returnFIFO_FLAG;

BYTEFIFO_WR_CHECK(BYTEnum)

{

BYTEFIFO_FLAG=O;//后4位表示Ready位,

前四位表示LenO位的状态是否有被设置

UCC|=num;//选择Endpoint,0,1,2,3,4,

MISC&=0xf8;//低3位置0

MISC|=0X02;//TX位置0;

DeIay_3us();

MlSC|=0X01;//SetRequest

DeIay_28us();

if(MISC&0X40!

=0)

FIFO_FLAG=OxOf;/

/READY

if(MISC&0x80!

=0)

FIFO_FLAG&=Oxf0;

//LenO

Detected

MISC&二Oxfe;//cIear

REQ

}

returnFIFOFLAG;

Fifo_Size,BYTE*buffer)

inti二0;

MlSC|=0x01;//SetRequest

for(i二0;i

{

buffer[i]=Fifo_Addr[0];//从FIFO

地址取值

DeIay_28us();

if(MlSC&0x40=0)break;//N

otReady

}

MlSC工0X02;//改变TX位状态

DeIay_3us();

MISC&^OXFE;//CIearRequest

}

voidWrite_FIF0(BYTE*Fifo_Addr,BYTE

SendLenth,BYTE*buffer)

{

inti=0;

MlSC|=0X01;//SetRequest

for(i二0;i

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_

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1