📄 usb.lst
字号:
514 3 while (!(UEPINT & 0x04)); //等待接收数据RXOUTB1
515 3 //写64字节
516 3 WriteFlash();
517 3 UEPSTAX &= 0xB9; //准备再接收
518 3 UEPINT = 0;
519 3 }
520 2 K9F_FUN = COMMAND;
521 2 *((unsigned char xdata *)K9F5608) = 0x10;
522 2 K9F_FUN = D_DATA;
523 2 length--; //传输的扇区数减1
524 2 delay();
525 2 while(!(K9F_FUN & RB)); //等待操作的完成
526 2
527 2 if(((PG.addr[3]&0x1f)==0x1f)||(length==0)) //缓冲区写满即写满32页或传输数据结束时
528 2 {
529 3
530 3 for(i=((PG.addr[3]&0x1f)+1);i<32;i++) //如果当length==0时并且(PG.addr[3]&0x1f)!=0x1f
531 3 { //拷贝从((PG.addr[3]&0x1f)+1)到32号页的数据到缓冲区的对应位置
532 4 K9F_FUN = COMMAND; //执行Flash的COPY-BACK命令
533 4 *((unsigned char xdata *)K9F5608) = 0x00;
534 4 K9F_FUN = ADDRESS;
535 4 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
536 4 *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0xe0)|i; //A9-A16
537 4 *((unsigned char xdata *)K9F5608) = PG.addr[2]; //A17-A24
538 4 K9F_FUN = D_DATA;
539 4 delay();
C51 COMPILER V7.06 USB 03/21/2006 09:38:04 PAGE 8
540 4 while(!(K9F_FUN & RB)); //等待操作的完成
541 4
542 4 K9F_FUN = COMMAND;
543 4 *((unsigned char xdata *)K9F5608) = 0x8a;
544 4 K9F_FUN = ADDRESS;
545 4 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
546 4 *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0x20)|BuffBlock|i; //A9-A16
547 4 *((unsigned char xdata *)K9F5608) = 0xff; //A17-A24
548 4 K9F_FUN = D_DATA;
549 4 delay();
550 4 while(!(K9F_FUN & RB)); //等待操作的完成
551 4 }
552 3
553 3 K9F_FUN = COMMAND;
554 3 *((unsigned char xdata *)K9F5608) = 0x60; //擦除当前block
555 3 K9F_FUN = ADDRESS;
556 3 *((unsigned char xdata *)K9F5608) = PG.addr[3]; //A9-A16
557 3 *((unsigned char xdata *)K9F5608) = PG.addr[2]; //A17-A24
558 3 K9F_FUN = COMMAND;
559 3 *((unsigned char xdata *)K9F5608) = 0xd0;
560 3 K9F_FUN = D_DATA;
561 3 delay();
562 3 while(!(K9F_FUN & RB)); //等待操作的完成
563 3
564 3 for(i=0;i<32;i++) //将缓冲Block中的内容拷贝到当前Block中
565 3 {
566 4 K9F_FUN = COMMAND;
567 4 *((unsigned char xdata *)K9F5608) = 0x00;
568 4 K9F_FUN = ADDRESS;
569 4 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
570 4 *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0x20)|BuffBlock|i; //A9-A16
571 4 *((unsigned char xdata *)K9F5608) = 0xff; //A17-A24
572 4 K9F_FUN = D_DATA;
573 4 delay();
574 4 while(!(K9F_FUN & RB)); //等待操作的完成
575 4
576 4 K9F_FUN = COMMAND;
577 4 *((unsigned char xdata *)K9F5608) = 0x8a;
578 4 K9F_FUN = ADDRESS;
579 4 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
580 4 *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0xe0)|i; //A9-A16
581 4 *((unsigned char xdata *)K9F5608) = PG.addr[2]; //A17-A24
582 4 K9F_FUN = D_DATA;
583 4 delay();
584 4 while(!(K9F_FUN & RB)); //等待操作的完成
585 4 }
586 3
587 3 if(length>0) //传输未完成时
588 3 {
589 4 K9F_FUN = COMMAND;
590 4 *((unsigned char xdata *)K9F5608) = 0x60; //擦除相应的缓冲区
591 4 K9F_FUN = ADDRESS;
592 4 *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0x20)|BuffBlock; //A9-A16
593 4 *((unsigned char xdata *)K9F5608) = 0xff; //A17-A24
594 4 K9F_FUN = COMMAND;
595 4 *((unsigned char xdata *)K9F5608) = 0xD0;
596 4 K9F_FUN = D_DATA;
597 4 delay();
598 4 while(!(K9F_FUN & RB)); //等待操作的完成
599 4 }
600 3 }
601 2 PG.page++; //逻辑簇地址加1
602 2 }
603 1
604 1 TransmitCSW(); //向Host返回CSW
605 1 // printuf(" %x",PG.addr[0]);printuf(" %x",PG.addr[1]);printuf(" %x",PG.addr[2]);printuf(" %x\n",PG.addr[3]);
606 1 }
607
608 void main_rxdone()
609 {
610 1 unsigned char data i;
611 1 unsigned char data Buf[64];
612 1
613 1 i = ReadEp(2,Buf); //读出端点数据
614 1 // if(Buf[0] == 0x55) //命令数据包
615 1 // {
616 1 P3_5 =0; //指示灯亮
617 1 bulk_CSW[4] = Buf[4]; bulk_CSW[5] = Buf[5]; bulk_CSW[6] = Buf[6]; bulk_CSW[7] = Buf[7];
C51 COMPILER V7.06 USB 03/21/2006 09:38:04 PAGE 9
618 1 for(i=0;i<12;i++) bulk_CBW.CBWCB[i] = Buf[i+15];
619 1 switch(bulk_CBW.CBWCB[0])
620 1 {
621 2 case Inquiry :WriteEpBulk(1,36,B_InquiryData);break;
622 2 case Mode_Sense :SCSI_Mode_Sense(); break;
623 2 case Read10 :SCSI_Read10(); break;
624 2 case Read_Capacity :WriteEpBulk(1, sizeof(B_Read_Capacity), B_Read_Capacity);break;
625 2 case Read_Format_Capacities :SCSI_Read_Format_Capacities(); break;
626 2 case Test_Unit_Ready :TransmitCSW(); break;
627 2 case Verify :TransmitCSW(); break;
628 2 case Write10 :SCSI_Write10(); break;
629 2 case Medium_Removal :TransmitCSW(); break;
630 2 }
631 1 P3_5 =1; //指示灯灭
632 1 // }
633 1 // else
634 1 // SCSI_Write10();
635 1
636 1 }
637 //flash芯片复位函数
638 void Flash_Reset(void) //flash reset
639 {
640 1 unsigned int data i;
641 1 K9F_FUN = COMMAND;
642 1 *((unsigned char xdata *)K9F5608) = 0xff; //reset command
643 1 for (i=0; i<3000; i++) ; //delay
644 1 }
645
646 //读取一个page的内容
647 void ReadPage(unsigned int block, unsigned int page, unsigned char *pPage)
648 {
649 1 int i;
650 1 unsigned int blockPage = (block << 5) | page;
651 1
652 1 K9F_FUN = COMMAND;
653 1 *((unsigned char xdata *)K9F5608) = 0x00;
654 1 K9F_FUN = ADDRESS;
655 1 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
656 1 *((unsigned char xdata *)K9F5608) = blockPage & 0xff; //A9-A16
657 1 *((unsigned char xdata *)K9F5608) = (blockPage >> 8) & 0xff; //A17-A24
658 1 K9F_FUN = D_DATA;
659 1
660 1 i = 512;
661 1 while(!(K9F_FUN & RB)); //等待操作的完成
662 1
663 1 while((i--)>0)
664 1 {
665 2 *pPage++ = *((unsigned char xdata *)K9F5608);
666 2 }
667 1 }
668
669
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1526 ----
CONSTANT SIZE = 184 ----
XDATA SIZE = ---- 13
PDATA SIZE = ---- ----
DATA SIZE = 25 118
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -