📄 usbcore.lst
字号:
291 0x01,
292
293 //bAlternateSetting字段。该接口的备用编号,为0。
294 0x00,
295
296 //bNumEndpoints字段。非0端点的数目。该设备需要使用一对批量端点,设置为2。
297 0x02,
298
299 //bInterfaceClass字段。该接口所使用的类。数据类接口的代码为0x0A。
300 0x0A,
301
302 //bInterfaceSubClass字段。该接口所使用的子类为0。
303 0x00,
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:07 PAGE 6
304
305 //bInterfaceProtocol字段。该接口所使用的协议为0。
306 0x00,
307
308 //iConfiguration字段。该接口的字符串索引值。这里没有,为0。
309 0x00,
310
311 /***** 以下为接口1(数据类接口)的端点描述符 *****/
312 /*************** 批量输入端点2描述符 ******************/
313 //bLength字段。端点描述符长度为7字节。
314 0x07,
315
316 //bDescriptorType字段。端点描述符编号为0x05。
317 0x05,
318
319 //bEndpointAddress字段。端点的地址。我们使用D12的输入端点2。
320 //D7位表示数据方向,输入端点D7为1。所以输入端点2的地址为0x82。
321 0x82,
322
323 //bmAttributes字段。D1~D0为端点传输类型选择。
324 //该端点为批量端点,批量端点的编号为0x02。其它位保留为0。
325 0x02,
326
327 //wMaxPacketSize字段。该端点的最大包长。端点2的最大包长为64字节。
328 //注意低字节在先。
329 0x40,
330 0x00,
331
332 //bInterval字段。端点查询的时间,这里对批量端点无效。
333 0x00,
334
335 /*************** 批量输出端点2描述符 ******************/
336 //bLength字段。端点描述符长度为7字节。
337 0x07,
338
339 //bDescriptorType字段。端点描述符编号为0x05。
340 0x05,
341
342 //bEndpointAddress字段。端点的地址。我们使用D12的输出端点2。
343 //D7位表示数据方向,输出端点D7为0。所以输出端点2的地址为0x02。
344 0x02,
345
346 //bmAttributes字段。D1~D0为端点传输类型选择。
347 //该端点为批量端点,批量端点的编号为0x02。其它位保留为0。
348 0x02,
349
350 //wMaxPacketSize字段。该端点的最大包长。端点2的最大包长为64字节。
351 //注意低字节在先。
352 0x40,
353 0x00,
354
355 //bInterval字段。端点查询的时间,这里对批量端点无效。
356 0x00
357 };
358 ////////////////////////配置描述符集合完毕//////////////////////////
359
360 /************************语言ID的定义********************/
361 code uint8 LanguageId[4]=
362 {
363 0x04, //本描述符的长度
364 0x03, //字符串描述符
365 //0x0409为美式英语的ID
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:07 PAGE 7
366 0x09,
367 0x04
368 };
369 ////////////////////////语言ID完毕//////////////////////////////////
370
371 /**************************************************/
372 /********* 本转换结果来自 **********/
373 /********* Http://computer00.21ic.org **********/
374 /********* 作者: 电脑圈圈 **********/
375 /********* 欢迎大家使用 **********/
376 /********* 版权所有,盗版请写明出处 **********/
377 /**************************************************/
378
379 //http://computer00.21ic.org/user1/2198/archives/2007/42769.html
380 //字符串“电脑圈圈的USB专区 Http://group.ednchina.com/93/”的Unicode编码
381 //8位小端格式
382 code uint8 ManufacturerStringDescriptor[82]={
383 82, //该描述符的长度为82字节
384 0x03, //字符串描述符的类型编码为0x03
385 0x35, 0x75, //电
386 0x11, 0x81, //脑
387 0x08, 0x57, //圈
388 0x08, 0x57, //圈
389 0x84, 0x76, //的
390 0x55, 0x00, //U
391 0x53, 0x00, //S
392 0x42, 0x00, //B
393 0x13, 0x4e, //专
394 0x3a, 0x53, //区
395 0x20, 0x00, //
396 0x48, 0x00, //H
397 0x74, 0x00, //t
398 0x74, 0x00, //t
399 0x70, 0x00, //p
400 0x3a, 0x00, //:
401 0x2f, 0x00, ///
402 0x2f, 0x00, ///
403 0x67, 0x00, //g
404 0x72, 0x00, //r
405 0x6f, 0x00, //o
406 0x75, 0x00, //u
407 0x70, 0x00, //p
408 0x2e, 0x00, //.
409 0x65, 0x00, //e
410 0x64, 0x00, //d
411 0x6e, 0x00, //n
412 0x63, 0x00, //c
413 0x68, 0x00, //h
414 0x69, 0x00, //i
415 0x6e, 0x00, //n
416 0x61, 0x00, //a
417 0x2e, 0x00, //.
418 0x63, 0x00, //c
419 0x6f, 0x00, //o
420 0x6d, 0x00, //m
421 0x2f, 0x00, ///
422 0x39, 0x00, //9
423 0x33, 0x00, //3
424 0x2f, 0x00 ///
425 };
426 /////////////////////////厂商字符串结束/////////////////////////////
427
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:07 PAGE 8
428 //字符串“《圈圈教你玩USB》之 USB转串口”的Unicode编码
429 //8位小端格式
430 code uint8 ProductStringDescriptor[38]={
431 38, //该描述符的长度为38字节
432 0x03, //字符串描述符的类型编码为0x03
433 0x0a, 0x30, //《
434 0x08, 0x57, //圈
435 0x08, 0x57, //圈
436 0x59, 0x65, //教
437 0x60, 0x4f, //你
438 0xa9, 0x73, //玩
439 0x55, 0x00, //U
440 0x53, 0x00, //S
441 0x42, 0x00, //B
442 0x0b, 0x30, //》
443 0x4b, 0x4e, //之
444 0x20, 0x00, //
445 0x55, 0x00, //U
446 0x53, 0x00, //S
447 0x42, 0x00, //B
448 0x6c, 0x8f, //转
449 0x32, 0x4e, //串
450 0xe3, 0x53 //口
451 };
452 ////////////////////////产品字符串结束////////////////////////////
453
454 //字符串“2008-08-03”的Unicode编码
455 //8位小端格式
456 code uint8 SerialNumberStringDescriptor[22]={
457 22, //该描述符的长度为22字节
458 0x03, //字符串描述符的类型编码为0x03
459 0x32, 0x00, //2
460 0x30, 0x00, //0
461 0x30, 0x00, //0
462 0x38, 0x00, //8
463 0x2d, 0x00, //-
464 0x30, 0x00, //0
465 0x38, 0x00, //8
466 0x2d, 0x00, //-
467 0x30, 0x00, //0
468 0x33, 0x00 //3
469 };
470 //////////////////////产品序列号字符串结束/////////////////////////
471
472 /********************************************************************
473 函数功能:延时x毫秒函数。
474 入口参数:x:延时的毫秒数。
475 返 回:无。
476 备 注:无。
477 ********************************************************************/
478 void DelayXms(uint16 x)
479 {
480 1 uint16 i;
481 1 uint16 j;
482 1 for(i=0;i<x;i++)
483 1 for(j=0;j<227;j++); //循环语句延时
484 1 }
485 ////////////////////////End of function//////////////////////////////
486
487 /********************************************************************
488 函数功能:USB断开连接函数。
489 入口参数:无。
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:07 PAGE 9
490 返 回:无。
491 备 注:无。
492 ********************************************************************/
493 void UsbDisconnect(void)
494 {
495 1 #ifdef DEBUG0
Prints("断开USB连接。\r\n");
#endif
498 1 D12WriteCommand(D12_SET_MODE); //写设置模式命令
499 1 D12WriteByte(0x06); //设置模式的第一字节
500 1 D12WriteByte(0x47); //设置模式的第二字节
501 1 DelayXms(1000); //延迟1秒
502 1 }
503 ////////////////////////End of function//////////////////////////////
504
505 /********************************************************************
506 函数功能:USB连接函数。
507 入口参数:无。
508 返 回:无。
509 备 注:无。
510 ********************************************************************/
511 void UsbConnect(void)
512 {
513 1 #ifdef DEBUG0
Prints("连接USB。\r\n");
#endif
516 1 D12WriteCommand(D12_SET_MODE); //写设置模式命令
517 1 D12WriteByte(0x16); //设置模式的第一字节
518 1 D12WriteByte(0x47); //设置模式的第二字节
519 1 }
520 ////////////////////////End of function//////////////////////////////
521
522 /********************************************************************
523 函数功能:总线挂起中断处理函数。
524 入口参数:无。
525 返 回:无。
526 备 注:无。
527 ********************************************************************/
528 void UsbBusSuspend(void)
529 {
530 1 #ifdef DEBUG0
Prints("USB总线挂起。\r\n");
#endif
533 1 }
534 ////////////////////////End of function//////////////////////////////
535
536 /********************************************************************
537 函数功能:总线复位中断处理函数。
538 入口参数:无。
539 返 回:无。
540 备 注:无。
541 ********************************************************************/
542 void UsbBusReset(void)
543 {
544 1 #ifdef DEBUG0
Prints("USB总线复位。\r\n");
#endif
547 1 Ep1InIsBusy=0; //复位后端点1输入缓冲区空闲。
548 1 Ep2InIsBusy=0; //复位后端点2输入缓冲区空闲。
549 1 UartBufferOutputPoint=0;
550 1 UartBufferInputPoint=0;
551 1 UartByteCount=0;
C51 COMPILER V7.06 USBCORE 11/16/2008 16:00:07 PAGE 10
552 1 UsbEp2ByteCount=0;
553 1 UsbEp2BufferOutputPoint=0;
554 1 }
555 ////////////////////////End of function//////////////////////////////
556
557 /********************************************************************
558 函数功能:根据pData和SendLength将数据发送到端点0的函数。
559 入口参数:无。
560 返 回:无。
561 备 注:无。
562 ********************************************************************/
563 void UsbEp0SendData(void)
564 {
565 1 //将数据写到端点中去准备发送
566 1 //写之前要先判断一下需要发送的数据是否比端点0
567 1 //最大长度大,如果超过端点大小,则一次只能发送
568 1 //最大包长的数据。端点0的最大包长在DeviceDescriptor[7]
569 1 if(SendLength>DeviceDescriptor[7])
570 1 {
571 2 //按最大包长度发送
572 2 D12WriteEndpointBuffer(1,DeviceDescriptor[7],pSendData);
573 2 //发送后剩余字节数减少最大包长
574 2 SendLength-=DeviceDescriptor[7];
575 2 //发送一次后指针位置要调整
576 2 pSendData+= DeviceDescriptor[7];
577 2 }
578 1 else
579 1 {
580 2 if(SendLength!=0)
581 2 {
582 3 //不够最大包长,可以直接发送
583 3 D12WriteEndpointBuffer(1,SendLength,pSendData);
584 3 //发送完毕后,SendLength长度变为0
585 3 SendLength=0;
586 3 }
587 2 else //如果要发送的数据包长度为0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -