做了一段时间的USB方面的开发,虽然是现成的 方案,我们只需要搞清楚它的架构,再添加我们的代码 就行了。空闲之余,研究了一下USB通信过程,也把 82A851R部分的汇编代码重新用C语言描述了一篇(仅
是描述,不代表能真正运行)。发现汇编代码条理性太
在太差了,不好读。一把C语言的代码一写,马上觉
得清楚很多。废话少说,开始贴图,贴代码。
He,««
iro^mwsT**)
^
«10
irojWUTd
EMM杆•轉
z —
;CMJS *~1
rfni
:
mm
•rmg
VIFO
TTTt-W
nn
7TFW9
3tF©
Et3肌
7IW
TY«>»i
viro
7TTP41
刃”
•
s卄
VfM41tC>
—>» MMW1-
I V«1W4
el
叽卜
&Wl tM«rr«e«
L
:< • .-:<■» L c-.'-t* i<- i-
nro
FIFO
>!F6
UMffcU
Piro
UWKHII)
FIFO
BXSXW,
4 C««rXm
二 j ?
T “a &
下面是将一些函
数重新用C语言描述了一遍
#define BYTE unsigned char
f /
/ / ^| w T^ g^ j^ ^T ^p、^f、T^ T^ T^ T^ ^T T1^ T^ T^ T^ T^ T^ ^T
//
基本定义函数
/ /
/ / j^ j^ ^p、j^ j^ T^ ^p、T^ j^ T^ j^ ^T T1^ j^ T^ ^p、T^ j^ T^ ^T T^ T^ ^T T1^ T^ T^ T^
BYTE FIFO_RD_CHECK (BYTE num)
{
BYTE FIFO_FLAG=O;
UCC|=num;//选择 Endpoint, 0, 1,2, 3, 4,
MISC&=0xf8;//低 3 位置 0
MISC| =0X00;//TX 位置 0;
De I ay_3us ();
Ml SC|=0X01;//Set Request
De I ay_28us ();
if (MlSC&0X40匸0) FlF0_FLAG=0x0f;/
/READY
if (MlSC&0x80!=0) FlF0_FLAG&=0xf0;
//LenO Detected
MISC&=Oxfe;//clear REQ
void Read FIF0 (BYTE *Fifo_Addr,BYTE
return FIFO_FLAG;
void Read FIF0 (BYTE *Fifo_Addr,BYTE
BYTE FIFO_WR_CHECK (BYTE num)
{
BYTE FI FO_FLAG=O;//后 4 位表示 Ready 位,
前四位表示LenO位的状态是否有被设置
UCC|=num;//选择 Endpoint, 0, 1,2, 3, 4,
MISC&=0xf8;//低 3 位置 0
MISC| =0X02;//TX 位置 0;
De I ay_3us ();
Ml SC|=0X01;//Set Request
De I ay_28us ();
if (MISC&0X40!=0)
FIFO_FLAG=OxOf;/
/READY
if (MISC&0x80!=0)
FIFO_FLAG&=Oxf0;
//LenO
Detected
MISC&二Oxfe;//cI ear
REQ
}
return FIFO FLAG;
Fifo_Size,BYTE *buffer)
int i二0;
Ml SC|=0x01;//Set Request
for(i二0;i<Fifo_Size;i++)
{
buffer[i]=Fifo_Addr[0];//从 FIFO
地址取值
De I ay_28us ();
if (MlSC&0x40=0) break;//N
ot Ready
}
Ml SC工0X02;//改变TX位状态
De I ay_3us ();
MISC&^OXFE;//CIear Request
}
void Write_FIF0(BYTE *Fifo_Addr, BYTE
SendLenth,BYTE *buffer)
{
int i=0;
Ml SC|=0X01;//Set Re
USB通信协议源代码 来自淘豆网www.taodocs.com转载请标明出处.