📄 d12.lst
字号:
241 0x50,
242 0,
243 },
244 {
245 {0x07,0x05,0x82,0x02,0x4000,0},
246 {0x07,0x05,0x02,0x02,0x4000,0}
247 }
248 };
249
250
251
252
253
254
255 //D12底层硬件接口函数
256 void Write_Com(uchar idata A) //写命令到D12
257 {D12_A0=1;D12_Data=A;D12_WR=0;D12_WR=1;}
258
259 void Write_Data(uchar idata B) //写数据到D12
260 {D12_A0=0;D12_Data=B;D12_WR=0;D12_WR=1;}
261
262 uchar Read_Data() //从D12读数据
263 {uchar idata C;D12_A0=0;D12_RD=0;C=D12_Data;D12_RD=1;return C;}
264 //D12底层硬件接口函数
265
266 void Enable_Enp()
267 {
268 1 Write_Com(enable_enp);
269 1 Write_Data(0x01);
270 1 }
271 void Set_Address(uchar idata add)
272 {
273 1 Write_Com(set_address);
274 1 Write_Data(add|0x80);
275 1 Enable_Enp();
276 1 }
277 void Set_Mode(uchar idata A,uchar idata B)
278 {
279 1 Write_Com(set_mode);
280 1 Write_Data(A);
281 1 Write_Data(B);
282 1 }
283
284 void D12_Init()
285 {
286 1 TMOD=0X20;
287 1 TH1=TL1=0XF3;
288 1 SCON=0X50;
289 1 TR1=1;
290 1 TI=1;
291 1 //设定波特率
292 1 Set_Mode(0x0e,0x47);//断开D12连接
293 1 Set_Address(0x00);//设置默认地址,使能端点
294 1 Set_Mode(0x1e,0x47);//连接D12连接
295 1 printf("初始化D12完毕\n");
296 1 }
297
298 void Read_Interrupter_Register()
299 {
300 1 uchar temp;
301 1 Write_Com(read_interrupter_register);
302 1 temp=Read_Data();
C51 COMPILER V7.06 D12 11/12/2008 23:04:10 PAGE 6
303 1 Interrupter_register=temp;
304 1 Interrupter_register=Interrupter_register<<8;
305 1 temp=Read_Data();
306 1 Interrupter_register=Interrupter_register|temp;
307 1 }
308
309
310 uchar Read_Enp_Last_Status(uchar idata enp)
311 {
312 1 Write_Com(enp+0x40);
313 1 return Read_Data();
314 1 }
315
316 uchar Select_Enp(uchar idata enp)
317 {
318 1 Write_Com(enp);
319 1 return Read_Data();
320 1 }
321
322 uchar Read_Enp_Status(uchar idata enp)
323 {
324 1 Write_Com(enp+0x80);
325 1 return Read_Data();
326 1 }
327
328 void Validate(uchar idata enp)
329 {
330 1 Select_Enp(enp);
331 1 Write_Com(0xfa);
332 1 }
333
334
335 uchar Read_Enp_Buffer(uchar idata enp,uchar idata len,uchar *pData)
336 {
337 1 uchar length,i;
338 1 while(!(Select_Enp(enp)&Enp_Full_Empty));//端点接满了数据
339 1 Write_Com(0xf0); //
340 1 Read_Data();
341 1 length=Read_Data();
342 1 if(length<len)
343 1 len=length;
344 1 //printf("输入");
345 1 for(i=0;i<len;i++)
346 1 {
347 2 *(pData+i)=Read_Data();
348 2 // printf("%x ",(uint16)*(pData+i));
349 2 }
350 1 //printf("\n");
351 1 return len;
352 1 }
353
354
355 void Write_Enp_Buffer(uchar idata enp,uchar idata len,uchar * pData)
356 {
357 1 uchar i;
358 1 Select_Enp(enp);
359 1 Write_Com(0xf0);
360 1 Write_Data(len);
361 1 Write_Data(len);
362 1 //printf("输出");
363 1 for(i=0;i<len;i++)
364 1 {
C51 COMPILER V7.06 D12 11/12/2008 23:04:10 PAGE 7
365 2 Write_Data(*(pData+i));
366 2 // printf("%x ",(uint16)*(pData+i));
367 2 }
368 1 //printf("\n");
369 1 Validate(enp);
370 1 }
371
372 void ACK(uchar idata enp)
373 {
374 1 Select_Enp(enp);
375 1 Write_Com(0xf1);
376 1 }
377
378 void Clean_Enp_Buffer(uchar idata enp)
379 {
380 1 Select_Enp(enp);
381 1 Write_Com(0xf2);
382 1 }
383
384
385
386
387 void Get_Device_Descriptor()
388 {
389 1 Device_Request_Buffer.pData=(uchar *)(&Device_Descriptor);
390 1 if(Device_Request_Buffer.wLength>sizeof(Device_Descriptor))
391 1 Device_Request_Buffer.wLength=sizeof(Device_Descriptor);
392 1 }
393
394 void Get_Construction_Descriptor()
395 {
396 1 Device_Request_Buffer.pData=(uchar *)(&Con_Inter_Endp_Descriptor);
397 1 if(Device_Request_Buffer.wLength>sizeof(Con_Inter_Endp_Descriptor))
398 1 Device_Request_Buffer.wLength=sizeof(Con_Inter_Endp_Descriptor);
399 1 }
400
401
402 void Set_D12_Address()
403 {
404 1 Set_Address(LSB(Device_Request_Buffer.Device_Request.wValue));
405 1 }
406
407 void Get_Max_Lun()
408 {
409 1 Device_Request_Buffer.wLength=1;
410 1 Device_Request_Buffer.pData=&Max_Lun;
411 1 }
412
413 void Fail()
414 {
415 1 csw.dCSWSignature=0x55534253;
416 1 csw.dCSWTag=cbw.dCBWTag;
417 1 csw.dCSWDataResidue=0;
418 1 csw.bCSWStatus=1;
419 1 Write_Enp_Buffer(5,sizeof(CSW),(uchar *)(&csw));
420 1 Soft_Flag.success=0;
421 1 Soft_Flag.Enp4=0;
422 1 Soft_Flag.Enp5=0;
423 1 Soft_Flag.Allow_Main_In=0;
424 1 Soft_Flag.Data=0;
425 1 }
426
C51 COMPILER V7.06 D12 11/12/2008 23:04:10 PAGE 8
427
428 void Success()
429 {
430 1 csw.dCSWSignature=0x55534253;
431 1 csw.dCSWTag=cbw.dCBWTag;
432 1 csw.dCSWDataResidue=0;
433 1 csw.bCSWStatus=0;
434 1 Write_Enp_Buffer(5,sizeof(CSW),(uchar *)(&csw));
435 1 Soft_Flag.success=0;
436 1 Soft_Flag.Enp4=0;
437 1 Soft_Flag.Enp5=0;
438 1 Soft_Flag.Allow_Main_In=0;
439 1 Soft_Flag.Data=0;
440 1 }
441
442
443 void Inquire1()
444 {
445 1 Write_Enp_Buffer(5,36,Inquire);
446 1 // wCount=36;
447 1 // printf("Inquire!\n");
448 1 }
449
450
451 void Read_Format_Cap()
452 {
453 1 Write_Enp_Buffer(5,20,Format_Cap);
454 1 // wCount=20;
455 1 // printf("Format_Cap\n");
456 1 }
457
458 void Request_Sense()
459 {
460 1 Write_Enp_Buffer(5,0x12,Sense);
461 1 }
462
463
464 void Read_Cap()
465 {
466 1 Write_Enp_Buffer(5,8,Cap);
467 1 // wCount=8;
468 1 // printf("Read Cap!\n");
469 1 }
470
471 void Read10()
472 {
473 1 if(cbw.cbwcb.LBA==0)
474 1 Device_Request_Buffer.pData=DBR;
475 1 Soft_Flag.Data=1;
476 1 }
477
478 //void Mode_Sence6()
479 //{
480
481 //}
482
483 void Enp0()
484 {
485 1 Device_Request_Buffer.wLength=0;
486 1 Device_Request_Buffer.wCount=0;
487 1 if(!(Read_Enp_Last_Status(0)&Setup_Pack))
488 1 {return;}//printf("PC return ACK!");
C51 COMPILER V7.06 D12 11/12/2008 23:04:10 PAGE 9
489 1 //接受到的是一个setup包
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -