📄 usb.lst
字号:
480 2 while(!(K9F_FUN & RB)); //等待操作的完成
481 2
482 2 if(((PG.addr[3]&0x1f)==0x1f)||(length==0)) //缓冲区写满即写满32页或传输数据结束时
483 2 {
484 3
485 3 for(i=((PG.addr[3]&0x1f)+1);i<32;i++) //如果当length==0时并且(PG.addr[3]&0x1f)!=0x1f
486 3 { //拷贝从((PG.addr[3]&0x1f)+1)到32号页的数据到缓冲区的对应位置
487 4 K9F_FUN = COMMAND; //执行Flash的COPY-BACK命令
C51 COMPILER V7.50 USB 03/19/2006 13:41:49 PAGE 9
488 4 *((unsigned char xdata *)K9F5608) = 0x00;
489 4 K9F_FUN = ADDRESS;
490 4 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
491 4 *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0xe0)|i; //A9-A16
492 4 *((unsigned char xdata *)K9F5608) = PG.addr[2]; //A17-A24
493 4 K9F_FUN = D_DATA;
494 4 delay();
495 4 while(!(K9F_FUN & RB)); //等待操作的完成
496 4
497 4 K9F_FUN = COMMAND;
498 4 *((unsigned char xdata *)K9F5608) = 0x8a;
499 4 K9F_FUN = ADDRESS;
500 4 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
501 4 *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0x20)|BuffBlock|i; //A9-A16
502 4 *((unsigned char xdata *)K9F5608) = 0xff; //A17-A24
503 4 K9F_FUN = D_DATA;
504 4 delay();
505 4 while(!(K9F_FUN & RB)); //等待操作的完成
506 4 }
507 3
508 3 K9F_FUN = COMMAND;
509 3 *((unsigned char xdata *)K9F5608) = 0x60; //擦除当前block
510 3 K9F_FUN = ADDRESS;
511 3 *((unsigned char xdata *)K9F5608) = PG.addr[3]; //A9-A16
512 3 *((unsigned char xdata *)K9F5608) = PG.addr[2]; //A17-A24
513 3 K9F_FUN = COMMAND;
514 3 *((unsigned char xdata *)K9F5608) = 0xd0;
515 3 K9F_FUN = D_DATA;
516 3 delay();
517 3 while(!(K9F_FUN & RB)); //等待操作的完成
518 3
519 3 for(i=0;i<32;i++) //将缓冲Block中的内容拷贝到当前Block中
520 3 {
521 4 K9F_FUN = COMMAND;
522 4 *((unsigned char xdata *)K9F5608) = 0x00;
523 4 K9F_FUN = ADDRESS;
524 4 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
525 4 *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0x20)|BuffBlock|i; //A9-A16
526 4 *((unsigned char xdata *)K9F5608) = 0xff; //A17-A24
527 4 K9F_FUN = D_DATA;
528 4 delay();
529 4 while(!(K9F_FUN & RB)); //等待操作的完成
530 4
531 4 K9F_FUN = COMMAND;
532 4 *((unsigned char xdata *)K9F5608) = 0x8a;
533 4 K9F_FUN = ADDRESS;
534 4 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
535 4 *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0xe0)|i; //A9-A16
536 4 *((unsigned char xdata *)K9F5608) = PG.addr[2]; //A17-A24
537 4 K9F_FUN = D_DATA;
538 4 delay();
539 4 while(!(K9F_FUN & RB)); //等待操作的完成
540 4 }
541 3
542 3 if(length>0) //传输未完成时
543 3 {
544 4 K9F_FUN = COMMAND;
545 4 *((unsigned char xdata *)K9F5608) = 0x60; //擦除相应的缓冲区
546 4 K9F_FUN = ADDRESS;
547 4 *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0x20)|BuffBlock; //A9-A16
548 4 *((unsigned char xdata *)K9F5608) = 0xff; //A17-A24
549 4 K9F_FUN = COMMAND;
C51 COMPILER V7.50 USB 03/19/2006 13:41:49 PAGE 10
550 4 *((unsigned char xdata *)K9F5608) = 0xD0;
551 4 K9F_FUN = D_DATA;
552 4 delay();
553 4 while(!(K9F_FUN & RB)); //等待操作的完成
554 4 }
555 3 }
556 2 PG.page++; //逻辑簇地址加1
557 2 }
558 1
559 1 TransmitCSW(); //向Host返回CSW
560 1 // printuf(" %x",PG.addr[0]);printuf(" %x",PG.addr[1]);printuf(" %x",PG.addr[2]);printuf(" %x\n",PG.add
-r[3]);
561 1 }
562
563 void main_rxdone()
564 {
565 1 unsigned char data i;
566 1 unsigned char data Buf[64];
567 1
568 1 i = ReadEp(2,Buf); //读出端点数据
569 1 // if(Buf[0] == 0x55) //命令数据包
570 1 // {
571 1 P3_5 =0; //指示灯亮
572 1 bulk_CSW[4] = Buf[4]; bulk_CSW[5] = Buf[5]; bulk_CSW[6] = Buf[6]; bulk_CSW[7] = Buf[7];
573 1 for(i=0;i<12;i++) bulk_CBW.CBWCB[i] = Buf[i+15];
574 1 switch(bulk_CBW.CBWCB[0])
575 1 {
576 2 case Inquiry :WriteEpBulk(1,36,B_InquiryData);break;
577 2 case Mode_Sense :SCSI_Mode_Sense(); break;
578 2 case Read10 :SCSI_Read10(); break;
579 2 case Read_Capacity :WriteEpBulk(1, sizeof(B_Read_Capacity), B_Read_Capacity);break;
580 2 case Read_Format_Capacities :SCSI_Read_Format_Capacities(); break;
581 2 case Test_Unit_Ready :TransmitCSW(); break;
582 2 case Verify :TransmitCSW(); break;
583 2 // case Write10 :SCSI_Write10(); break;
584 2 case Medium_Removal :TransmitCSW(); break;
585 2 }
586 1 P3_5 =1; //指示灯灭
587 1 // }
588 1 // else
589 1 // SCSI_Write10();
590 1
591 1 }
592 //flash芯片复位函数
593 void Flash_Reset(void) //flash reset
594 {
595 1 unsigned int data i;
596 1 K9F_FUN = COMMAND;
597 1 *((unsigned char xdata *)K9F5608) = 0xff; //reset command
598 1 for (i=0; i<3000; i++) ; //delay
599 1 }
600
601 //读取一个page的内容
602 void ReadPage(unsigned int block, unsigned int page, unsigned char *pPage)
603 {
604 1 int i;
605 1 unsigned int blockPage = (block << 5) | page;
606 1
607 1 K9F_FUN = COMMAND;
608 1 *((unsigned char xdata *)K9F5608) = 0x00;
609 1 K9F_FUN = ADDRESS;
610 1 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
C51 COMPILER V7.50 USB 03/19/2006 13:41:49 PAGE 11
611 1 *((unsigned char xdata *)K9F5608) = blockPage & 0xff; //A9-A16
612 1 *((unsigned char xdata *)K9F5608) = (blockPage >> 8) & 0xff; //A17-A24
613 1 K9F_FUN = D_DATA;
614 1
615 1 i = 512;
616 1 while(!(K9F_FUN & RB)); //等待操作的完成
617 1
618 1 while((i--)>0)
619 1 {
620 2 *pPage++ = *((unsigned char xdata *)K9F5608);
621 2 }
622 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1514 ----
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 + -