📄 usb.lst
字号:
317 1 else {WriteEpBulk(1, sizeof(B_Mode_Sense_ZERO), B_Mode_Sense_ZERO);}
318 1 }
319
320 void SCSI_Read_Format_Capacities()
321 {
322 1 if(bulk_CBW.CBWCB[7]==0 && bulk_CBW.CBWCB[8]==0)return;
323 1 WriteEpBulk(1, sizeof(B_Read_Format_capacities), B_Read_Format_capacities);
324 1 }
325
326 extern void ReadFlash();
327 extern void WriteFlash();
328
329 void SCSI_Read10()
330 {
331 1 unsigned char data i;
332 1 union
333 1 {
334 1 unsigned long Block;
335 1 unsigned char Addr[4];
336 1 }data BLK;
337 1 unsigned char length; //传输的簇数
338 1 //将起始地址变换为K9F5608适合的模式;
339 1 // BLK.Addr[0] = bulk_CBW.CBWCB[2];
340 1 // BLK.Addr[1] = bulk_CBW.CBWCB[3];
341 1 BLK.Addr[2] = bulk_CBW.CBWCB[4];
342 1 BLK.Addr[3] = bulk_CBW.CBWCB[5];
343 1
344 1 //将扇区数填入计数变量每循环一次读出一扇区的值;
345 1 // PG.Addr[0] = bulk_CBW.CBWCB[7];
346 1 // PG.Addr[1] = bulk_CBW.CBWCB[8];
347 1 length = bulk_CBW.CBWCB[8];
348 1 while(length>0)
349 1 {
350 2
351 2 K9F_FUN = COMMAND; //读出一个page
352 2 *((unsigned char xdata *)K9F5608) = 0x00;
353 2 K9F_FUN = ADDRESS;
354 2 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
355 2 *((unsigned char xdata *)K9F5608) = BLK.Addr[3]; //A9-A16
356 2 *((unsigned char xdata *)K9F5608) = BLK.Addr[2]; //A17-A24
357 2
358 2 K9F_FUN = D_DATA;
359 2 UEPNUM=0x01; //指向端点
360 2 UEPSTAX|=DIR; //传输方向
361 2 while(!(K9F_FUN & RB));
362 2
363 2 for(i=0;i<8;i++) //读出512个字节的数据发送到usb
364 2 {
C51 COMPILER V7.50 USB 03/19/2006 13:41:49 PAGE 7
365 3 ReadFlash();
366 3 UEPSTAX|=TXRDY;
367 3 while(!(UEPSTAX&TXCMP)); //等待发送完成
368 3 UEPSTAX&=(~(TXCMP)); //清中断标志clear TXCMP
369 3 UEPINT=0;
370 3 }
371 2 *((unsigned char xdata *)K9F5608) = INACTIVE;
372 2
373 2 length--; //传输的簇数减1
374 2 BLK.Block ++; //flash的页地址加1
375 2 }
376 1 TransmitCSW(); //返回CSW
377 1 }
378
379 void delay() //延时20us
380 {
381 1 unsigned char data i=20;
382 1 while(i-->0);
383 1 }
384
385 #define BuffBlock (0xc0) //缓冲区为从偶数块开始的连续两个Block 这里定为2046和2047两个Block
386 //BuffBlock只代表块号的低字节
387 void SCSI_Write10() //之所以选用两个Block作为缓冲区,与Flash的Copy - Back功能的特性相关,
388 { //清仔细阅读Flash 的datasheet
389 1 union
390 1 {
391 1 unsigned long page;
392 1 unsigned char addr[4];
393 1 }data PG;
394 1
395 1 unsigned char data i=0,length=0,nBeginPage=0;
396 1
397 1 //所有写入都要缓冲,所以先清除缓冲区
398 1 K9F_FUN = COMMAND;
399 1 *((unsigned char xdata *)K9F5608) = 0x60; //擦除第2046个Block作为缓冲区
400 1 K9F_FUN = ADDRESS;
401 1 *((unsigned char xdata *)K9F5608) = BuffBlock; //A9-A16
402 1 *((unsigned char xdata *)K9F5608) = 0xff; //A17-A24
403 1 K9F_FUN = COMMAND;
404 1 *((unsigned char xdata *)K9F5608) = 0xd0;
405 1 K9F_FUN = D_DATA;
406 1 delay();
407 1 // printuf(" %x",PG.addr[0]);printuf(" %x",PG.addr[1]);printuf(" %x",PG.addr[2]);printuf(" %x",PG.addr[
-3]);
408 1 // printuf(" %x",length); printuf(" %x",nBeginPage);
409 1 while(!(K9F_FUN & RB)); //等待擦除操作的完成
410 1
411 1 K9F_FUN = COMMAND;
412 1 *((unsigned char xdata *)K9F5608) = 0x60; //擦除第2047个Block作为缓冲区
413 1 K9F_FUN = ADDRESS;
414 1 *((unsigned char xdata *)K9F5608) = BuffBlock|0x20; //A9-A16
415 1 *((unsigned char xdata *)K9F5608) = 0xff; //A17-A24
416 1 K9F_FUN = COMMAND;
417 1 *((unsigned char xdata *)K9F5608) = 0xd0;
418 1 K9F_FUN = D_DATA;
419 1 //从SCSI命令中分离出逻辑地址
420 1 // PG.addr[0] = bulk_CBW.CBWCB[2];
421 1 // PG.addr[1] = bulk_CBW.CBWCB[3];
422 1 PG.addr[2] = bulk_CBW.CBWCB[4];
423 1 PG.addr[3] = bulk_CBW.CBWCB[5];
424 1
425 1 length = bulk_CBW.CBWCB[8]; //windows 系统每次写入的最大长度为0x80个扇区取一字节已够用
C51 COMPILER V7.50 USB 03/19/2006 13:41:49 PAGE 8
426 1 nBeginPage = PG.addr[3]&0x1f; //计算出要写入块内的要写入的起始扇区号
427 1 UEPNUM = 0x02; //指向Bulk端点2
428 1 delay();
429 1 while(!(K9F_FUN & RB)); //等待擦除操作的完成
430 1
431 1 if(nBeginPage>0) //如果起始写入page与flash的Block未对齐,则将当前Block中的前nBeginPage页
432 1 { //拷贝到缓冲区的相同位置
433 2 for(i=0;i<nBeginPage;i++)
434 2 {
435 3 K9F_FUN = COMMAND;
436 3 *((unsigned char xdata *)K9F5608) = 0x00; //命令的第一个字节
437 3 K9F_FUN = ADDRESS;
438 3 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
439 3 *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0xe0)|i; //A9-A16
440 3 *((unsigned char xdata *)K9F5608) = PG.addr[2]; //A17-A24
441 3 K9F_FUN = D_DATA;
442 3 delay();
443 3 while(!(K9F_FUN & RB)); //等待操作的完成
444 3
445 3 K9F_FUN = COMMAND;
446 3 *((unsigned char xdata *)K9F5608) = 0x8a; //命令的第二个字节
447 3 K9F_FUN = ADDRESS;
448 3 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
449 3 *((unsigned char xdata *)K9F5608) = BuffBlock|(PG.addr[3]&0x20)|i; //A9-A16
450 3 *((unsigned char xdata *)K9F5608) = 0xff; //A17-A24
451 3 K9F_FUN = D_DATA;
452 3 delay();
453 3 while(!(K9F_FUN & RB)); //等待操作的完成
454 3 }
455 2 nBeginPage=0; //起始扇区值赋为0
456 2 }
457 1
458 1 while(length>0) //传输的扇区数大于0
459 1 {
460 2 K9F_FUN = COMMAND; //数据写入到缓冲区的对应位置
461 2 *((unsigned char xdata *)K9F5608) = 0x80;
462 2 K9F_FUN = ADDRESS;
463 2 *((unsigned char xdata *)K9F5608) = 0; //A0-A7
464 2 *((unsigned char xdata *)K9F5608) = (PG.addr[3]&0x3f)|BuffBlock; //A9-A16
465 2 *((unsigned char xdata *)K9F5608) = 0xff; //A17-A24
466 2 K9F_FUN = D_DATA;
467 2 for(i=0;i<8;i++) //端点数据写入到Flash的缓冲区
468 2 {
469 3 while (!(UEPINT & 0x04)); //等待接收数据RXOUTB1
470 3 //写64字节
471 3 WriteFlash();
472 3 UEPSTAX &= 0xB9; //准备再接收
473 3 UEPINT = 0;
474 3 }
475 2 K9F_FUN = COMMAND;
476 2 *((unsigned char xdata *)K9F5608) = 0x10;
477 2 K9F_FUN = D_DATA;
478 2 length--; //传输的扇区数减1
479 2 delay();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -