1)在usb_prop.c的函数CustomHID_Data_Setup()中,GET_PROTOCOL之后增加如下代码: - /*** GET_PROTOCOL ***/3 x* T$ P9 J% F9 h9 l; {- \
- else if ((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))$ Y& p1 I2 H+ K8 `4 u0 l
- && RequestNo == GET_PROTOCOL)
! M) v3 _4 h. K, L1 Q# {3 T - {
3 D6 X2 e4 N6 j# ^ - CopyRoutine = CustomHID_GetProtocolValue;9 F2 p5 A0 t0 n$ @- | m S
- } /* 以上代码为原有例程中的代码 */
" \6 L. K% ?2 V3 k0 A7 ~6 w3 t - /*** GET_REPORT ***/ /* 以下代码支持GET_REPORT */
$ E$ c7 X' o% h1 J5 j - else if((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
' e: q# A5 Q, ^3 X - && RequestNo == GET_REPORT)
% f- L- Q" T1 O Z, { - {. v# r% w% G; [
- CopyRoutine = CustomHID_GetReport;
4 U/ M& X6 Q. w# ^' J8 |- q/ C3 y - }
复制代码+ C. I6 t0 |( \8 S/ I% d
2)再增加一个函数: - uint8_t *CustomHID_GetReport(uint16_t Length); u. _) M4 X3 i. n5 M( l
- {
! q$ D$ f1 P* u' ]8 Q3 ~ - if (Length == 0)
7 k( m2 C4 C6 M# _! z1 }& W% | - {9 V) M, T3 [+ l5 R
- return 10;! b; Y& x3 J) f9 H6 U
- }0 _/ G# \! i& H" v; b
- return &Report_Buffer[pInformation->Ctrl_Info.Usb_wOffset];% a6 b8 l e5 f. B2 T1 C! } @+ E
- }
复制代码
/ }2 N* D; G) G0 c* ?- R
3)保证在IN Token到来之前,Report_Buffer中包含有效的数据。 2 V) p, N; x& M. N) x$ Q% z
上述过程十分简单,但有时不能保证在IN Token到来之前,Report_Buffer中包含有效的数据,即要发送的数据还没有准备好;这时就希望先设置一个标志,让IN Token返回NAK,让CustomHID_Data_Setup()这个函数返回,待数据准备好之后再继续前述的数据拷贝过程。 这个要求使用STM32的USB开发库也是很容易实现的: 1)在usb_prop.c的函数CustomHID_Data_Setup()中,GET_PROTOCOL之后增加的代码变为这样: - /*** GET_REPORT ***/
% D- v5 r' Q4 U - else if((Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT))
& E' n5 D, o' `( x4 |2 H - && RequestNo == GET_REPORT) : ]) w4 a/ Y$ y( l9 K. H
- { 9 C7 G* L- J9 ~8 s0 _
- if (数据未准备好) 3 ? }% n9 C; _' g. D: o! w
- return USB_NOT_READY;
8 \9 s. _; D6 a! `; T9 @, a1 w5 ` - CopyRoutine = CustomHID_GetReport;
: z, k( u1 t/ s9 x' k* ^; m. y' P/ { - }
复制代码
7 x' o0 M! c: d2 D4 Y& B: i这样,STM32将以NAK回应PC端的IN请求。
2)同样增加一个函数CustomHID_GetReport。 3)在数据准备好之后(注意准备数据的时间不能太长,否则PC端会做超时处理),执行下述操作:
% c5 x- p6 J1 [' B pInformation->Ctrl_Info.CopyData = CustomHID_GetReport; $ G7 ~- V: _& G' ^. ?
pInformation->Ctrl_Info.Usb_wOffset = 0;
- d4 J8 x% s: ^3 y7 l" V4 E# [8 W% c( C CustomHID_GetReport(0);
9 t! n" h% D' g7 c$ z# g \ pInformation->Ctrl_Info.PacketSize = pProperty->MaxPacketSize;
& Y2 u7 D+ u. M2 ~% t( k/ y DataStageIn();
/ K7 w/ f( D3 d转载自:shench888 Y' j2 l. c% C3 F- k4 w
: ?$ ~3 B* @# ?; B
|