📄 32musb.lst
字号:
221 2 }
222 1
223 1 UEPSTAX |= TXRDY;//发送数据Sending the data,this action will switch between bank0 and bank1
224 1
225 1 }
226
227 void Get_Status()
228 {
229 1 printu("Get_Status");
230 1 }
231
232 void Clear_Feature()
233 {
234 1 printu("Clear_Feature");
235 1 }
236
237 void Set_Feature()
238 {
239 1 printu("Set_Feature");
240 1 }
241
C51 COMPILER V7.07 32MUSB 11/26/2006 21:07:28 PAGE 5
242 void Set_Address(unsigned char EpNum)
243 {
244 1 // unsigned char Test[] = {0};
245 1 WriteEp(0, 0, 0);//在Status阶段过后才能改变设备地址
246 1
247 1 USBADDR |= EpNum;//设置地址
248 1 USBADDR |= FEN;//地址使能
249 1 USBCON |= FADDEN;
250 1
251 1 // printuf("\nSet_Address : %x\n", USBADDR);
252 1 }
253
254 void Get_Descriptor(unsigned char DesType, unsigned char nLength)
255 {
256 1 if (DesType == 0x01)
257 1 {
258 2 WriteEp(0, 18, Device_Descriptor);//提供设备描述符
259 2 }
260 1 if ((DesType == 0x02) && (nLength == 0x09))
261 1 {
262 2 WriteEp(0, 9, Configuration_Descriptor_All);//提供配置描述符
263 2 }
264 1 //提供全部描述符
265 1 if ((DesType == 0x02) && (nLength == 0xff))
266 1 {
267 2 WriteEp(0, 32, Configuration_Descriptor_All);
268 2 WriteEp(0, 2, &Device_Descriptor[4]);
269 2 }
270 1 //提供全部描述符
271 1 if ((DesType == 0x02) && (nLength == 0x20))
272 1 {
273 2 WriteEp(0, 32, Configuration_Descriptor_All);
274 2 }
275 1
276 1 // printu("Get_Descriptor\n");
277 1 }
278
279 void Get_Configuration()
280 {
281 1 printu("Get_Configuration");
282 1 }
283
284 void Set_Configuration(unsigned char wValue)
285 {
286 1
287 1 if (wValue == 0)
288 1 {
289 2 /* put device in unconfigured state */
290 2 /* Disable all endpoints but EPP0. *///init_unconfig
291 2
292 2 UEPNUM = 0x00;//Ep0 as control Endpoint
293 2 UEPCONX = 0x80;
294 2
295 2 UEPNUM = 0x01;//Ep1 as Bulk-in Endpoint
296 2 UEPCONX = 0x86;
297 2
298 2 UEPNUM = 0x02;//Ep2 as Bulk-out Endpoint
299 2 UEPCONX = 0x82;
300 2
301 2 // WriteEp(0, &Device_Descriptor[4], 2);
302 2 USBCON &= (~CONFG);
303 2 WriteEp(0, 0, 0);//状态传送阶段之前完成指定操作
C51 COMPILER V7.07 32MUSB 11/26/2006 21:07:28 PAGE 6
304 2
305 2 }
306 1 else if (wValue == 1) {
307 2 /* Configure device */
308 2 /* Enable generic/iso endpoints. init_config*/
309 2
310 2 UEPNUM = 0x00;//Ep0 as control Endpoint
311 2 UEPCONX = 0x80;
312 2
313 2 UEPNUM = 0x01;//Ep1 as Bulk-in Endpoint
314 2 UEPCONX = 0x86;
315 2
316 2 UEPNUM = 0x02;//Ep2 as Bulk-out Endpoint
317 2 UEPCONX = 0x82;
318 2
319 2
320 2 USBCON |= CONFG;
321 2 WriteEp(0, 0, 0);//状态传送阶段之前完成指定操作
322 2
323 2 }
324 1 // printu("Set_Configuration ");
325 1 }
326
327 void Get_Interface()
328 {
329 1 printu("Get_Interface");
330 1 }
331
332 void Set_Interface()
333 {
334 1 WriteEp(0, 0, 0);
335 1 printu("Set_Interface ");
336 1 }
337
338 void Ep0Int()
339 {
340 1 unsigned char i, j;
341 1 unsigned char ControlData[32] = {0, };
342 1
343 1 i = ReadEp(0, ControlData);//读端点0
344 1 P3_5 = 0;//USB通信指示灯点亮
345 1 j = ControlData[0] & 0x60;//过滤端点0数据
346 1 if ((j == 0) && i)
347 1 {//如果为标准USB请求
348 2 switch (ControlData[1])
349 2 {//分别按请求类别进行处理
350 3 case get_status : Get_Status(); break;
351 3 case clear_feature : Clear_Feature(); break;
352 3
353 3 case set_feature : Set_Feature(); break;
354 3
355 3 case set_address : Set_Address(ControlData[2]); break;
356 3 case get_descriptor : Get_Descriptor(ControlData[3], ControlData[6]); break;
357 3
358 3 case get_configuration : Get_Configuration(); break;
359 3 case set_configuration : Set_Configuration(ControlData[2]); break;
360 3 case get_interface : Get_Interface(); break;
361 3 case set_interface : Set_Interface(); break;
362 3 default : Reserved(); break;
363 3 }
364 2 }
365 1 else if (ControlData[0] == 0xa1)
C51 COMPILER V7.07 32MUSB 11/26/2006 21:07:28 PAGE 7
366 1 {//特殊请求,特殊处理,直接返回Status
367 2 WriteEp(0, 0, 0);
368 2 }
369 1
370 1 P3_5 = 1;//USB通信指示灯关闭
371 1
372 1 }
373
374 //Bulk-In端点处理
375 void main_txdone()
376 {
377 1 unsigned char i;
378 1
379 1 // printuf("Bulk_State : %x\n", bulk_state);
380 1 P3_5 = 0;////USB通信指示灯点亮
381 1
382 1 UEPSTAX &= (~(TXCMP));//清中断标志位clear TXCMP
383 1 switch (bulk_state)
384 1 {//按不同的传输状态,进行不同的后续处理
385 2 case BULK_DATA_TRANS :
386 2 TransDataGoOn();
387 2 break;
388 2 case BULK_DATA_END :
389 2 UEPNUM = 1;//指向相应端点
390 2 UEPSTAX |= DIR;//设置方向为写Set for status of a Control In transaction
391 2
392 2 for (i=0; i<13; i++)
393 2 {
394 3 UEPDATX = bulk_CSW[i];//将数据写入端点
395 3 }
396 2
397 2 UEPSTAX |= TXRDY;//发送数据Sending the data,this action will switch between bank0 and bank1
398 2
399 2 bulk_state = BULK_CSW_END; //置传输状态。
400 2
401 2 break;
402 2 case BULK_REQEST_TRANS :
403 2 TransRequestGoOn();
404 2 break;
405 2 case BULK_CSW_END :
406 2 break;
407 2 default : return;
408 2 }
409 1
410 1 P3_5 = 1;//USB通信指示灯关闭
411 1 }
412
413 //Bulk-Out端点处理
414 void main_rxdone()
415 {
416 1
417 1 unsigned char nLength;
418 1 // printu("\nmain_rxdone ");
419 1 // P3_5 = 0;//USB通信指示灯点亮
420 1 //ReadEp(2, Bulk_Out_Buf);//读取端点2
421 1 // ReadEp(2, BulkPoint);//读取端点2
422 1
423 1
424 1 UEPNUM = 2;//指向相应端点
425 1 BulkStartPoint = BulkPoint;
426 1 nLength = UBYCTX;//读取端点数据长度
427 1
C51 COMPILER V7.07 32MUSB 11/26/2006 21:07:28 PAGE 8
428 1 while (nLength--)
429 1 {
430 2 *(BulkPoint++) = UEPDATX;
431 2 }
432 1
433 1 // UEPSTAX &= ~(RXOUTB0 | RXOUTB1 | RXSETUP);//清中断标志
434 1 UEPSTAX &= 0xb9;//清中断标志
435 1
436 1 //printuf("%x", *BulkStartPoint);
437 1 if ((bulk_state != BULK_DATA_RECIEVE) && (*BulkStartPoint == 0x55))
438 1 {
439 2 InterpretCBW();//判断是否为命令数据
440 2 BulkPoint = BulkStartPoint;
441 2 }
442 1 else if (BulkPoint == Page_Buf + 512)
443 1 {
444 2 Trans_Data2PC();//为普通数据时转向数据接收处理程序
445 2 }
446 1 // P3_5 = 1;//USB通信指示灯关闭
447 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -