久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6158|回復: 8
打印 上一主題 下一主題
收起左側

51單片機 Rc632射頻識別器件驅動源碼

[復制鏈接]
跳轉到指定樓層
樓主
51單片機,RC632射頻識別器件,可以實現對支持14443A/B、15693協議的IC卡進行非接觸讀寫操作-51 MCU,RC632 RFID IC,ISO14443A/B、ISO15693,READ&WRITE


全部下載:
CLRC632_RFID_CODE.rar (235.83 KB, 下載次數: 103)




主程序:
  1. #include <reg52.h>
  2. #include <string.h>
  3. #include <intrins.h>
  4. #include "main.h"
  5. #include "slrc632.h"
  6. #include "iso14443a.h"
  7. #include "iso14443b.h"
  8. #include "iso15693.h"

  9. //硬件版本號         
  10. unsigned char code hardmodel[12]  = {"SL601F-0512"};  

  11. bit g_bReceOk;                                              //正確接收到上位機指令標志
  12. bit g_bReceAA;                                              //接收到上位機發送的AA字節標志
  13. bit g_bRc632Ok;                                             //RC632復位正常標志


  14. unsigned int idata g_cReceNum;                              //接收到上位機的字節數
  15. unsigned int  data g_cCommand;                              //接收到的命令碼
  16. unsigned char data g_cSNR[4];                               //M1卡序列號
  17. unsigned char g_cIcdevH;                                    //設備標記
  18. unsigned char g_cIcdevL;                                    //設備標記
  19. unsigned char g_cFWI;                                       //
  20. unsigned char idata  g_cCidNad;                             //
  21. unsigned char idata g_cReceBuf[64];                         //和上位機通訊時的緩沖區

  22. struct TranSciveBuffer{unsigned char MfCommand;
  23.                        unsigned int  MfLength;
  24.                        unsigned char MfData[64];
  25.                       };
  26.                                           
  27.                                           

  28. void delay(unsigned int i)
  29. {
  30.    unsigned char j;
  31.    while(i--) for(j=0;j<200;j++);
  32. }

  33. void BEEP(unsigned char i)
  34. {
  35.     unsigned char k;
  36.         k=i*200;
  37.     sond =  0;
  38.         delay(k);
  39.         sond =1;
  40.    
  41. }

  42. void REDON(void)
  43. {
  44.     redled =  1;
  45. }

  46. void REDOFF(void)
  47. {
  48.     redled =  0;
  49. }
  50. void BLUEON(void)
  51. {
  52.     blueled =  1;
  53. }

  54. void BLUEOFF(void)
  55. {
  56.     blueled =  0;
  57. }


  58.                                           
  59. void main( )
  60. {   
  61.      
  62.      InitializeSystem( );
  63.      Rc632Ready( );
  64.      PcdConfigISOType( 'A' );
  65.      BEEP(1);
  66.          REDON();
  67.          BLUEOFF();
  68.      while ( 1 )
  69.      {   
  70.          if (g_bReceOk)
  71.          {
  72.    
  73.                  g_bReceOk = 0;  
  74.                  RC632_CE=0;   
  75.                  switch(g_cCommand)
  76.                  {
  77.                      case 0x0101:
  78.                         ComSetBound();               break;
  79.                      case 0x0104:
  80.                         ComGetHardModel();           break;
  81.                      case 0x0108:
  82.                         ComM632PcdConfigISOType();   break;  
  83.                      case 0x010C:
  84.                         ComPcdAntenna();             break;
  85.                                  
  86.                      case 0x0201:
  87.                         ComRequestA();               break;  
  88.                      case 0x0202:
  89.                         ComAnticoll();               break;        
  90.                      case 0x0203:
  91.                         ComSelect();                 break;
  92.                      case 0x0204:
  93.                         ComHlta();                   break;
  94.                      case 0x0207:
  95.                         ComAuthentication();         break;
  96.                      case 0x0208:
  97.                         ComM1Read();                 break;
  98.                      case 0x0209:
  99.                         ComM1Write();                break;
  100.                      case 0x020A:
  101.                         ComM1Initval();              break;
  102.                      case 0x020B:
  103.                         ComM1Readval();              break;
  104.                      case 0x020C:
  105.                         ComM1Decrement();            break;
  106.                      case 0x020D:
  107.                         ComM1Increment();            break;  
  108.                      case 0x020E:
  109.                         ComM1Restore();              break;
  110.                      case 0x020F:
  111.                         ComM1Transfer();             break;
  112.                      case 0x0212:
  113.                         ComUL_PcdAnticoll();         break;      
  114.                      case 0x0213:
  115.                         ComUL_PcdWrite();            break;  

  116.                      case 0x0301:
  117.                         ComTypeBRst();               break;  
  118.                   // case 0x1E:
  119.                   //      ComAttrib();    break;
  120.                      case 0x0302:
  121.                         ComHltb();                   break;
  122.                      case 0x0303:
  123.                         ComCL_Deselect();            break;   

  124.                      case 0x0401:
  125.                         ComRF020Check();             break;
  126.                      case 0x0402:
  127.                         ComRF020Read();              break;
  128.                      case 0x0403:
  129.                         ComRF020Write();             break;
  130.                      case 0x0404:
  131.                         ComRF020Lock();              break;
  132.                      case 0x0405:        
  133.                         ComRF020Count();             break;
  134.                      case 0x0406:        
  135.                         ComRF020Deselect();          break;

  136.                      case 0x0501:
  137.                         ComSelectSR();               break;
  138.                      case 0x0502:
  139.                         ComCompletionSR();           break;
  140.                      case 0x0503:
  141.                         ComReadSR176();              break;  
  142.                      case 0x0504:
  143.                         ComWriteSR176();             break;   
  144.                      case 0x0505:
  145.                         ComProtectSR176();           break;  
  146.                      case 0x0506:
  147.                         ComReadSR4K();               break;  
  148.                      case 0x0507:
  149.                         ComWriteSR4K();              break;      
  150.                      case 0x0508:
  151.                         ComAuthSR4K();               break;  
  152.                      case 0x0509:
  153.                         ComGetUIDSR4K();             break;
  154.                      case 0x050A:
  155.                         ComProtectSR4K();            break;
  156.                                     
  157.                
  158.                      case 0x1000:
  159.                         ComISO15693_Inventory16();   break;
  160.                      case 0x1001:
  161.                         ComISO15693_Inventory();     break;
  162.                      case 0x1002:
  163.                         ComISO15693_Stay_Quiet();    break;
  164.                      case 0x1003:
  165.                         ComISO15693_Select();        break;
  166.                      case 0x1004:
  167.                         ComISO15693_Reset_To_Ready();break;
  168.                      case 0x1005:
  169.                         ComISO15693_Read_sm();       break;
  170.                      case 0x1006:
  171.                         ComISO15693_Write_sm();      break;
  172.                      case 0x1007:
  173.                         ComISO15693_Lock_Block();    break;
  174.                      case 0x1008:
  175.                         ComISO15693_Write_AFI();     break;
  176.                      case 0x1009:
  177.                         ComISO15693_Lock_AFI();      break;
  178.                      case 0x100A:
  179.                         ComISO15693_Write_DSFID();   break;
  180.                      case 0x100B:
  181.                         ComISO15693_Lock_DSFID();    break;
  182.                      case 0x100C:
  183.                         ComISO15693_Get_System_Information();     break;
  184.                      case 0x100D:
  185.                         ComISO15693_Get_Multiple_Block_Security();break;  

  186.                      default:
  187.                         AnswerErr( FAULT11 );         break;
  188.                  }
  189.                      REDOFF();
  190.                       BLUEON();
  191.              sond =  1;
  192.                      REDON();
  193.                      BLUEOFF();
  194.              RC632_CE=1;
  195.              ES = 1;
  196.                          EA=1;
  197.           }
  198.      }
  199. }



  200. /////////////////////////////////////////////////////////////////////
  201. //系統初始化
  202. /////////////////////////////////////////////////////////////////////

  203. void InitializeSystem()
  204. {
  205.     TMOD &= 0x0F;
  206.     TMOD |= 0x21;
  207.     PCON |= 0x80;
  208.     SCON  = 0x50;
  209.     TH1 = TL1 = BOUND19200;
  210.     TR1=1;
  211.     P0 = P1 = P2 = P3 = 0xFF;
  212.     IE |= 0x90;
  213. }


  214. /////////////////////////////////////////////////////////////////////
  215. //初始化RC632
  216. /////////////////////////////////////////////////////////////////////
  217. void Rc632Ready()
  218. {
  219.     char status;
  220.     delay(100);
  221.     status = PcdReset();
  222.     if(status != MI_OK)
  223.     {
  224.         delay(10);
  225.         status = PcdReset();
  226.     }
  227.     if(status != MI_OK)
  228.     {
  229.         delay(10);
  230.         status = PcdReset();
  231.     }
  232.     if(status == MI_OK)
  233.     {
  234.         g_bRc632Ok = 1;
  235.     }      
  236. }
  237.         
  238. /////////////////////////////////////////////////////////////////////
  239. //響應上位機發送的設置波特率命令
  240. /////////////////////////////////////////////////////////////////////
  241. void ComSetBound()
  242. {
  243.     unsigned char bound = g_cReceBuf[6];
  244.     if (bound > 7)
  245.     {   AnswerErr(FAULT12);    }
  246.     else
  247.     {
  248.             AnswerCommandOk();
  249.             TR1 = 0;
  250.          
  251.             switch(bound)
  252.         {
  253.                  case 0:
  254.                       TH1=TL1=BOUND4800;
  255.                       break;
  256.                  case 1:
  257.                       TH1=TL1=BOUND9600;
  258.                       break;
  259.                  case 2:
  260.                       TH1=TL1=BOUND14400;
  261.                       break;
  262.                  case 3:
  263.                       TH1=TL1=BOUND19200;
  264.                       break;
  265.                  case 4:
  266.                       TH1=TL1=BOUND28800;
  267.                       break;
  268.                  case 5:
  269.                       TH1=TL1=BOUND38400;
  270.                       break;
  271.                  case 6:
  272.                       TH1=TL1=BOUND57600;
  273.                       break;
  274.                  case 7:
  275.                       TH1=TL1=BOUND115200;
  276.                       break;
  277.                  default:
  278.                       break;
  279.         }
  280.             TR1 = 1;
  281.      }           
  282. }


  283. /////////////////////////////////////////////////////////////////////
  284. //響應上位機發送的讀取硬件版本號命令
  285. /////////////////////////////////////////////////////////////////////
  286. void ComGetHardModel()
  287. {
  288.     memcpy(&g_cReceBuf[0], &hardmodel[0], sizeof(hardmodel));
  289.     AnswerOk(&g_cReceBuf[0], sizeof(hardmodel));
  290. }   

  291.    
  292. /////////////////////////////////////////////////////////////////////
  293. //響應上位機發送的設置RC632協議命令,ISO14443A/B或ISO15693
  294. /////////////////////////////////////////////////////////////////////
  295. void ComM632PcdConfigISOType()
  296. {
  297.      if (MI_OK == PcdConfigISOType(g_cReceBuf[6]))
  298.      {    AnswerCommandOk();    }
  299.      else
  300.      {    AnswerErr(-1);   }  
  301. }
  302.    
  303. /////////////////////////////////////////////////////////////////////
  304. //響應上位機發送的天線命令
  305. /////////////////////////////////////////////////////////////////////
  306. void ComPcdAntenna()
  307. {
  308.     char status;
  309.     if (!g_cReceBuf[6])
  310.     {   status = PcdAntennaOff();   }
  311.     else
  312.     {  
  313.         DelayMs(10);
  314.         status = PcdAntennaOn();
  315.         DelayMs(10);
  316.     }
  317.     if (status == MI_OK)
  318.     {   AnswerCommandOk();    }
  319.     else
  320.     {   AnswerErr(FAULT10);   }
  321. }   

  322. /////////////////////////////////////////////////////////////////////
  323. //響應上位機發送的尋A卡命令
  324. /////////////////////////////////////////////////////////////////////
  325. void ComRequestA()
  326. {
  327.     unsigned char atq[2];
  328.         char status;
  329.         status = PcdRequest(g_cReceBuf[6], atq);
  330.         if (status != MI_OK)
  331.         {    status = PcdRequest(g_cReceBuf[6], atq);   }
  332.     if (status == MI_OK)
  333.     {    AnswerOk(atq,2);     }
  334.     else
  335.     {    AnswerErr(FAULT20);   }            
  336. }

  337. /////////////////////////////////////////////////////////////////////
  338. //響應上位機發送的A卡防沖撞命令
  339. /////////////////////////////////////////////////////////////////////
  340. void ComAnticoll()
  341. {
  342.     if (MI_OK == PcdAnticoll(&g_cSNR))
  343.     {    AnswerOk(&g_cSNR,4);  }
  344.     else
  345.     {    AnswerErr(FAULT10);   }            
  346. }

  347. /////////////////////////////////////////////////////////////////////
  348. //響應上位機發送的A卡鎖定命令
  349. /////////////////////////////////////////////////////////////////////
  350. void ComSelect()
  351. {
  352.     if (MI_OK == PcdSelect(&g_cReceBuf[6], &g_cReceBuf[0]))
  353.     {    AnswerOk(&g_cReceBuf[0], 1);      }
  354.     else
  355.     {    AnswerErr(FAULT10);   }            
  356. }

  357. /////////////////////////////////////////////////////////////////////
  358. //響應上位機發送的A卡休眠命令
  359. /////////////////////////////////////////////////////////////////////
  360. void ComHlta()
  361. {
  362.     if (MI_OK == PcdHalt())
  363.     {    AnswerCommandOk();    }
  364.     else
  365.     {    AnswerErr(FAULT10);   }            
  366. }

  367. /////////////////////////////////////////////////////////////////////
  368. //響應上位機發送的A卡驗證密鑰命令
  369. /////////////////////////////////////////////////////////////////////
  370. void ComAuthentication()
  371. {        
  372.     char status = MI_COM_ERR;
  373.     unsigned char *pkeys,*pSNR;
  374.     pkeys = &g_cReceBuf[20];
  375.     pSNR  = &g_cSNR;
  376.     if (MI_OK == ChangeCodeKey(&g_cReceBuf[8],pkeys))                       //轉換密鑰格式
  377.     {   
  378.             if (MI_OK == PcdAuthKey(pkeys))                                     //傳送密鑰到RC500FIFO
  379.         {
  380.              status = PcdAuthState(g_cReceBuf[6], g_cReceBuf[7], pSNR);     //驗證密鑰
  381.         }
  382.     }
  383.     if (status == MI_OK)
  384.     {    AnswerCommandOk();    }
  385.     else
  386.     {    AnswerErr(FAULT22);   }
  387. }   

  388. /////////////////////////////////////////////////////////////////////
  389. //響應上位機讀M1卡命令
  390. /////////////////////////////////////////////////////////////////////
  391. void ComM1Read()
  392. {
  393.     if (MI_OK == PcdRead(g_cReceBuf[6], &g_cReceBuf[0]))
  394.     {         AnswerOk(&g_cReceBuf[0], 16);  }
  395.     else
  396.     {    AnswerErr(FAULT23);            }
  397. }

  398. /////////////////////////////////////////////////////////////////////
  399. //響應上位機寫M1卡命令
  400. /////////////////////////////////////////////////////////////////////
  401. void ComM1Write()
  402. {
  403.     if (MI_OK == PcdWrite(g_cReceBuf[6], &g_cReceBuf[7]))
  404.     {    AnswerCommandOk();    }
  405.     else
  406.     {    AnswerErr(FAULT24);   }
  407. }

  408. /////////////////////////////////////////////////////////////////////
  409. //響應上位機初始化錢包命令
  410. /////////////////////////////////////////////////////////////////////
  411. void ComM1Initval()
  412. {
  413.     g_cReceBuf[11]=~g_cReceBuf[7];g_cReceBuf[12]=~g_cReceBuf[8];
  414.     g_cReceBuf[13]=~g_cReceBuf[9];g_cReceBuf[14]=~g_cReceBuf[10];
  415.     g_cReceBuf[15]=g_cReceBuf[7];g_cReceBuf[16]=g_cReceBuf[8];
  416.     g_cReceBuf[17]=g_cReceBuf[9];g_cReceBuf[18]=g_cReceBuf[10];
  417.     g_cReceBuf[19]=g_cReceBuf[6];g_cReceBuf[20]=~g_cReceBuf[6];
  418.     g_cReceBuf[21]=g_cReceBuf[6];g_cReceBuf[22]=~g_cReceBuf[6];
  419.     if (MI_OK == PcdWrite(g_cReceBuf[6], &g_cReceBuf[7]))
  420.     {    AnswerCommandOk();    }
  421.     else
  422.     {    AnswerErr(FAULT24);   }
  423. }

  424. /////////////////////////////////////////////////////////////////////
  425. //響應上位機讀錢包命令
  426. /////////////////////////////////////////////////////////////////////
  427. void ComM1Readval()
  428. {
  429.     if (MI_OK == PcdRead(g_cReceBuf[6], &g_cReceBuf[0]))
  430.     {         AnswerOk(&g_cReceBuf[0], 4);   }
  431.     else
  432.     {    AnswerErr(FAULT23);         }
  433. }

  434. /////////////////////////////////////////////////////////////////////
  435. //響應上位機扣款命令
  436. /////////////////////////////////////////////////////////////////////
  437. void ComM1Decrement()
  438. {
  439.     if (MI_OK == PcdValue(PICC_DECREMENT, g_cReceBuf[6], &g_cReceBuf[7]))
  440.     {    AnswerCommandOk();    }
  441.     else
  442.     {    AnswerErr(FAULT24);   }
  443. }
  444.    
  445. /////////////////////////////////////////////////////////////////////
  446. //響應上位機充值命令
  447. /////////////////////////////////////////////////////////////////////
  448. void ComM1Increment()
  449. {
  450.     if (MI_OK == PcdValue(PICC_INCREMENT, g_cReceBuf[6], &g_cReceBuf[7]))
  451.     {    AnswerCommandOk();    }
  452.     else
  453.     {    AnswerErr(FAULT24);   }
  454. }

  455. /////////////////////////////////////////////////////////////////////
  456. //響應上位機M1卡回傳命令
  457. /////////////////////////////////////////////////////////////////////
  458. void ComM1Restore()
  459. {
  460.     if (MI_OK == PcdRestore(g_cReceBuf[6]))
  461.     {    AnswerCommandOk();    }
  462.     else
  463.     {    AnswerErr(FAULT23);   }
  464. }

  465. /////////////////////////////////////////////////////////////////////
  466. //響應上位機M1卡值傳送命令
  467. /////////////////////////////////////////////////////////////////////
  468. void ComM1Transfer()
  469. {
  470.     if (MI_OK == PcdTransfer(g_cReceBuf[6]))
  471.     {    AnswerCommandOk();    }
  472.     else
  473.     {    AnswerErr(FAULT24);   }
  474. }

  475. /////////////////////////////////////////////////////////////////////
  476. //響應上位機ultra light防沖撞命令
  477. /////////////////////////////////////////////////////////////////////
  478. void ComUL_PcdAnticoll()
  479. {
  480.     if (MI_OK == UL_PcdAnticoll(&g_cReceBuf[0]))
  481.     {   AnswerOk(&g_cReceBuf[0], 7);  }
  482.     else
  483.     {   AnswerErr(FAULT10);    }   
  484. }

  485. /////////////////////////////////////////////////////////////////////
  486. //響應上位機ultra light寫卡命令
  487. /////////////////////////////////////////////////////////////////////
  488. void ComUL_PcdWrite()
  489. {
  490.     if (MI_OK == UL_PcdWrite(g_cReceBuf[6], &g_cReceBuf[7]))
  491.     {   AnswerCommandOk();   }
  492.     else
  493.     {   AnswerErr(FAULT24);  }   
  494. }




  495. /////////////////////////////////////////////////////////////////////
  496. //響應上位機高級復位TYPEB卡命令
  497. /////////////////////////////////////////////////////////////////////
  498. void ComTypeBRst()
  499. {
  500.     unsigned char status;
  501.         
  502.     if ((status = M531PiccRequestB(g_cReceBuf[6], 0, 0, &g_cReceBuf[0])) == MI_OK)
  503.     {        
  504.             g_cFWI    = 0xFF;//g_cReceBuf[11] >> 4;
  505.             g_cCidNad = 8;//((g_cReceBuf[11]&0x02)<<1) | ((g_cReceBuf[11]&0x01)<<3);
  506. //       status = M531PiccAttrib(&g_cReceBuf[1], g_cReceBuf[10]&0x0F, &g_cReceBuf[12]);   
  507.   //  }

  508. //   if (status == MI_OK)                {
  509.        AnswerOk(&g_cReceBuf[0], 12);   }
  510.     else
  511.     {   AnswerErr(FAULT21);    }
  512. }                    
  513.                     

  514. /////////////////////////////////////////////////////////////////////
  515. //響應上位機HLTB3命令
  516. /////////////////////////////////////////////////////////////////////
  517. void ComHltb()
  518. {
  519.     if (MI_OK == M531PiccHltb(&g_cReceBuf[6]))
  520.     {    AnswerCommandOk();    }
  521.     else
  522.     {    AnswerErr(FAULT10);   }
  523.         M531PiccAttrib(&g_cReceBuf[1], g_cReceBuf[10]&0x0F, &g_cReceBuf[12]);
  524. }

  525. /////////////////////////////////////////////////////////////////////
  526. //響應上位機HLTB4命令
  527. /////////////////////////////////////////////////////////////////////
  528. void ComCL_Deselect()
  529. {
  530.     if (MI_OK == CL_Deselect(0))
  531.     {    AnswerCommandOk();    }
  532.     else
  533.     {    AnswerErr(FAULT10);   }
  534. }

  535. /////////////////////////////////////////////////////////////////////
  536. //響應上位機AT88RF020卡驗證密鑰命令
  537. /////////////////////////////////////////////////////////////////////
  538. void ComRF020Check()        
  539. {
  540.     if (MI_OK == At88rf020Check(&g_cReceBuf[6]))
  541.     {    AnswerCommandOk();    }
  542.     else
  543.     {    AnswerErr(FAULT22);   }
  544. }

  545. /////////////////////////////////////////////////////////////////////
  546. //響應上位機AT88RF020卡讀命令
  547. /////////////////////////////////////////////////////////////////////
  548. void ComRF020Read()        
  549. {
  550.     if (MI_OK == At88rf020Read(g_cReceBuf[6], &g_cReceBuf[0]))
  551.     {    AnswerOk(&g_cReceBuf[0],8);   }
  552.     else
  553.     {    AnswerErr(FAULT23);         }
  554. }

  555. /////////////////////////////////////////////////////////////////////
  556. //響應上位機AT88RF020卡寫命令
  557. /////////////////////////////////////////////////////////////////////
  558. void ComRF020Write()        
  559. {
  560.     if (MI_OK == At88rf020Write(g_cReceBuf[6], &g_cReceBuf[7]))
  561.     {    AnswerCommandOk();    }
  562.     else
  563.     {    AnswerErr(FAULT24);   }
  564. }

  565. /////////////////////////////////////////////////////////////////////
  566. //響應上位機AT88RF020卡LOCK命令
  567. /////////////////////////////////////////////////////////////////////
  568. void ComRF020Lock()        
  569. {
  570.     if (MI_OK == At88rf020Lock(&g_cReceBuf[6]))
  571.     {    AnswerCommandOk();    }
  572.     else
  573.     {    AnswerErr(FAULT24);   }
  574. }

  575. /////////////////////////////////////////////////////////////////////
  576. //響應上位機AT88RF020卡COUNT命令
  577. /////////////////////////////////////////////////////////////////////
  578. void ComRF020Count()        
  579. {
  580.     if (MI_OK == At88rf020Count(&g_cReceBuf[6]))
  581.     {    AnswerCommandOk();    }
  582.     else
  583.     {    AnswerErr(FAULT24);   }
  584. }

  585. /////////////////////////////////////////////////////////////////////
  586. //響應上位機AT88RF020卡DESELECT命令
  587. /////////////////////////////////////////////////////////////////////
  588. void ComRF020Deselect()        
  589. {
  590.     if (MI_OK == At88rf020Deselect())
  591.     {    AnswerCommandOk();    }
  592.     else
  593.     {    AnswerErr(FAULT10);   }
  594. }


  595. /////////////////////////////////////////////////////////////////////
  596. //響應上位機激活ST卡片命令
  597. /////////////////////////////////////////////////////////////////////
  598. void ComSelectSR()
  599. {
  600.     if(MI_OK == SelectSR(&g_cReceBuf[0]))
  601.     {    AnswerOk(&g_cReceBuf[0],1);   }
  602.     else
  603.     {    AnswerErr(FAULT20);    }   
  604. }

  605. /////////////////////////////////////////////////////////////////////
  606. //響應上位機SR176讀塊命令
  607. /////////////////////////////////////////////////////////////////////
  608. void ComReadSR176()
  609. {
  610.     if (MI_OK == ReadSR176(g_cReceBuf[6], &g_cReceBuf[0]))
  611.     {    AnswerOk(&g_cReceBuf[0],2);   }
  612.     else
  613.     {    AnswerErr(FAULT23);    }   
  614. }

  615. /////////////////////////////////////////////////////////////////////
  616. //響應上位機SR176寫塊命令
  617. /////////////////////////////////////////////////////////////////////
  618. void ComWriteSR176()
  619. {
  620.     char status;
  621.     if((status = WriteSR176(g_cReceBuf[6], &g_cReceBuf[7])) == MI_OK)
  622.     {
  623.         DelayMs(5);
  624.         status = ReadSR176(g_cReceBuf[6], &g_cReceBuf[0]);
  625.         if((status==MI_OK) && (g_cReceBuf[0]==g_cReceBuf[7]) && (g_cReceBuf[1]==g_cReceBuf[8]))
  626.         {   AnswerCommandOk();   }
  627.         else
  628.         {   AnswerErr(FAULT24);  }
  629.     }
  630.     else
  631.     {    AnswerErr(FAULT24);    }   
  632. }

  633. /////////////////////////////////////////////////////////////////////
  634. //響應上位機SR176塊鎖定命令
  635. /////////////////////////////////////////////////////////////////////
  636. void ComProtectSR176()
  637. {
  638.     char status;
  639.     if ((status = GetProtSR176(g_cReceBuf[0])) == MI_OK)
  640.     {
  641.         status = ProtectSR176(g_cReceBuf[6]);
  642.         if (status == MI_OK)
  643.         {
  644.              DelayMs(5);
  645.              status = GetProtSR176(g_cReceBuf[1]);
  646.              if ((g_cReceBuf[0]|g_cReceBuf[6]) != g_cReceBuf[1])
  647.                  {    status = MI_COM_ERR;   }
  648.         }
  649.     }   
  650.     if (status == MI_OK)
  651.     {   AnswerCommandOk();   }
  652.     else
  653.     {   AnswerErr(FAULT24);  }
  654. }

  655. /////////////////////////////////////////////////////////////////////
  656. //響應上位機SR176卡COMPLETION命令
  657. /////////////////////////////////////////////////////////////////////
  658. void ComCompletionSR()
  659. {
  660.     if (MI_OK == CompletionSR())
  661.     {    AnswerCommandOk();   }
  662.     else
  663.     {    AnswerErr(FAULT10);  }   
  664. }

  665. /////////////////////////////////////////////////////////////////////
  666. //響應上位機SRIX4K讀塊命令
  667. /////////////////////////////////////////////////////////////////////
  668. void ComReadSR4K()
  669. {
  670.     if (MI_OK == ReadSR4K(g_cReceBuf[6], &g_cReceBuf[0]))
  671.     {    AnswerOk(&g_cReceBuf[0],4);    }
  672.     else
  673.     {    AnswerErr(FAULT23);    }   
  674. }

  675. /////////////////////////////////////////////////////////////////////
  676. //響應上位機SRIX4K寫塊命令
  677. /////////////////////////////////////////////////////////////////////
  678. void ComWriteSR4K()
  679. {
  680.     char status;
  681.     if ((status = WriteSR4K(g_cReceBuf[6], &g_cReceBuf[7])) == MI_OK)
  682.     {
  683.         DelayMs(7);
  684.         status = ReadSR4K(g_cReceBuf[6], &g_cReceBuf[0]);
  685.         if ((status==MI_OK) && (g_cReceBuf[0]==g_cReceBuf[7]) && (g_cReceBuf[1]==g_cReceBuf[8])
  686.             && (g_cReceBuf[2]==g_cReceBuf[9]) && (g_cReceBuf[3]==g_cReceBuf[10]))
  687.         {   AnswerCommandOk();   }
  688.         else
  689.         {   AnswerErr(FAULT24);  }
  690.     }
  691.     else
  692.     {   AnswerErr(FAULT24);    }   
  693. }

  694. /////////////////////////////////////////////////////////////////////
  695. //響應上位機SRIX4K卡AUTHENTICATE命令
  696. /////////////////////////////////////////////////////////////////////
  697. void ComAuthSR4K()
  698. {
  699.     if (MI_OK == AuthSR4K(&g_cReceBuf[6], &g_cReceBuf[0]))
  700.     {   AnswerOk(&g_cReceBuf[0], 3);  }
  701.     else
  702.     {   AnswerErr(FAULT22);    }   
  703. }

  704. /////////////////////////////////////////////////////////////////////
  705. //響應上位機SRIX4K讀UID命令
  706. /////////////////////////////////////////////////////////////////////
  707. void ComGetUIDSR4K()
  708. {
  709.     if (MI_OK == GetUIDSR4K(&g_cReceBuf[0]))
  710.     {   AnswerOk(&g_cReceBuf[0], 8);  }
  711.     else
  712.     {   AnswerErr(FAULT23);    }   
  713. }

  714. /////////////////////////////////////////////////////////////////////
  715. //響應上位機SRIX4K塊鎖定命令
  716. /////////////////////////////////////////////////////////////////////
  717. void ComProtectSR4K()
  718. {
  719.     char status;
  720.     if ((status = ReadSR4K(0xFF, &g_cReceBuf[0])) == MI_OK)
  721.     {
  722.         status = WriteSR4K(0xFF, &g_cReceBuf[6]);
  723.         if (status == MI_OK)
  724.         {
  725.              DelayMs(7);
  726.              status = ReadSR4K(0xFF, &g_cReceBuf[1]);
  727.              if ((g_cReceBuf[0]&g_cReceBuf[6]) != g_cReceBuf[1])
  728.                  {    status = MI_COM_ERR;   }
  729.         }
  730.     }   
  731.     if (status == MI_OK )
  732.     {   AnswerCommandOk();   }
  733.     else
  734.     {   AnswerErr(FAULT24);  }
  735. }


  736. /////////////////////////////////////////////////////////////////////
  737. //響應上位機ISO15693_Inventory命令
  738. /////////////////////////////////////////////////////////////////////
  739. void ComISO15693_Inventory16()
  740. {
  741.      if (MI_OK == ISO15693_Inventory16(0x16,0x00,0x00,&g_cReceBuf[0],&g_cReceBuf[0], &g_cReceBuf[1]))
  742.      {   AnswerOk(&g_cReceBuf[1], g_cReceBuf[0]);  }
  743.      else
  744.      {   AnswerErr( FAULT20 );   }
  745. }

  746. /////////////////////////////////////////////////////////////////////
  747. //響應上位機ISO15693_Inventory命令
  748. /////////////////////////////////////////////////////////////////////
  749. void ComISO15693_Inventory()
  750. {
  751.      if (MI_OK == ISO15693_Inventory(0x36,0x00,0x00,&g_cReceBuf[0],&g_cReceBuf[0]))
  752.      {   AnswerOk(&g_cReceBuf[0], 9);  }
  753.      else
  754.      {   AnswerErr( FAULT20 );   }
  755. }
  756.      
  757. /////////////////////////////////////////////////////////////////////
  758. //響應上位機ISO15693_Stay_Quiet命令
  759. /////////////////////////////////////////////////////////////////////
  760. void ComISO15693_Stay_Quiet()
  761. {
  762.      if (MI_OK == ISO15693_Stay_Quiet(0x22, &g_cReceBuf[6]))
  763.      {   AnswerCommandOk();   }
  764.      else
  765.      {   AnswerErr(FAULT10);  }
  766. }

  767. /////////////////////////////////////////////////////////////////////
  768. //響應上位機ISO15693_Select命令
  769. /////////////////////////////////////////////////////////////////////     
  770. void ComISO15693_Select()
  771. {
  772.      if (MI_OK == ISO15693_Select(0x22, &g_cReceBuf[6]))
  773.      {   AnswerCommandOk();   }
  774.      else
  775.      {   AnswerErr(FAULT10);  }
  776. }

  777. /////////////////////////////////////////////////////////////////////
  778. //響應上位機ISO15693_Reset_To_Ready命令
  779. /////////////////////////////////////////////////////////////////////     
  780. void ComISO15693_Reset_To_Ready()
  781. {
  782.      unsigned char flags = 0x02;
  783.      flags |= g_cReceBuf[6] << 4;
  784.      if (MI_OK == ISO15693_Reset_To_Ready(flags, &g_cReceBuf[7]) )
  785.      {   AnswerCommandOk();   }
  786.      else
  787.      {   AnswerErr(FAULT10);  }
  788. }

  789. /////////////////////////////////////////////////////////////////////
  790. //響應上位機ISO15693_Read命令
  791. /////////////////////////////////////////////////////////////////////     
  792. void ComISO15693_Read_sm()
  793. {
  794.      unsigned char flags = 0x02;
  795.      flags |= g_cReceBuf[6] << 4;
  796.      if (MI_OK == ISO15693_Read_sm(flags,&g_cReceBuf[7],g_cReceBuf[15],g_cReceBuf[16],&g_cReceBuf[0],&g_cReceBuf[1]))
  797.      {   AnswerOk(&g_cReceBuf[1],g_cReceBuf[0]);  }
  798.      else
  799.      {   AnswerErr(FAULT23);    }
  800. }

  801. /////////////////////////////////////////////////////////////////////
  802. //響應上位機ISO15693_Write命令
  803. /////////////////////////////////////////////////////////////////////     
  804. void ComISO15693_Write_sm()
  805. {
  806.      unsigned char flags = 0x02;
  807.      flags |= g_cReceBuf[6] << 4;
  808.      if (MI_OK == ISO15693_Write_sm(flags, &g_cReceBuf[7], g_cReceBuf[15], &g_cReceBuf[16]) )
  809.      {   AnswerCommandOk();   }
  810.      else
  811.      {   AnswerErr(FAULT24);  }
  812. }

  813. /////////////////////////////////////////////////////////////////////
  814. //響應上位機ISO15693_Lock_Block命令
  815. /////////////////////////////////////////////////////////////////////     
  816. void ComISO15693_Lock_Block()
  817. {
  818.      unsigned char flags = 0x02;
  819.      flags |= g_cReceBuf[6] << 4;
  820.      if (MI_OK == ISO15693_Lock_Block(flags, &g_cReceBuf[7], g_cReceBuf[15]))
  821.      {   AnswerCommandOk();   }
  822.      else
  823.      {   AnswerErr(FAULT24);  }
  824. }

  825. /////////////////////////////////////////////////////////////////////
  826. //響應上位機ISO15693_Write_AFI命令
  827. /////////////////////////////////////////////////////////////////////     
  828. void ComISO15693_Write_AFI()
  829. {
  830.      unsigned char flags = 0x02;
  831.      flags |= g_cReceBuf[6] << 4;
  832.      if (MI_OK == ISO15693_Write_AFI(flags, &g_cReceBuf[7], g_cReceBuf[15]))
  833.      {   AnswerCommandOk();   }
  834.      else
  835.      {   AnswerErr(FAULT24);  }
  836. }

  837. /////////////////////////////////////////////////////////////////////
  838. //響應上位機ISO15693_Lock_AFI命令
  839. /////////////////////////////////////////////////////////////////////     
  840. void ComISO15693_Lock_AFI()
  841. {
  842.      unsigned char flags = 0x02;
  843.      flags |= g_cReceBuf[6] << 4;
  844.      if (MI_OK == ISO15693_Lock_AFI(flags, &g_cReceBuf[7]) )
  845.      {   AnswerCommandOk();   }
  846.      else
  847.      {   AnswerErr(FAULT24);  }
  848. }

  849. /////////////////////////////////////////////////////////////////////
  850. //響應上位機ISO15693_Write_DSFID命令
  851. /////////////////////////////////////////////////////////////////////     
  852. void ComISO15693_Write_DSFID()
  853. {
  854.      unsigned char flags = 0x02;
  855.      flags |= g_cReceBuf[6] << 4;
  856.      if (MI_OK == ISO15693_Write_DSFID(flags, &g_cReceBuf[7], g_cReceBuf[15]) )
  857.      {   AnswerCommandOk();   }
  858.      else
  859.      {   AnswerErr(FAULT24);  }
  860. }

  861. /////////////////////////////////////////////////////////////////////
  862. //響應上位機ISO15693_Lock_DSFID命令
  863. /////////////////////////////////////////////////////////////////////     
  864. void ComISO15693_Lock_DSFID()
  865. {
  866.      unsigned char flags = 0x02;
  867.      flags |= g_cReceBuf[6] << 4;
  868.      if (MI_OK == ISO15693_Lock_DSFID(flags, &g_cReceBuf[7]))
  869.      {   AnswerCommandOk();   }
  870.      else
  871.      {   AnswerErr(FAULT24);  }
  872. }

  873. /////////////////////////////////////////////////////////////////////
  874. //響應上位機ISO15693_Get_System_Information命令
  875. /////////////////////////////////////////////////////////////////////     
  876. void ComISO15693_Get_System_Information()
  877. {
  878.      unsigned char flags = 0x02;
  879.      flags |= g_cReceBuf[6] << 4;
  880.      if (MI_OK == ISO15693_Get_System_Information(flags, &g_cReceBuf[7], &g_cReceBuf[0], &g_cReceBuf[1]))
  881.      {   AnswerOk(&g_cReceBuf[1],g_cReceBuf[0]);  }
  882.      else
  883.      {   AnswerErr(FAULT23);   }
  884. }

  885. /////////////////////////////////////////////////////////////////////
  886. //響應上位機ISO15693_Get_Multiple_Block_Security命令
  887. /////////////////////////////////////////////////////////////////////     
  888. void ComISO15693_Get_Multiple_Block_Security()
  889. {
  890.      unsigned char flags = 0x02;
  891.      flags |= g_cReceBuf[6] << 4;
  892.      if (MI_OK == ISO15693_Get_Multiple_Block_Security(flags,&g_cReceBuf[7],g_cReceBuf[15],g_cReceBuf[16],&g_cReceBuf[0],&g_cReceBuf[1]))
  893.      {   AnswerOk(&g_cReceBuf[1],g_cReceBuf[0]);  }
  894.      else
  895.      {   AnswerErr(FAULT23);  }
  896. }

  897. /////////////////////////////////////////////////////////////////////
  898. //正確執行完上位機指令,應答(無返回數據)
  899. /////////////////////////////////////////////////////////////////////
  900. void AnswerCommandOk()
  901. {   
  902.      unsigned char i,chkdata;
  903.      chkdata = 0;
  904.      
  905.      TI   = 0;                         //發送命令頭         
  906.      SBUF = 0xAA;
  907.      while (!TI);           
  908.      TI   = 0;
  909.      SBUF = 0xBB;
  910.      while (!TI);
  911.      
  912.      TI   = 0;                         //發送長度字
  913.      SBUF = 0x06;
  914.      while (!TI);           
  915.      TI   = 0;
  916.      SBUF = 0x00;
  917.      while (!TI);           
  918.          
  919.      TI   = 0;                         //發送設備標識
  920.      SBUF = g_cIcdevH;
  921.      while (!TI);
  922.      if (g_cIcdevH == 0xAA)
  923.      {
  924.              TI   = 0;
  925.              SBUF = 0;
  926.              while (!TI);
  927.      }
  928.      TI   = 0;
  929.      SBUF = g_cIcdevL;
  930.      while (!TI);
  931.      if (g_cIcdevL == 0xAA)
  932.      {
  933.              TI   = 0;
  934.              SBUF = 0;
  935.              while (!TI);
  936.      }
  937.      
  938.      TI   = 0;                         //發送命令碼                     
  939.      i = (unsigned char)(g_cCommand & 0xFF);
  940.      SBUF = i;
  941.      chkdata ^= i;
  942.      while (!TI);

  943.      TI   = 0;                         //發送命令碼
  944.      i = (unsigned char)((g_cCommand >>8) & 0xFF);
  945.      SBUF = i;
  946.      chkdata ^= i;
  947.      while (!TI);

  948.      TI   = 0;                         //發送狀態字
  949.      SBUF = 0;
  950.      while (!TI);           
  951.      
  952.      TI   = 0;                         //發送效驗字
  953.      chkdata ^= g_cIcdevH^ g_cIcdevL;
  954.      SBUF = chkdata;
  955.      while (!TI);           
  956.      if (chkdata == 0xAA)
  957.      {
  958.              TI   = 0;
  959.              SBUF = 0;
  960.              while (!TI);
  961.      }
  962.      TI = 0;
  963.      ES = 1;
  964. }

  965. /////////////////////////////////////////////////////////////////////
  966. //正確執行完上位機指令,應答(有返回數據)
  967. //input:answerdata = 應答數據
  968. //       answernum  = 數據長度
  969. /////////////////////////////////////////////////////////////////////
  970. void AnswerOk(unsigned char *answerdata, unsigned int answernum)
  971. {   
  972.      unsigned char chkdata;
  973.      unsigned int i;
  974.      
  975.      TI   = 0;                         //發送命令頭         
  976.      SBUF = 0xAA;
  977.      while (!TI);           
  978.      TI   = 0;
  979.      SBUF = 0xBB;
  980.      while (!TI);
  981.      
  982.      TI   = 0;                         //長度字,包括狀態字和效驗字
  983.      chkdata = (((unsigned char)((answernum + 6) & 0xFF)));
  984.      SBUF = chkdata;
  985.      while (!TI);           
  986.      TI   = 0;
  987.      chkdata = (((unsigned char)(((answernum + 6)>>8) & 0xFF)));
  988.      SBUF = chkdata;
  989.      while (!TI);           
  990.      
  991.      TI   = 0;                         //發送設備標識
  992.      SBUF = g_cIcdevH;
  993.      while(!TI);
  994.      if (g_cIcdevH == 0xAA)
  995.      {
  996.              TI   = 0;
  997.              SBUF = 0;
  998.              while (!TI);
  999.      }
  1000.      TI   = 0;
  1001.      SBUF = g_cIcdevL;
  1002.      while(!TI);
  1003.      if (g_cIcdevL == 0xAA)
  1004.      {
  1005.              TI   = 0;
  1006.              SBUF = 0;
  1007.              while (!TI);
  1008.      }
  1009.      
  1010.      TI   = 0;                         //發送命令碼
  1011.      i = (unsigned char)(g_cCommand & 0xFF);
  1012.          SBUF = i;
  1013.          chkdata ^= i;
  1014.      while (!TI);

  1015.          TI   = 0;                         //發送命令碼
  1016.      i = (unsigned char)((g_cCommand >>8) & 0xFF);
  1017.          SBUF = i;
  1018.          chkdata ^= i;
  1019.      while (!TI);
  1020.      
  1021.      TI   = 0;                         //狀態字
  1022.      SBUF = 0;
  1023.      while (!TI);           
  1024.      
  1025.      chkdata ^= g_cIcdevH ^ g_cIcdevL;
  1026.      for (i=0; i<answernum; i++)
  1027.      {   
  1028.                TI   = 0;
  1029.                chkdata ^= *(answerdata+i);
  1030.                SBUF = *(answerdata+i);               
  1031.           while (!TI);
  1032.           if (*(answerdata + i) == 0xAA)
  1033.           {
  1034.               TI   = 0;
  1035.               SBUF = 0;
  1036.               while (!TI);
  1037.           }
  1038.      }
  1039.      
  1040.      TI   = 0;                         //效驗字
  1041.      SBUF = chkdata;
  1042.      while(!TI);           
  1043.      
  1044.      if (chkdata == 0xAA)
  1045.      {
  1046.          TI=0;
  1047.          SBUF=0;
  1048.          while (!TI);
  1049.      }
  1050.      
  1051.      TI = 0;
  1052.      ES = 1;
  1053. }

  1054. /////////////////////////////////////////////////////////////////////
  1055. //未能正確執行上位機指令,應答
  1056. //input:faultcode = 錯誤代碼
  1057. /////////////////////////////////////////////////////////////////////
  1058. void AnswerErr(char faultcode)
  1059. {   
  1060.      unsigned char i,chkdata;
  1061.      chkdata = 0;

  1062.      TI   = 0;                         //發送命令頭         
  1063.      SBUF = 0xAA;
  1064.      while (!TI);           
  1065.      TI   = 0;
  1066.      SBUF = 0xBB;
  1067.      while (!TI);
  1068.      
  1069.      TI   = 0;                         //發送長度字
  1070.      SBUF = 0x06;
  1071.      while (!TI);           
  1072.      TI   = 0;
  1073.      SBUF = 0x00;
  1074.      while (!TI);           
  1075.          
  1076.      TI   = 0;                         //發送設備標識
  1077.      SBUF = g_cIcdevH;
  1078.      while (!TI);
  1079.      if (g_cIcdevH == 0xAA)
  1080.      {
  1081.              TI   = 0;
  1082.              SBUF = 0;
  1083.              while (!TI);
  1084.      }
  1085.      TI   = 0;
  1086.      SBUF = g_cIcdevL;
  1087.      while (!TI);
  1088.      if (g_cIcdevL == 0xAA)
  1089.      {
  1090.              TI   = 0;
  1091.              SBUF = 0;
  1092.              while (!TI);
  1093.      }
  1094.      
  1095.      TI   = 0;                         //發送命令碼                     
  1096.      i = (unsigned char)(g_cCommand & 0xFF);
  1097.          SBUF = i;
  1098.          chkdata ^= i;
  1099.      while (!TI);

  1100.          TI   = 0;                         //發送命令碼
  1101.      i = (unsigned char)((g_cCommand >>8) & 0xFF);
  1102.          SBUF = i;
  1103.          chkdata ^= i;
  1104.      while (!TI);

  1105.      TI   = 0;                         //發送錯誤代碼
  1106.      SBUF = faultcode;
  1107.      while (!TI);              
  1108.      
  1109.      chkdata = g_cIcdevH ^ g_cIcdevL ^ faultcode;
  1110.      TI   = 0;                         //效驗字
  1111.      SBUF = chkdata;
  1112.      while (!TI);
  1113.      
  1114.      TI   = 0;
  1115.      ES   = 1;
  1116. }

  1117. /////////////////////////////////////////////////////////////////////
  1118. //串行中斷,接收上位機數據
  1119. /////////////////////////////////////////////////////////////////////
  1120. seri_int () interrupt 4 using 1

  1121. {
  1122.    unsigned int i,j;
  1123.    unsigned char rece_data = SBUF;
  1124.    unsigned char verify = 0;
  1125.    if (RI)
  1126.    {   
  1127.        RI = 0;
  1128.            if (g_bReceAA)
  1129.            {  
  1130.                g_bReceAA = 0;
  1131.                switch (rece_data)
  1132.                {   
  1133.                         case 0x00:
  1134.                       break;
  1135.                    case 0xBB:
  1136.                       g_cReceNum = 0;
  1137.                       break;
  1138.                    default:
  1139.                       i = g_cReceNum;
  1140.                       g_cReceBuf[i] = rece_data;
  1141.                       break;
  1142.                }
  1143.            }
  1144.            else
  1145.            {   
  1146.                switch (rece_data)
  1147.                {   
  1148.                         case 0xAA:
  1149.                       g_bReceAA = 1;
  1150.                    default:
  1151.                       i = g_cReceNum++;
  1152.                       g_cReceBuf[i] = rece_data;
  1153.                       break;
  1154.                }
  1155.            }
  1156.            i = (((unsigned int)(g_cReceBuf[1]<<8)) + (unsigned int)(g_cReceBuf[0]));
  1157.            if ((g_cReceNum == i + 2) && ( i != 0 ))
  1158.        {   
  1159.             for (j=1; j<g_cReceNum; j++)
  1160.             {   verify ^= g_cReceBuf[j];    }
  1161.             if (!verify)
  1162.                 {   
  1163.                         g_bReceOk  = 1;
  1164.                         g_cCommand = (((unsigned int)(g_cReceBuf[5]<<8)) + (unsigned int)(g_cReceBuf[4]));
  1165.                         g_bReceAA  = 0;
  1166.                                 sond =  0;
  1167.                         ES = 0;
  1168.                 }
  1169.         }

  1170.         if (g_cReceNum >= sizeof(g_cReceBuf))
  1171.         {   g_cReceNum=0;   }
  1172.     }
  1173.     if (TI)
  1174.     {        TI = 0;   }
  1175. }


  1176. void DelayMs(unsigned int _MS)
  1177. {
  1178.         unsigned char  i=0;
  1179.         while(_MS--)
  1180.         {
  1181.        for(i=0;i<120;i++)
  1182.           {
  1183.                  _nop_();_nop_();_nop_();_nop_();
  1184.          
  1185.           }
  1186.    }
  1187. }
  1188. void Delay_50us(unsigned char _50us)
  1189. {
  1190.     unsigned char i;
  1191.         while(_50us--)
  1192.         for(i=0;i<25;i++);
  1193. }


復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:210829 發表于 2017-6-13 15:50 | 只看該作者
支持一下~~~~~~~~~
回復

使用道具 舉報

板凳
ID:358141 發表于 2018-6-25 08:49 | 只看該作者
看看~~~~~~~~~~~~~~~
回復

使用道具 舉報

地板
ID:208310 發表于 2018-9-21 13:29 | 只看該作者
好東西,  正好需要。
回復

使用道具 舉報

5#
ID:66416 發表于 2018-10-28 16:55 | 只看該作者
不是SPI接口的!
回復

使用道具 舉報

6#
ID:431040 發表于 2018-11-22 10:40 | 只看該作者
感謝大佬,有用有用
回復

使用道具 舉報

7#
ID:517640 發表于 2019-4-30 15:26 | 只看該作者
感謝~感謝~感謝
回復

使用道具 舉報

8#
ID:381145 發表于 2019-5-4 20:26 | 只看該作者
學習一下,代碼不是SPI的驅動。
回復

使用道具 舉報

9#
ID:447180 發表于 2019-5-9 20:52 | 只看該作者
資料太少
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av片在线播放 | 国产激情网| 国产免费一区二区 | 国产高潮av | 亚洲精品成人在线 | 婷婷久久网 | 欧美日韩高清在线观看 | 日本在线精品视频 | 日韩在线免费 | 久久91av | 99精品国产一区二区三区 | 国产色婷婷久久99精品91 | 欧美日韩国产一区二区三区 | 欧美日韩午夜精品 | 精品国产91乱码一区二区三区 | 午夜影院普通用户体验区 | 亚洲狠狠| 九九九久久国产免费 | 国产91视频一区二区 | 色香婷婷 | 91国内产香蕉 | 91精品国产综合久久久亚洲 | 欧美精品在欧美一区二区少妇 | 欧美亚洲激情 | 欧美一级二级三级视频 | 欧美激情精品久久久久久变态 | 欧美成人一区二区三区 | 免费高潮视频95在线观看网站 | 欧美一区在线看 | 色就干| 国产一区二区三区视频 | 久久激情网 | 欧美天堂 | 欧美精品一区二区三区四区 | 99国产在线 | 中文字幕一区二区三区在线观看 | 三级视频在线观看 | 日韩成人 | 国产在线二区 | 国产成人精品一区二区三区在线观看 | www.日韩高清 |