原创USB通信协议的理解流程描述Word格式文档下载.docx

上传人:b****5 文档编号:18681886 上传时间:2022-12-31 格式:DOCX 页数:15 大小:58.45KB
下载 相关 举报
原创USB通信协议的理解流程描述Word格式文档下载.docx_第1页
第1页 / 共15页
原创USB通信协议的理解流程描述Word格式文档下载.docx_第2页
第2页 / 共15页
原创USB通信协议的理解流程描述Word格式文档下载.docx_第3页
第3页 / 共15页
原创USB通信协议的理解流程描述Word格式文档下载.docx_第4页
第4页 / 共15页
原创USB通信协议的理解流程描述Word格式文档下载.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

原创USB通信协议的理解流程描述Word格式文档下载.docx

《原创USB通信协议的理解流程描述Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《原创USB通信协议的理解流程描述Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。

原创USB通信协议的理解流程描述Word格式文档下载.docx

//SetRequest

Delay_28us();

if(MISC&

0X40!

=0) 

FIFO_FLAG=0x0f;

//READY

0x80!

FIF0_FLAG&

=0xf0;

//Len0Detected

=0xfe;

//clearREQ

returnFIFO_FLAG;

}

BYTEFIFO_WR_CHECK(BYTEnum)

//后4位表示Ready位,前四位表示Len0位的状态是否有被设置

MISC|=0X02;

voidRead_FIFO(BYTE*Fifo_Addr,BYTEFifo_Size,BYTE*buffer)

inti=0;

MISC|=0x01;

for(i=0;

i<

Fifo_Size;

i++)

{

buffer[i]=Fifo_Addr[0];

//从FIFO地址取值

0x40==0) 

break;

//NotReady

}

MISC^=0X02;

//改变TX位状态

=0XFE;

//ClearRequest

voidWrite_FIFO(BYTE*Fifo_Addr,BYTESendLenth,BYTE*buffer)

SendLenth;

Fifo_Addr[0]=buffer[i];

//将要发送的数据放至相应的Fifo中

BOOLCheck_Real_Cmd()

BYTEbFlag_Real_Cmd=FALSE;

0X20!

bFlag_Real_Cmd=TRUE;

0X80!

returnbFlag_Real_Cmd;

voidSend_hand()

BOOLIsRealCmd,Status_Flag;

while

(1)

IsRealCmd=Check_Real_Cmd();

if(IsRealCmd==TRUE)

return;

else 

Status_Flag=FIFO_WR_CHECK(0);

if(Status_Flag&

0x0f!

=0)//Fifo_Ready

else

continue;

//SetRequset

voidcontrol_read(WORD*rom_dataptr,BYTE*buffer)//从中读取数据,

//rom_dataptr是全局的在其他函数中赋值改变

BYTEtemp,i=0;

if(buffer[7]!

=0)//FIFO_WLENGTHH

if(buffer[6]==0)//FIFO_WLENGTHL

if(buffer[6]>

data_start[0])//请求的数据超出ROM数据

data_count=buffer[6];

0x40!

=0)//是控制指令

if(data_count==0)

Send_Hand_Shake();

//开始真正的control_read

if(bFlag_RD_HTable==0)//ReadLowByte

bFlag_RD_HTable=1;

buffer[i]=(BYTE)*rom_dataptr;

//取其低位

i++;

data_count--;

//全局变量,要发送的总长度

if(data_count<

=1)

if(i+1==8)//FIFO_size=8

else//ReadHightByte

bFlag_RD_HTable=0;

buffer[i]=(BYTE)(*rom_dataptr)>

>

8;

//取其高位

rom_dataptr++;

//将ROM指针前移

if(buffer[i]==0x3f)

if(i+1==8)

}//填充完毕,结束循环,开始向FIFO发送数据

if(Check_Real_Cmd()==TRUE) 

if(FIFO_WR_CHECK(0)&

0xff==0)continue;

Write_FIFO(Fifo_0_Addr,0x02,buffer);

SetAddress():

重新设定Endpoint地址函数

voidSetAddress(BYTE*buffer)

BYTEDev_Addr;

Dev_Addr=buffer[2]//FIFO_OUT3,FIFO_WVALUEL 

SIES|=0x01;

//主机从设备读操作后将更新在AWR中的地址,否则为0则立即更新

Dev_Addr&

USB_AWR=Dev_Addr;

SetConfiguration():

设置配置函数

voidSetConfiguration(BYTE*buffer,BYTE*USB_Configuration)

USVC|=0x80;

PGA_CTRL|=0x80;

*USB_Configuration=buffer[2];

//FIFO_WVALUEL 

STALL&

=0x00;

//设置好以上的寄存器

ClearFeature():

清徐Feature函数

voidClearFeature(BYTE*buffer)

BYTEtemp;

temp=buffer[2];

//FIFO_wValueL

if(temp=0x01)

STALL0|=0x01;

//SendStall0();

voidClearFeature_Endpoint(BYTE*buffer)

temp=buffer[4];

//FIFO_wIndexL

if(bFlag_SetConfiguration_Ready==TRUE);

//表明已经配置过了

temp=GetPipeBit(temp);

//获取对应位

temp=~temp;

//取反

STALL=temp&

STALL;

//与STALL寄存器相与,将需要的位置0

SetFeature():

设置Feature函数

包括Endpoint部分

voidSetFeature(BYTE*buffer)

BYTEFIFO_wValueL=buffer[2];

BYTEFIFO_wValueH=buffer[3];

if(FIFO_wValueH==0x00)

if(FIFO_wValueL==0x01)

elseif(FIFO_wValueH>

=0X81<

=0X84) 

if(FIFO_wValueL==0x00)

voidSetFeature_Endpoint(BYTE*buffer)

if(bFlag_SetConfiguration_Ready!

=TRUE)

//有没有被SetConfiguration()设置

temp&

=0x7f;

STALL=temp|STALL;

//将指定的Enpoint置1

SetInterface():

设置Interface函数

BOOLSetInterface(BYTE*buffer,BYTE*USB_Interface_Alt,BYTE*USB_Interface)

*USB_Interface_Alt=buffer[2];

//FIFO_WVALUEL

*USB_Interface=buffer[4];

//FIFO_WINDEXL

PA|=0X01;

//SetPA.0

returnTRUE;

GetDescriptor():

获取Descriptor

描述的函数

voidGetDescriptor(BYTE*buffer)

BYTEFIFO_WvalueH=buffer[3];

BYTEFIFO_wIndexL=buffer[4];

switch(FIFO_WvalueH)

case01:

//device,80060001

GetDeviceDescriptor();

case02:

//configurationDescriptor80060002

GetConfigurationDescriptor();

case03:

//string,80060003

GetStringDescriptor();

default:

//**********************************

//****ThentestforHIDclassDescriptor

//***********************************

if(FIFO_wIndexL==0x03)//CheckInterface3,被配置为HID

case22:

//report,81060022

GetReportDescriptor();

case21:

//HID,81060021

GetHIDDescriptor();

//无法解析的情况

voidGetDeviceDescriptor(BYTE*buffer)

BYTEdata_count;

BYTE*data_start;

data_count=device_desc_table[0];

//低字节存放长度

data_start=device_desc_table;

GetStatus():

设置USB状态的函数 

voidGetStatus(BYTE*buffer)

BYTEFIFO_SendLen=0X02;

buffer[0]=0x00;

buffer[1]=0x01;

if(Check_Real_Cmd()==TRUE)break;

//估计是Len0=1,结束会话

if(FIFO_WR_CHECK(0)==FALSE)continue;

Write_FIFO(Fifo_0_Addr,FIFO_SendLen,buffer);

GetStatus_Endpoint(BYTE*buffer)

//FIFO_wIndexL,表示要检测的Endpoint号

//获取位数如:

000000101B=>

00100000B

if(temp&

STALL==TRUE)//要检测的位置1

buffer[0]=1;

elsebuffer[0]=0;

buffer[1]=0;

GetConfiguration():

设置配置的函数 

voidGetConfiguration(BYTE*buffer,BYTEUSB_Configuration)

BYTEFIFO_SendLen;

buffer[0]=USB_Configuration;

FIFO_SendLen=0x01;

if(Check_Real_Cmd()==TRUE)return;

=0)//FifoReady

GetInterface():

获取Interface接口的函数 

//******************************************

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

当前位置:首页 > 工程科技 > 建筑土木

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

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