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