📄 usb.lst
字号:
341
342 void SCSI_Read10()
343 {
344 1 unsigned char data i;
345 1 union
346 1 {
347 1 unsigned long Block;
348 1 unsigned char Addr[4];
349 1 }data BLK;
350 1 unsigned char length; //传输的簇数
351 1 //将起始地址变换为K9F5608适合的模式;
352 1 // BLK.Addr[0] = bulk_CBW.CBWCB[2];
353 1 // BLK.Addr[1] = bulk_CBW.CBWCB[3];
354 1 BLK.Addr[2] = bulk_CBW.CBWCB[4];
355 1 BLK.Addr[3] = bulk_CBW.CBWCB[5];
356 1
357 1 //将扇区数填入计数变量每循环一次读出一扇区的值;
358 1 // PG.Addr[0] = bulk_CBW.CBWCB[7];
359 1 // PG.Addr[1] = bulk_CBW.CBWCB[8];
360 1 length = bulk_CBW.CBWCB[8];
361 1 while(length>0)
362 1 {
363 2
364 2 K9F_FUN = COMMAND; //读出一个page
C51 COMPILER V7.50 USB 02/08/2007 11:18:10 PAGE 7
365 2 *((unsigned char xdata *)K9F5608) = 0x00;
366 2 K9F_FUN = ADDRESS;
367 2 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
368 2 *((unsigned char xdata *)K9F5608) = BLK.Addr[3]; //A9-A16
369 2 *((unsigned char xdata *)K9F5608) = BLK.Addr[2]; //A17-A24
370 2
371 2 K9F_FUN = D_DATA;
372 2 UEPNUM=0x01; //指向端点
373 2 UEPSTAX|=DIR; //传输方向
374 2 while(!(K9F_FUN & RB));
375 2
376 2 for(i=0;i<8;i++) //读出512个字节的数据发送到usb
377 2 {
378 3 ReadFlash();
379 3 UEPSTAX|=TXRDY;
380 3 while(!(UEPSTAX&TXCMP)); //等待发送完成
381 3 UEPSTAX&=(~(TXCMP)); //清中断标志clear TXCMP
382 3 UEPINT=0;
383 3 }
384 2 *((unsigned char xdata *)K9F5608) = INACTIVE;
385 2
386 2 length--; //传输的簇数减1
387 2 BLK.Block ++; //flash的页地址加1
388 2 }
389 1 TransmitCSW(); //返回CSW
390 1 }
391
392 void delay() //延时20us
393 {
394 1 unsigned char data i=10;
395 1 while(i-->0);
396 1 }
397
398 #define BuffBlock (0xc0) //缓冲区为从偶数块开始的连续两个Block 这里定为2046和2047两个Block
399 //BuffBlock只代表块号的低字节
400 void SCSI_Write10() //之所以选用两个Block作为缓冲区,与Flash的Copy - Back功能的特性相关,
401 { //清仔细阅读Flash 的datasheet
402 1 unsigned char Page_Buf[512];
403 1 unsigned int j;
404 1 union
405 1 {
406 1 unsigned long page;
407 1 unsigned char addr[4];
408 1 }data PG;
409 1
410 1 unsigned char data i=0,length=0,nBeginPage=0;
411 1
412 1 //所有写入都要缓冲,所以先清除缓冲区
413 1 K9F_FUN = COMMAND;
414 1 *((unsigned char xdata *)K9F5608) = 0x60; //擦除第2046个Block作为缓冲区
415 1 K9F_FUN = ADDRESS;
416 1 *((unsigned char xdata *)K9F5608) = BuffBlock; //A9-A16
417 1 *((unsigned char xdata *)K9F5608) = 0xff; //A17-A24
418 1 K9F_FUN = COMMAND;
419 1 *((unsigned char xdata *)K9F5608) = 0xd0;
420 1 K9F_FUN = D_DATA;
421 1 delay();
422 1 // printuf(" %x",PG.addr[0]);printuf(" %x",PG.addr[1]);printuf(" %x",PG.addr[2]);printuf(" %x",PG.addr[3]
-);
423 1 // printuf(" %x",length); printuf(" %x",nBeginPage);
424 1 while(!(K9F_FUN & RB)); //等待擦除操作的完成
425 1
C51 COMPILER V7.50 USB 02/08/2007 11:18:10 PAGE 8
426 1 K9F_FUN = COMMAND;
427 1 *((unsigned char xdata *)K9F5608) = 0x60; //擦除第2047个Block作为缓冲区
428 1 K9F_FUN = ADDRESS;
429 1 *((unsigned char xdata *)K9F5608) = BuffBlock|0x20; //A9-A16
430 1 *((unsigned char xdata *)K9F5608) = 0xff; //A17-A24
431 1 K9F_FUN = COMMAND;
432 1 *((unsigned char xdata *)K9F5608) = 0xd0;
433 1 K9F_FUN = D_DATA;
434 1 delay();
435 1 while(!(K9F_FUN & RB));
436 1 //从SCSI命令中分离出逻辑地址
437 1 // PG.addr[0] = bulk_CBW.CBWCB[2];
438 1 // PG.addr[1] = bulk_CBW.CBWCB[3];
439 1 PG.addr[2] = bulk_CBW.CBWCB[4]; //PG为前面定义的结构体
440 1 PG.addr[3] = bulk_CBW.CBWCB[5];
441 1
442 1 length = bulk_CBW.CBWCB[8]; //windows 系统每次写入的最大长度为0x80个扇区取一字节已够用
443 1 nBeginPage = PG.addr[3]&0x1f; //计算出要写入块内的要写入的起始扇区号
444 1 UEPNUM = 0x02; //指向Bulk端点2
445 1 delay();
446 1 while(!(K9F_FUN & RB)); //等待擦除操作的完成
447 1
448 1 if(nBeginPage>0) //如果起始写入page与flash的Block未对齐,则将当前Block中的前nBeginPage页
449 1 { //拷贝到缓冲区的相同位置
450 2 for(i=0;i<nBeginPage;i++)
451 2 {
452 3 /*COPY BACK命令 001*************************
453 3 K9F_FUN = COMMAND;
454 3 *((unsigned char xdata *)K9F5608) = 0x00; //命令的第一个字节
455 3 K9F_FUN = ADDRESS;
456 3 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
457 3 *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0xe0)|i; //A9-A16
458 3 *((unsigned char xdata *)K9F5608) = PG.addr[2]; //A17-A24
459 3 K9F_FUN = D_DATA;
460 3 delay();
461 3 while(!(K9F_FUN & RB)); //等待操作的完成
462 3
463 3 K9F_FUN = COMMAND;
464 3 *((unsigned char xdata *)K9F5608) = 0x8a; //命令的第二个字节
465 3 K9F_FUN = ADDRESS;
466 3 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
467 3 *((unsigned char xdata *)K9F5608) = BuffBlock|(PG.addr[3]&0x20)|i; //A9-A16
468 3 *((unsigned char xdata *)K9F5608) = 0xff; //A17-A24
469 3 K9F_FUN = D_DATA;
470 3 delay();
471 3 while(!(K9F_FUN & RB)); //等待操作的完成
472 3 END OF COPY BACK命令 001**************************/
473 3 //void ReadPage(unsigned int block, unsigned int page, unsigned char *pPage)
474 3
475 3 //unsigned int blockPage = (block << 5) | page;
476 3 K9F_FUN = COMMAND;
477 3 *((unsigned char xdata *)K9F5608) = 0x00;
478 3 K9F_FUN = ADDRESS;
479 3 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
480 3 *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0xe0)|i; //A9-A16
481 3 *((unsigned char xdata *)K9F5608) = PG.addr[2]; //A17-A24
482 3 K9F_FUN = D_DATA;
483 3
484 3
485 3 while(!(K9F_FUN & RB)); //等待操作的完成
486 3
487 3 for(j=0;j<512;j++)
C51 COMPILER V7.50 USB 02/08/2007 11:18:10 PAGE 9
488 3 {
489 4 Page_Buf[j]= *((unsigned char xdata *)K9F5608);
490 4 }
491 3 //int WritePage(unsigned int block, unsigned int page, unsigned char *pPage)
492 3 //{
493 3 //j = 512;
494 3 //unsigned int blockPage = (block << 5) + page;
495 3
496 3 K9F_FUN = COMMAND;
497 3 *((unsigned char xdata *)K9F5608) = 0x80;
498 3 K9F_FUN = ADDRESS;
499 3 *((unsigned char xdata *)K9F5608) = 0;
500 3 *((unsigned char xdata *)K9F5608) = BuffBlock|(PG.addr[3]&0x20)|i;
501 3 *((unsigned char xdata *)K9F5608) =0xff;
502 3 K9F_FUN = D_DATA;
503 3
504 3 for(j=0;j<512;j++)
505 3 {
506 4 *((unsigned char xdata *)K9F5608)= Page_Buf[j];
507 4 }
508 3
509 3 K9F_FUN = COMMAND;
510 3 *((unsigned char xdata *)K9F5608) = 0x10;
511 3 delay();
512 3 while(!(K9F_FUN & RB)); //等待操作的完
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -