?? pdiusbd12.lst
字號:
474 1 return len;
475 1 }
476
477 //===============================================================================//
478 //== 函 數 名:disconnect_usb
479 //== 功 能:斷開USB連接
480 //== 說 明:斷開后要有一100ms的延時
481 //== 時 間:2008.8.13 創建函數
482 //== 入口參數:無
483 //== 返 回 值:0
484 //===============================================================================//
485 unsigned char disconnect_usb(void)
486 {
487 1 unsigned int i;
488 1
489 1 #ifdef __DEBUG__ //== 打印調試信息
C51 COMPILER V7.50 PDIUSBD12 11/24/2008 09:12:37 PAGE 9
490 1 Print_Msg("Runing disconnect_usb()!\r\n");
491 1 #endif
492 1
493 1 #ifdef __DEBUG__ //== 打印調試信息
494 1 Print_Msg(" 斷開USB連接........................\r\n");
495 1 #endif
496 1
497 1 write_D12_command(0xf3);
498 1 write_a_D12_data(0x0e);
499 1 write_a_D12_data(0x47);
500 1 for (i=0; i<50000; i++); //== 延時100ms
501 1 return 0;
502 1 }
503
504 //===============================================================================//
505 //== 函 數 名:connect_usb
506 //== 功 能:連接USB
507 //== 說 明:連接USB后并設置D12的輸出時鐘頻率
508 //--0xF3 設置模式 寫入兩個字節
509 //--1、配置字節 D7,D6(00):端點配置 模式0:非同步模式 模式1:同步輸出模式
510 //--------------- 模式2:同步輸入模式 同步輸入/輸出模式
511 //---------------D5(0): 保留位
512 //---------------D4(0): softConnect 1:VBUS可用 上行數據上拉電阻被連接
513 //---------------D3(1): 中斷模式 1:表示報告所有的錯誤和”NKing”并產生一個中
514 //--------------- 0:表示只有"OK"被報告
515 //---------------D2(1):時鐘運行,1:表示在掛起狀態下仍然有時鐘和PLL,0表示無
516 //---------------D1(1): 無LAZYCLOCK 1:表示CLKOUT不會切換到LazyClock
517 //--------------- 0:表示CLKOUT在Suspend變高之后切換到LazyClock
518 //---------------D0(0): 保留位
519 //--2、時鐘分頻系數字節
520 //---------------D7(0): SOF-ONLY中斷模式
521 //---------------1:表示僅當楨時鐘的起始(SOF)時刻引起中斷的產生,而不管引腳中斷模式的設定
522 //---------------D6(0):SET_TO_ONE模式
523 //---------------D5,D4(00): 保留位
524 //---------------D3,2,1,0(1011):N表示分頻系數輸出頻率為48MHz/(N+1)
525 //== 時 間:2008.8.13 創建函數
526 //== 入口參數:無
527 //== 返 回 值:0
528 //===============================================================================//
529 unsigned char connect_usb(void)
530 {
531 1 #ifdef __DEBUG__ //== 打印調試信息
532 1 Print_Msg("Runing connect_usb()!\r\n");
533 1 #endif
534 1
535 1 #ifdef __DEBUG__ //== 打印調試信息
536 1 Print_Msg(" 連接USB...............\r\n");
537 1 #endif
538 1
539 1 write_D12_command(0xf3); //== 初始化USBD12
540 1 write_a_D12_data(0x1e); //== 連接USB
541 1 write_a_D12_data(0x47); //== 設置頻率
542 1 return 0;
543 1 }
544
545 //===============================================================================//
546 //== 函 數 名:init_usb
547 //== 功 能:初始化D12
548 //== 說 明:
549 //== 時 間:2008.8.13 創建函數
550 //== 入口參數:無
551 //== 返 回 值:0
C51 COMPILER V7.50 PDIUSBD12 11/24/2008 09:12:37 PAGE 10
552 //===============================================================================//
553 unsigned char init_usb(void)
554 {
555 1 #ifdef __DEBUG__ //== 打印調試信息
556 1 Print_Msg("Runing init_usb()!\r\n");
557 1 #endif
558 1
559 1 #ifdef __DEBUG__ //== 打印調試信息
560 1 Print_Msg(" set+enable D12 address!\r\n");
561 1 #endif
562 1
563 1 set_usb_addr(0);
564 1 set_endpoint_enable();
565 1 return 0;
566 1 }
567
568 //===============================================================================//
569 //== 函 數 名:D12_ReadChipID
570 //== 功 能:讀取D12版本號
571 //== 說 明:
572 //== 時 間:2008.8.13 創建函數
573 //== 入口參數:無
574 //== 返 回 值:0
575 //===============================================================================//
576 unsigned char D12_ReadChipID(void)
577 {
578 1 unsigned char Chip_ID[2];
579 1 #ifdef __DEBUG__ //== 打印調試信息
580 1 Print_Msg("D12_ReadChipID()!\r\n");
581 1 #endif
582 1 write_D12_command(Read_ChipID);
583 1 Chip_ID[0] = read_a_D12_data();
584 1 Chip_ID[1] = read_a_D12_data();
585 1 Print_Msg(" Chip_ID:");
586 1 Print_Hex(Chip_ID, 2);
587 1 Print_Msg("!\r\n");
588 1 return 0;
589 1 }
590 //===============================================================================//
591 //== 函 數 名:endp0_out
592 //== 功 能:終端點0輸出中斷處理
593 //== 說 明:
594 //== 時 間:2008.8.13 創建函數
595 //== 入口參數:無
596 //== 返 回 值:0
597 //===============================================================================//
598 unsigned char endp0_out(void)
599 {
600 1 unsigned char i;
601 1 #ifdef __DEBUG__ //== 打印調試信息
602 1 Print_Msg("Runing endp0_out()!\r\n");
603 1 #endif
604 1
605 1 D12_last_status.Register = read_last_status(0); //== 讀取端點0的最后狀態寄存器并清中斷標志
606 1
607 1 if (D12_last_status.Status.setup_packet) //== 如果收到建立(setup)包
608 1 {
609 2 Control_Data.wLength = 0; //== 傳輸字節總數清零
610 2 Control_Data.wCount = 0; //== 傳輸字節計數器清零
611 2 if (read_endpoint_buff(0,sizeof(Control_Data.DeviceRequest),(unsigned char *)(&(Control_Data.DeviceReque
-st))) != sizeof(REQUESTCMD))
612 2 { //== 如果從端點0讀取8個字節失敗
C51 COMPILER V7.50 PDIUSBD12 11/24/2008 09:12:37 PAGE 11
613 3 set_endpoint_status(0,0); //== 停止控制端點0
614 3 set_endpoint_status(1,0); //== 停止控制端點1
615 3 bEPPflags.bits.control_state = USB_IDLE;
616 3 return 1;
617 3 }
618 2
619 2 Print_Hex((unsigned char*)(&(Control_Data.DeviceRequest)), 8);
620 2 Print_Msg("!\r\n");
621 2
622 2 Control_Data.DeviceRequest.wValue = SWAP16(Control_Data.DeviceRequest.wValue);
623 2 Control_Data.DeviceRequest.wIndex = SWAP16(Control_Data.DeviceRequest.wIndex);
624 2 Control_Data.DeviceRequest.wLength = SWAP16(Control_Data.DeviceRequest.wLength);
625 2
626 2 Print_Hex((unsigned char*)(&(Control_Data.DeviceRequest)), 8);
627 2 Print_Msg("!\r\n");
628 2
629 2 ack_setup(0); //== 對控制端點0 進行建立包應答
630 2 ack_setup(1); //== 對控制端點1 進行建立包應答
631 2
632 2 Control_Data.wLength = Control_Data.DeviceRequest.wLength; //== 取出要傳輸數據的總字節數
633 2 Control_Data.wCount = 0; //== 傳輸字節計數器清零
634 2
635 2 if (Control_Data.DeviceRequest.bmRequestType&0x80) //== 如果控制傳輸是控制讀取(設備到主機)
636 2 {
637 3 bEPPflags.bits.setup_packet_in = 1; //== 通知處理Setup 包,get command
638 3 bEPPflags.bits.control_state = USB_IDLE;
639 3 }
640 2 else //== 控制輸出(主機到設備),不過要向主機返回一個長度為0的數據包
641 2 {
642 3 if (Control_Data.DeviceRequest.wLength == 0) //== set command 返回信息的字節長度是0
643 3 {
644 4 bEPPflags.bits.setup_packet_out = 1;
645 4 bEPPflags.bits.control_state = USB_IDLE;
646 4 }
647 3 else
648 3 {
649 4 if (Control_Data.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) //== 主機發給設備的令牌包的數據
650 4 { //-- 長度不能大于8個字節
651 5 bEPPflags.bits.control_state = USB_IDLE;
652 5 set_endpoint_status(0,1); //== 運行控制端點0
653 5 set_endpoint_status(1,1); //== 運行控制端點1
654 5 }
655 4 else
656 4 {
657 5 bEPPflags.bits.control_state = USB_RECEIVE; //== set command with OUT token
658 5 }
659 4 } //== set command with data
660 3 } //== else set command
661 2 } //== if setup packet
662 1 else
663 1 {
664 2 if (bEPPflags.bits.control_state == USB_RECEIVE)
665 2 {
666 3 i = read_endpoint_buff(0, EP0_PACKET_SIZE, Control_Data.dataBuffer + Control_Data.wCount);
667 3 Control_Data.wCount += i;
668 3 if ((i != EP0_PACKET_SIZE) || (Control_Data.wCount >= Control_Data.wLength))
669 3 {
670 4 bEPPflags.bits.setup_packet_out = 1;
671 4 bEPPflags.bits.control_state = USB_IDLE;
672 4 }
673 3 }
674 2 else
C51 COMPILER V7.50 PDIUSBD12 11/24/2008 09:12:37 PAGE 12
675 2 {
676 3 bEPPflags.bits.control_state = USB_IDLE;
677 3 }
678 2 }
679 1 select_endpoint(0); //== 這是必須的
680 1 clear_buffer();
681 1
682 1 return 0;
683 1 }
684
685 //===============================================================================//
686 //== 函 數 名:endp0_in
687 //== 功 能:終端點0輸入處理
688 //== 說 明:
689 //== 時 間:2008.8.13 創建函數
690 //== 入口參數:無
691 //== 返 回 值:0
692 //===============================================================================//
693 unsigned char endp0_in(void)
694 {
695 1 short i;
696 1
697 1 #ifdef __DEBUG__ //== 打印調試信息
698 1 Print_Msg("Runing endp0_in()!\r\n");
699 1 #endif
700 1 bEPPflags.bits.usb_endp0_in = 1;
701 1 i = Control_Data.wLength - Control_Data.wCount;
702 1 D12_last_status.Register = read_last_status(1); //== Clear interrupt flag
703 1 if (bEPPflags.bits.control_state != USB_TRANSMIT)
704 1 return 1;
705 1
706 1 if (i >= EP0_PACKET_SIZE) //== 一次沒傳完
707 1 {
708 2 write_endpoint_buff(1, EP0_PACKET_SIZE, Control_Data.pData + Control_Data.wCount);
709 2
710 2 if (bEPPflags.bits.first_get_descriptor)
711 2 {
712 3 bEPPflags.bits.control_state = USB_IDLE; //== 第一次傳控制端點最大緩沖區的字節數就可以(在這里是16)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -