FM1702.c
上传用户:guangya188
上传日期:2019-10-26
资源大小:4644k
文件大小:27k
源码类别:

RFID编程

开发平台:

C/C++

  1. #include <reg52.h>
  2. #define __SRC
  3. #include "main.h"
  4. #undef  __SRC
  5. #include <intrins.h>
  6. //#include <string.h>
  7. //#include <stdio.h>
  8. //#include <absacc.h>
  9. #include "FM1702.h"
  10. #define uchar unsigned char
  11. #define uint unsigned int
  12.    
  13. sbit RF_MISO = P1^0;
  14. sbit RF_MOSI = P1^1;
  15. sbit RF_SCK = P1^2;
  16. sbit RF_NSS = P1^3;
  17. sbit RF_RST   =   P1^4;
  18. sbit CARD_LED = P2^0;
  19. sbit SPEAKER    =   P2^0; 
  20. char spi_byte_transceive(char sendbyte)
  21. {
  22.   char i,temp;
  23.   for(i=0;i<8;i++)
  24.    {  
  25.     RF_SCK=0;
  26.     if(sendbyte & 0x80)                         { 
  27.       RF_MOSI=1;
  28.      }
  29.     else
  30.      { 
  31.       RF_MOSI=0;
  32.      }
  33.     sendbyte <<= 1;
  34.     RF_SCK=1;
  35.     temp <<= 1;
  36.     if(RF_MISO)
  37.     temp |= 0x01;
  38.    }
  39.     RF_SCK=0;
  40.      _nop_();
  41.  _nop_();
  42.     RF_MOSI=0;
  43.     return (temp);
  44. }
  45. void SPIWrite(char reg_ad,char reg_data)
  46. {   
  47.     RF_SCK=0;
  48.     reg_ad <<= 1;
  49.     RF_NSS=0;
  50.     reg_ad &= 0x7F;
  51.     spi_byte_transceive(reg_ad);
  52.     spi_byte_transceive(reg_data);
  53.     RF_NSS=1;
  54.     return;
  55. }
  56. unsigned char SPIRead(char reg_ad)
  57. {   char temp;
  58.     RF_SCK=0;
  59.      _nop_();
  60.      _nop_();
  61.     RF_NSS=0;
  62.     reg_ad <<= 1;
  63.     reg_ad |= 0x80;
  64.     spi_byte_transceive(reg_ad);
  65.     temp=spi_byte_transceive(0x00);
  66.     RF_NSS=1;
  67.     return (temp);
  68. }
  69. void main(void)
  70.     uchar baud;
  71.     InitSystem();        
  72.  while (1)
  73.     {
  74. //检查命令标志
  75.       if (CmdValid)     {
  76.     CmdValid = FALSE;
  77.     if(RevBuffer[0]==11)  
  78.     {
  79.      RevBuffer[2]=RevBuffer[1];
  80.         RevBuffer[0]=1;         
  81.      RevBuffer[1]=0;
  82.      CALL_isr_UART();
  83.      SPEAKER=0;              
  84. delay_10ms(RevBuffer[2]);
  85.      SPEAKER=1;
  86.     }
  87.       else if(RevBuffer[0]==13)         {
  88.      switch(RevBuffer[1])
  89.      {
  90.      case 0:
  91.      baud=BAUD_9600;
  92.      break;
  93.      case 1:
  94.      baud=BAUD_14400;
  95.      break;
  96.      case 2:
  97.      baud=BAUD_19200;
  98.      break;
  99.      case 3:
  100.      baud=BAUD_28800;
  101.      break;
  102.      case 4:
  103.      baud=BAUD_38400;
  104.      break;
  105.      case 5:
  106.      baud=BAUD_57600;
  107.      break;
  108.      case 6:
  109.      baud=BAUD_115200;
  110.      break;
  111.      default:
  112.      baud=BAUD_19200;
  113.      break;
  114.      }
  115.      RevBuffer[0]=1;         
  116.      RevBuffer[1]=0;
  117.      CALL_isr_UART();
  118.      delay_10ms(5);
  119.      TR1   = 0;
  120.      TH1   = baud;
  121.      TL1   = TH1;
  122.      delay_10ms(2);
  123.      TR1   = TRUE;
  124.      }//if LEVEL 2
  125.         else
  126.      {
  127.      cmd_process();        
  128.      CALL_isr_UART();
  129.      }
  130.      }
  131.     }//while循环体
  132. }
  133. void InitSystem(void)
  134. {
  135.     RF_NSS=1;
  136. RF_RST=0;
  137. ET2 = 0; 
  138. T2CON = 0x04;
  139.     PCON = 0x80;        
  140.     SCON = 0x70;    
  141. //TMOD = 0x22;
  142.     TMOD = 0x21;    
  143. TH1   = BAUD_19200;  
  144. TL1   = TH1;
  145. TR1   = TRUE;        
  146. TH0 = 0x60;
  147.     TL0 = 0x60;
  148.     TR0 = 0;
  149.     
  150.     ET0=0;
  151. ET1=0;
  152. EA=1;
  153. EX0=1;
  154. IT0 = 1;
  155. TR2=0;
  156.   ES = TRUE;    
  157. CmdValid=0; 
  158. SPEAKER=0;
  159. delay_10ms(10);
  160. delay_10ms(10);
  161. SPEAKER=1;    
  162. Init_FM1702(0);                 
  163. }
  164. void isr_UART(void) interrupt 4 using 1
  165. {
  166.     uchar len, i;
  167.    unsigned int j=0;
  168.   
  169.    if(RI)
  170. {
  171. len=SBUF;
  172. RI=0;
  173. for(i=0;i<len;i++)
  174. {
  175. while(!RI)
  176. {
  177. j++;
  178. if(j>1000)
  179. {
  180.     break;
  181. }
  182. }
  183. if(j<1000)
  184. {
  185. RevBuffer[i]=SBUF;
  186. RI=0;
  187. j=0;
  188. }
  189. else
  190. {
  191.     break;
  192. }
  193. }
  194. if(i==len)
  195. {
  196. REN=0;
  197. CmdValid=1;
  198. }
  199. }
  200. else if(!RI && TI)
  201. {
  202. TI=0;
  203. len=RevBuffer[0];
  204. for(i=0;i<len+1;i++)
  205. {
  206. SBUF=RevBuffer[i];
  207. while(!TI);
  208. TI=0;
  209. }
  210. REN=1;
  211. }
  212. }
  213. void cmd_process(void)
  214. {
  215.     uchar cmd;
  216.     uchar status;
  217. cmd = RevBuffer[0];
  218. switch(cmd)
  219. {
  220. case 1:     
  221. status=MIF_Halt();
  222. RevBuffer[0]=1;
  223. RevBuffer[1]=status;
  224. break;
  225. case 2:     
  226.          status = Request(RF_CMD_REQUEST_ALL);
  227.          if(status != FM1702_OK)
  228.          {
  229.              status = Request(RF_CMD_REQUEST_ALL);
  230.              if(status != FM1702_OK)
  231.              {
  232.                  RevBuffer[0] = 1;
  233.                  RevBuffer[1] = FM1702_REQERR;
  234.                  break;
  235.              }
  236.          }
  237. if(tagtype[0]==2)
  238. cardtype=mifarepro;     
  239. else if(tagtype[0]==4)
  240. cardtype=mifare1;       
  241. else if(tagtype[0]==16)
  242. cardtype=mifarelight;   
  243. else
  244. cardtype=unknowncard;
  245. RevBuffer[0]=3;
  246. RevBuffer[1]=status;
  247. RevBuffer[2]=tagtype[0];
  248. RevBuffer[3]=tagtype[1];
  249. break;
  250.     case 3:                         
  251. status = AntiColl();;
  252. if(status!=FM1702_OK)
  253. {
  254. RevBuffer[0]=1;
  255. RevBuffer[1]=FM1702_ANTICOLLERR;
  256. break;
  257. }
  258. //memcpy(MLastSelectedSnr,&RevBuffer[2],4);
  259. RevBuffer[0]=5;
  260. RevBuffer[1]=status;
  261. RevBuffer[2]=UID[0];
  262. RevBuffer[3]=UID[1];
  263. RevBuffer[4]=UID[2];
  264. RevBuffer[5]=UID[3];
  265. break;
  266. case 4:                     
  267. status=Select_Card();
  268. if(status!=FM1702_OK)
  269. {
  270. RevBuffer[0]=1;
  271. RevBuffer[1]=FM1702_SELERR;
  272. break;
  273. }
  274. RevBuffer[0]=1;
  275. RevBuffer[1]=status;
  276. break;
  277.         case 5:                       
  278. status = Load_keyE2(RevBuffer[2],RevBuffer[1]);   
  279. status = Authentication(UID, RevBuffer[2], RevBuffer[1]);
  280.          if(status != FM1702_OK)
  281.          {
  282.          RevBuffer[0]=1;
  283.     RevBuffer[1]=status;
  284.     break;
  285.          }
  286. RevBuffer[0]=1;
  287. RevBuffer[1]=status;
  288. break;
  289. case 6:     
  290.              
  291. status = Load_keyE2_CPY(RevBuffer[2],RevBuffer[1]);   //%40
  292.          if(status != FM1702_OK)
  293.          {
  294.          RevBuffer[0]=1;
  295.     RevBuffer[1]=status;
  296.     break;
  297.          }
  298. RevBuffer[0]=1;
  299. RevBuffer[1]=status;
  300. break;
  301. case 8:                       
  302. status=MIF_READ(&RevBuffer[2],RevBuffer[1]);
  303. if(status != FM1702_OK)
  304. {
  305.     RevBuffer[0]=1;
  306.     RevBuffer[1]=status;
  307.     break;
  308. }
  309. else
  310. {
  311. if(cardtype==mifare1||cardtype==mifarepro)
  312. RevBuffer[0]=17;
  313. else if(cardtype==1)
  314. RevBuffer[0]=9;
  315. else
  316. RevBuffer[0]=16;
  317. }
  318. RevBuffer[1]=status;
  319. break;
  320. case 9:                  
  321. status=MIF_Write(&RevBuffer[2],RevBuffer[1]);
  322. RevBuffer[0]=1;
  323. RevBuffer[1]=status;
  324. break;
  325. case 10:                
  326. if(RevBuffer[1] == RF_CMD_INC)
  327. {
  328.     status = MIF_Increment(&RevBuffer[3],RevBuffer[2]);
  329.     MIF_Transfer(RevBuffer[2]);
  330. }
  331. else if(RevBuffer[1] == RF_CMD_DEC)
  332. {
  333.     status = MIF_Decrement(&RevBuffer[3],RevBuffer[2]);   
  334.     MIF_Transfer(RevBuffer[2]);
  335. }
  336. else
  337. {
  338.     status = 1;
  339. }
  340. RevBuffer[0]=1;
  341. RevBuffer[1]=status;
  342. break;
  343. case 12:    
  344. RevBuffer[0]=1;
  345. RevBuffer[1]=0;
  346. break;
  347. default:
  348.     RevBuffer[0] = 1;
  349.     RevBuffer[1] = 1;
  350.     break;
  351. }
  352. }
  353. uchar Clear_FIFO(void)
  354. {
  355. uchar temp;
  356. uint i;
  357. temp = SPIRead(Control);
  358. temp = (temp | 0x01);
  359. SPIWrite(Control,temp);
  360. for(i = 0; i < RF_TimeOut; i++) 
  361. {
  362. temp = SPIRead(FIFO_Length);
  363. if(temp == 0)
  364. {
  365. return TRUE;
  366. }
  367. }
  368. return FALSE;
  369. }
  370. void Write_FIFO(uchar count, uchar idata *buff)
  371. {
  372. uchar i;
  373. for(i = 0; i < count; i++)
  374. {
  375. SPIWrite(FIFO,*(buff + i));
  376. }
  377. }
  378. uchar Read_FIFO(uchar idata *buff)
  379. {
  380. uchar temp;
  381. uchar i;
  382. temp = SPIRead(FIFO_Length);
  383. if(temp == 0)
  384. {
  385. return 0;
  386. }
  387. if(temp >= 24)
  388. {
  389. temp = 24;
  390. }
  391. for(i = 0; i < temp; i++)
  392. {
  393. *(buff + i) = SPIRead(FIFO);
  394. }
  395. return temp;
  396. }
  397. uchar Judge_Req(uchar idata *buff)
  398. {
  399. uchar temp1, temp2;
  400. temp1 = *buff;
  401. temp2 = *(buff + 1);
  402. if((temp1 == 0x02) || (temp1 == 0x04) || (temp1 == 0x05) || (temp1 == 0x53) || (temp1 == 0x03))
  403. {
  404. if (temp2 == 0x00)
  405. {
  406. return TRUE;
  407. }
  408. }
  409. return FALSE;
  410. }
  411. uchar Check_UID(void)
  412. {
  413. uchar temp;
  414. uchar i;
  415. temp = 0x00;
  416. for(i = 0; i < 5; i++)
  417. {
  418. temp = temp ^ UID[i];
  419. }
  420. if(temp == 0)
  421. {
  422. return TRUE;
  423. }
  424. return FALSE;
  425. }
  426. void Save_UID(uchar row, uchar col, uchar length)
  427. {
  428. uchar i;
  429. uchar temp;
  430. uchar temp1;
  431. if((row == 0x00) && (col == 0x00))
  432. {
  433. for(i = 0; i < length; i++)
  434. {
  435. UID[i] = RevBuffer[i];
  436. }
  437. }
  438. else
  439. {
  440. temp = RevBuffer[0];
  441. temp1 = UID[row - 1];
  442. switch(col)
  443. {
  444. case 0: temp1 = 0x00; row = row + 1; break;
  445. case 1: temp = temp & 0xFE; temp1 = temp1 & 0x01; break;
  446. case 2: temp = temp & 0xFC; temp1 = temp1 & 0x03; break;
  447. case 3: temp = temp & 0xF8; temp1 = temp1 & 0x07; break;
  448. case 4: temp = temp & 0xF0; temp1 = temp1 & 0x0F; break;
  449. case 5: temp = temp & 0xE0; temp1 = temp1 & 0x1F; break;
  450. case 6: temp = temp & 0xC0; temp1 = temp1 & 0x3F; break;
  451. case 7: temp = temp & 0x80; temp1 = temp1 & 0x7F; break;
  452. default: break;
  453. }
  454. RevBuffer[0] = temp;
  455. UID[row - 1] = temp1 | temp;
  456. for(i = 1; i < length; i++)
  457. {
  458. UID[row - 1 + i] = RevBuffer[i];
  459. }
  460. }
  461. }
  462. void Set_BitFraming(uchar row, uchar col)
  463. {
  464. switch(row)
  465. {
  466. case 0: RevBuffer[1] = 0x20; break;
  467. case 1: RevBuffer[1] = 0x30; break;
  468. case 2: RevBuffer[1] = 0x40; break;
  469. case 3: RevBuffer[1] = 0x50; break;
  470. case 4: RevBuffer[1] = 0x60; break;
  471. default: break;
  472. }
  473. switch(col)
  474. {
  475. case 0: SPIWrite(Bit_Frame,0x00); break;
  476. case 1: SPIWrite(Bit_Frame,0x11); RevBuffer[1] = (RevBuffer[1] | 0x01); break;
  477. case 2: SPIWrite(Bit_Frame,0x22); RevBuffer[1] = (RevBuffer[1] | 0x02); break;
  478. case 3: SPIWrite(Bit_Frame,0x33); RevBuffer[1] = (RevBuffer[1] | 0x03); break;
  479. case 4: SPIWrite(Bit_Frame,0x44); RevBuffer[1] = (RevBuffer[1] | 0x04); break;
  480. case 5: SPIWrite(Bit_Frame,0x55); RevBuffer[1] = (RevBuffer[1] | 0x05); break;
  481. case 6: SPIWrite(Bit_Frame,0x66); RevBuffer[1] = (RevBuffer[1] | 0x06); break;
  482. case 7: SPIWrite(Bit_Frame,0x77); RevBuffer[1] = (RevBuffer[1] | 0x07); break;
  483. default: break;
  484. }
  485. }
  486. void Init_FM1702(uchar mode)
  487. {
  488. uchar temp;
  489. uint i;
  490. //    unsigned int idata timecnt=0;
  491. RF_SCK = 1;
  492. RF_MISO = 1;
  493. RF_MOSI = 1;
  494. RF_RST = 1;             
  495. for(i = 0; i < 0x1fff; i++)
  496. {
  497. _nop_();                     
  498. }
  499. RF_RST = 0;
  500. for(i = 0; i < 0x1fff; i++)      
  501. {
  502. _nop_();
  503. }
  504. ////////////////////////////////////////////////////////////////////////////
  505. while(temp = SPIRead(Command) != 0)
  506. {
  507. _nop_();
  508. }
  509. ////////////////////////////////////////////////////////////////////////////
  510. // delay_10ms(1);
  511.     SPIWrite(Page_Sel,0x80);
  512. for(i = 0; i < 0x1fff; i++) /* 延时 */
  513. {
  514. if(temp=SPIRead(Command) == 0x00)
  515. {
  516. SPIWrite(Page_Sel,0x00);
  517. }
  518. }
  519. //    P2 = SPIRead(TimerClock);           
  520. SPIWrite(TimerClock,0x0b);   
  521. SPIWrite(TimerControl,0x02);  
  522. SPIWrite(TimerReload,0x42);      
  523.    
  524. SPIWrite(InterruptEn,0x7f);      
  525. // temp = SPIRead(InterruptEn);
  526. SPIWrite(Int_Req,0x7f);            
  527. SPIWrite(TxControl,0x5b);
  528. SPIWrite(RxControl2,0x01);
  529. // SPIWrite(RxControl1,0x73);
  530. SPIWrite(RxWait,0x07);
  531. if(mode ==2)
  532. {
  533. SPIWrite(TypeSH,0x01);
  534. }
  535. else
  536. {
  537. SPIWrite(TypeSH,0x00);
  538. }
  539. }
  540. uchar Command_Send(uchar count, uchar idata *buff, uchar Comm_Set)
  541. {
  542. uint j;
  543. uchar idata temp, temp1;
  544. SPIWrite(Command,0x00);
  545. Clear_FIFO();
  546. Write_FIFO(count, buff);
  547. SPIWrite(Command,Comm_Set); /* 命令执行 */
  548. for(j = 0; j < RF_TimeOut; j++) /* 检查命令执行否 */
  549. {
  550. temp = SPIRead(Command);
  551. temp1 = SPIRead(Int_Req) & 0x80;
  552. if(temp == 0x00)
  553. {
  554. return TRUE;
  555. }
  556. }
  557. return FALSE;
  558. }
  559. uchar Read_E2(uchar lsb, uchar msb, uchar count, uchar idata *buff)
  560. {
  561. uchar temp;
  562. *buff = lsb;
  563. *(buff + 1) = msb;
  564. *(buff + 2) = count;
  565. temp = Command_Send(3, buff, ReadE2);
  566. Read_FIFO(buff);
  567. if(temp == FALSE) return(TRUE);
  568. return(FALSE);
  569. }
  570. uchar Write_E2(uchar lsb, uchar msb, uchar count, uchar idata *buff)
  571. {
  572. uchar idata temp, i;
  573. for(i = 0; i < count; i++)
  574. {
  575. *(buff + count - i + 2) = *(buff - i + count);
  576. }
  577. *buff = lsb;
  578. *(buff + 1) = msb;
  579. temp = Command_Send(count + 2, buff, WriteE2);
  580. temp = SPIRead(SecondaryStatus);
  581. temp = temp & 0x40;
  582. if(temp == 0x40)
  583. {
  584. SPIWrite(Command,0x00);
  585. return TRUE;
  586. }
  587. return FALSE;
  588. }
  589. uchar MIF_Halt(void)
  590. {
  591. uchar temp;
  592. uint i;
  593. SPIWrite(CRCPresetLSB,0x63);
  594. SPIWrite(CWConductance,0x3f);
  595. SPIWrite(ChannelRedundancy,0x03);
  596. *RevBuffer = RF_CMD_HALT;
  597. *(RevBuffer + 1) = 0x00;
  598. temp = Command_Send(2, RevBuffer, Transmit);
  599. if(temp == TRUE)
  600. {
  601. for(i = 0; i < 0x50; i++)
  602. {
  603. _nop_();
  604. }
  605. return FM1702_OK;
  606. }
  607. else
  608. {
  609. temp = SPIRead(ErrorFlag);
  610. if((temp & 0x02) == 0x02)
  611. {
  612. return(FM1702_PARITYERR);
  613. }
  614. if((temp & 0x04) == 0x04)
  615. {
  616. return(FM1702_FRAMINGERR);
  617. }
  618. return(FM1702_NOTAGERR);
  619. }
  620. }
  621. char M500HostCodeKey(  uchar *uncoded, uchar *coded)   
  622. {
  623.     char idata status = FM1702_OK;
  624.     uchar idata cnt = 0;
  625.     uchar idata ln  = 0;     
  626.     uchar idata hn  = 0;      
  627.     for (cnt = 0; cnt < 6; cnt++)
  628.     {
  629.         ln = uncoded[cnt] & 0x0F;
  630.         hn = uncoded[cnt] >> 4;
  631.         coded[cnt * 2 + 1] = (~ln << 4) | ln;
  632.         coded[cnt * 2 ] = (~hn << 4) | hn;
  633.     }
  634.     return FM1702_OK;
  635. }
  636. uchar Load_keyE2_CPY(uchar Secnr, uchar Mode)
  637. {
  638. char idata status;
  639. uchar temp;
  640. uchar msb = 0;
  641. uchar lsb = 0;
  642. uchar coded_keys[12];
  643. uchar temp1;
  644. if(Secnr >= 0x20)
  645. {
  646.   temp1 = Secnr - 0x20;
  647.   Secnr = 0x20 + temp1 * 4;
  648. }
  649. temp = Secnr * 12;
  650. if(Mode == RF_CMD_AUTH_LA)
  651. {
  652. if(temp >= 0x80)
  653. {
  654. lsb = temp - 0x80;
  655. msb = 0x01;
  656. }
  657. else
  658. {
  659. lsb = temp + 0x80;
  660. msb = 0x00;
  661. }
  662. }
  663. else
  664. {
  665. msb = 0x01;
  666. lsb = temp + 0x40;
  667. }
  668. status = M500HostCodeKey(&RevBuffer[3],coded_keys);////////////////
  669. status = Write_E2(lsb, msb, 12, coded_keys);      ////////////////
  670. if(status != FM1702_OK)
  671. {
  672. return FALSE;
  673. }
  674. return TRUE;
  675. }
  676. uchar Load_keyE2(uchar Secnr, uchar Mode)
  677. {
  678. uchar temp;
  679. uchar msb = 0;
  680. uchar lsb = 0;
  681. uchar temp1;
  682. if(Secnr >= 0x20)
  683. {
  684.   temp1 = Secnr - 0x20;
  685.   Secnr = 0x20 + temp1 * 4;
  686. }
  687. temp = Secnr * 12;
  688. if(Mode == RF_CMD_AUTH_LA)
  689. {
  690. if(temp >= 0x80)
  691. {
  692. lsb = temp - 0x80;
  693. msb = 0x01;
  694. }
  695. else
  696. {
  697. lsb = temp + 0x80;
  698. msb = 0x00;
  699. }
  700. }
  701. else
  702. {
  703. msb = 0x01;
  704. lsb = temp + 0x40;
  705. }
  706. RevBuffer[0] = lsb;
  707. RevBuffer[1] = msb;
  708. temp = Command_Send(2, RevBuffer, LoadKeyE2);
  709. temp = SPIRead(ErrorFlag) & 0x40;
  710. if(temp == 0x40)
  711. {
  712. return FALSE;
  713. }
  714. return TRUE;
  715. }
  716. uchar Request(uchar mode)
  717. {
  718. uchar idata temp;
  719. // SPIWrite(CRCPresetLSB,0x63);
  720. // SPIWrite(CWConductance,0x3f);
  721. RevBuffer[0] = mode;
  722. SPIWrite(Bit_Frame,0x07);
  723. SPIWrite(ChannelRedundancy,0x03);
  724. temp = SPIRead(Control);
  725. temp = temp & (0xf7);
  726. SPIWrite(Control,temp); //Control reset value is 00
  727. temp = Command_Send(1, RevBuffer, Transceive);   //Transceive=0x1E
  728. if(temp == FALSE)
  729. {
  730. return FM1702_NOTAGERR;
  731. }
  732. Read_FIFO(RevBuffer);
  733. temp = Judge_Req(RevBuffer);
  734. if(temp == TRUE)
  735. {
  736. tagtype[0] = RevBuffer[0];
  737. tagtype[1] = RevBuffer[1];
  738. return FM1702_OK;
  739. }
  740. return FM1702_REQERR;
  741. }
  742. uchar AntiColl(void)
  743. {
  744. uchar temp;
  745. uchar i;
  746. uchar row, col;
  747. uchar pre_row;
  748. row = 0;
  749. col = 0;
  750. pre_row = 0;
  751. SPIWrite(CRCPresetLSB,0x63);
  752. SPIWrite(CWConductance,0x3f);
  753. // SPIWrite(ModConductance,0x3f);
  754. RevBuffer[0] = RF_CMD_ANTICOL;
  755. RevBuffer[1] = 0x20;
  756. SPIWrite(ChannelRedundancy,0x03);
  757. temp = Command_Send(2, RevBuffer, Transceive);
  758. while(1)
  759. {
  760. if(temp == FALSE)
  761. {
  762. return(FM1702_NOTAGERR);
  763. }
  764. //temp = ErrorFlag;
  765. temp = SPIRead(FIFO_Length);
  766. if(temp == 0)
  767. {
  768. return FM1702_BYTECOUNTERR;
  769. }
  770. Read_FIFO(RevBuffer);
  771. Save_UID(row, col, temp);
  772. temp = SPIRead(ErrorFlag);
  773. temp = temp & 0x01;
  774. if(temp == 0x00)
  775. {
  776. temp = Check_UID();
  777. if(temp == FALSE)
  778. {
  779. return(FM1702_SERNRERR);
  780. }
  781. return(FM1702_OK);
  782. }
  783. else
  784. {
  785. temp = SPIRead(CollPos); row = temp / 8;
  786. col = temp % 8;
  787. RevBuffer[0] = RF_CMD_ANTICOL;
  788. Set_BitFraming(row + pre_row, col);
  789. pre_row = pre_row + row;
  790. for(i = 0; i < pre_row + 1; i++)
  791. {
  792. RevBuffer[i + 2] = UID[i];
  793. }
  794. if(col != 0x00)
  795. {
  796. row = pre_row + 1;
  797. }
  798. else
  799. {
  800. row = pre_row;
  801. }
  802. temp = Command_Send(row + 2, RevBuffer, Transceive);
  803. }
  804. }
  805. }
  806. uchar Select_Card(void)
  807. {
  808. uchar temp, i;
  809. SPIWrite(CRCPresetLSB,0x63);
  810. SPIWrite(CWConductance,0x3f);
  811. RevBuffer[0] = RF_CMD_SELECT;
  812. RevBuffer[1] = 0x70;
  813. for(i = 0; i < 5; i++)
  814. {
  815. RevBuffer[i + 2] = UID[i];
  816. }
  817. SPIWrite(ChannelRedundancy,0x0f);
  818. temp = Command_Send(7, RevBuffer, Transceive);
  819. if(temp == FALSE)
  820. {
  821. return(FM1702_NOTAGERR);
  822. }
  823. else
  824. {
  825. temp = SPIRead(ErrorFlag);
  826. if((temp & 0x02) == 0x02) return(FM1702_PARITYERR);
  827. if((temp & 0x04) == 0x04) return(FM1702_FRAMINGERR);
  828. if((temp & 0x08) == 0x08) return(FM1702_CRCERR);
  829. temp = SPIRead(FIFO_Length);
  830. if(temp != 1) return(FM1702_BYTECOUNTERR);
  831. Read_FIFO(RevBuffer);
  832. temp = *RevBuffer;
  833. if((temp == 0x18) || (temp == 0x08) || (temp == 0x88) || (temp ==0x53)) return(FM1702_OK);
  834. else
  835. return(FM1702_SELERR);
  836. }
  837. }
  838. uchar Authentication(uchar idata *UID, uchar SecNR, uchar mode)
  839. {
  840. uchar idata i;
  841. uchar idata temp, temp1;
  842. uchar temp0;
  843. if(SecNR >= 0x20)
  844. {
  845. temp0 = SecNR -0x20;
  846. SecNR = 0x20 + temp0 * 4;
  847. }
  848. SPIWrite(CRCPresetLSB,0x63);
  849. SPIWrite(CWConductance,0x3f);
  850. // SPIWrite(ModConductance,0X3f);
  851. // temp1 = SPIRead(Control);
  852. // temp1 = temp1 & 0xf7;
  853. // SPIWrite(Control,temp1);
  854. if(mode == RF_CMD_AUTH_LB)
  855. RevBuffer[0] = RF_CMD_AUTH_LB;
  856. else
  857. RevBuffer[0] = RF_CMD_AUTH_LA;
  858. RevBuffer[1] = SecNR * 4 + 3;
  859. for(i = 0; i < 4; i++)
  860. {
  861. RevBuffer[2 + i] = UID[i];
  862. }
  863. SPIWrite(ChannelRedundancy,0x0f);
  864. temp = Command_Send(6, RevBuffer, Authent1);
  865. if(temp == FALSE)
  866. {
  867. return 0x99;
  868. }
  869. temp = SPIRead(ErrorFlag);             //ErrorFlag address is 0x0A.
  870. if((temp & 0x02) == 0x02) return FM1702_PARITYERR;
  871. if((temp & 0x04) == 0x04) return FM1702_FRAMINGERR;
  872. if((temp & 0x08) == 0x08) return FM1702_CRCERR;
  873. temp = Command_Send(0, RevBuffer, Authent2);
  874. if(temp == FALSE)
  875. {
  876. return 0x88;
  877. }
  878. temp = SPIRead(ErrorFlag);
  879. if((temp & 0x02) == 0x02) return FM1702_PARITYERR;
  880. if((temp & 0x04) == 0x04) return FM1702_FRAMINGERR;
  881. if((temp & 0x08) == 0x08) return FM1702_CRCERR;
  882. temp1 = SPIRead(Control);
  883. temp1 = temp1 & 0x08;
  884. if(temp1 == 0x08)
  885. {
  886. return FM1702_OK;
  887. }
  888. return FM1702_AUTHERR;
  889. }
  890. uchar MIF_READ(uchar idata *buff, uchar Block_Adr)
  891. {
  892. uchar idata temp;
  893. SPIWrite(CRCPresetLSB,0x63);
  894. SPIWrite(CWConductance,0x3f);
  895. SPIWrite(ModConductance,0x3f);
  896. SPIWrite(ChannelRedundancy,0x0f);
  897. buff[0] = RF_CMD_READ;
  898. buff[1] = Block_Adr;
  899. temp = Command_Send(2, buff, Transceive);
  900. if(temp == 0)
  901. {
  902. return FM1702_NOTAGERR;
  903. }
  904. temp = SPIRead(ErrorFlag);
  905. if((temp & 0x02) == 0x02) return FM1702_PARITYERR;
  906. if((temp & 0x04) == 0x04) return FM1702_FRAMINGERR;
  907. if((temp & 0x08) == 0x08) return FM1702_CRCERR;
  908. temp = SPIRead(FIFO_Length);
  909. if(temp == 0x10)
  910. {
  911. Read_FIFO(buff);
  912. return FM1702_OK;
  913. }
  914. else if(temp == 0x04)
  915. {
  916. Read_FIFO(buff);
  917. return FM1702_OK;
  918. }
  919. else
  920. {
  921. return FM1702_BYTECOUNTERR;
  922. }
  923. }
  924. uchar MIF_Write(uchar idata *buff, uchar Block_Adr)
  925. {
  926. uchar idata temp;
  927. uchar idata *F_buff;
  928. SPIWrite(CRCPresetLSB,0x63);
  929. SPIWrite(CWConductance,0x3f);
  930. F_buff = buff + 0x10;
  931. SPIWrite(ChannelRedundancy,0x07);    /* Note: this line is for 1702, different from RC500*/
  932. *F_buff = RF_CMD_WRITE;
  933. *(F_buff + 1) = Block_Adr;
  934. temp = Command_Send(2, F_buff, Transceive);
  935. if(temp == FALSE)
  936. {
  937. return(FM1702_NOTAGERR);
  938. }
  939. temp = SPIRead(FIFO_Length);
  940. if(temp == 0)
  941. {
  942. return(FM1702_BYTECOUNTERR);
  943. }
  944. Read_FIFO(F_buff);
  945. temp = *F_buff;
  946. switch(temp)
  947. {
  948. case 0x00: return(FM1702_NOTAUTHERR);
  949. case 0x04: return(FM1702_EMPTY);
  950. case 0x0a: break;
  951. case 0x01: return(FM1702_CRCERR);
  952. case 0x05: return(FM1702_PARITYERR);
  953. default: return(FM1702_WRITEERR);
  954. }
  955. temp = Command_Send(16, buff, Transceive);
  956. if(temp == TRUE)
  957. {
  958. return(FM1702_OK);
  959. }
  960. else
  961. {
  962. temp = SPIRead(ErrorFlag);
  963. if((temp & 0x02) == 0x02)
  964. return(FM1702_PARITYERR);
  965. else if((temp & 0x04) == 0x04)
  966. return(FM1702_FRAMINGERR);
  967. else if((temp & 0x08) == 0x08)
  968. return(FM1702_CRCERR);
  969. else
  970. return(FM1702_WRITEERR);
  971. }
  972. }
  973. uchar MIF_Increment(uchar idata *buff, uchar Block_Adr)
  974. {
  975. uchar temp;
  976. uchar idata *F_buff;
  977. SPIWrite(CRCPresetLSB,0x63);
  978. SPIWrite(CWConductance,0x3f);
  979. F_buff = buff + 4;
  980. *F_buff = RF_CMD_INC;
  981. *(F_buff + 1) = Block_Adr;
  982. SPIWrite(ChannelRedundancy,0x07);
  983. temp = Command_Send(2, F_buff, Transceive);
  984. if(temp == FALSE)
  985. {
  986. return FM1702_NOTAGERR;
  987. }
  988. temp = SPIRead(FIFO_Length);
  989. if(temp == 0)
  990. {
  991. return FM1702_BYTECOUNTERR;
  992. }
  993. Read_FIFO(F_buff);
  994. temp = *F_buff;
  995. switch(temp)
  996. {
  997. case 0x00: /* break; */return(FM1702_NOTAUTHERR);
  998. case 0x04: return(FM1702_EMPTY);
  999. case 0x0a: break;
  1000. case 0x01: return(FM1702_CRCERR);
  1001. case 0x05: return(FM1702_PARITYERR);
  1002. default: return(FM1702_INCRERR);
  1003. }
  1004.         
  1005. temp = Command_Send(4, buff, Transmit);
  1006. if(temp == FALSE)
  1007. {
  1008. return FM1702_INCRERR;
  1009. }
  1010. return FM1702_OK;
  1011. }
  1012. uchar MIF_Decrement(uchar idata *buff, uchar Block_Adr)
  1013. {
  1014. uchar temp;
  1015. uchar idata *F_buff;
  1016. SPIWrite(CRCPresetLSB,0x63);
  1017. SPIWrite(CWConductance,0x3f);
  1018. F_buff = buff + 4;
  1019. *F_buff = RF_CMD_DEC;
  1020. *(F_buff + 1) = Block_Adr;
  1021. SPIWrite(ChannelRedundancy,0x07);
  1022. temp = Command_Send(2, F_buff, Transceive);
  1023. if(temp == FALSE)
  1024. {
  1025. return FM1702_NOTAGERR;
  1026. }
  1027. temp = SPIRead(FIFO_Length);
  1028. if(temp == 0)
  1029. {
  1030. return FM1702_BYTECOUNTERR;
  1031. }
  1032. Read_FIFO(F_buff);
  1033. temp = *F_buff;
  1034. switch(temp)
  1035. {
  1036. case 0x00: /* break; */return(FM1702_NOTAUTHERR);
  1037. case 0x04: return(FM1702_EMPTY);
  1038. case 0x0a: break;
  1039. case 0x01: return(FM1702_CRCERR);
  1040. case 0x05: return(FM1702_PARITYERR);
  1041. default: return(FM1702_DECRERR);
  1042. }
  1043. temp = Command_Send(4, buff, Transmit);
  1044. if(temp == FALSE)
  1045. {
  1046. return(FM1702_DECRERR);
  1047. }
  1048. return FM1702_OK;
  1049. }
  1050. uchar MIF_Restore(uchar Block_Adr)
  1051. {
  1052. uchar temp, i;
  1053. SPIWrite(CRCPresetLSB,0x63);
  1054. SPIWrite(CWConductance,0x3f);
  1055. SPIWrite(ChannelRedundancy,0x07);
  1056. *RevBuffer = RF_CMD_RESTORE;
  1057. *(RevBuffer + 1) = Block_Adr;
  1058. temp = Command_Send(2, RevBuffer, Transceive);
  1059. if(temp == FALSE)
  1060. {
  1061. return FM1702_NOTAGERR;
  1062. }
  1063. temp = SPIRead(FIFO_Length);
  1064. if(temp == 0)
  1065. {
  1066. return FM1702_BYTECOUNTERR;
  1067. }
  1068. Read_FIFO(RevBuffer);
  1069. temp = *RevBuffer;
  1070. switch(temp)
  1071. {
  1072. case 0x00: /* break; */return(FM1702_NOTAUTHERR);
  1073. case 0x04: return(FM1702_EMPTY);
  1074. case 0x0a: break;
  1075. case 0x01: return(FM1702_CRCERR);
  1076. case 0x05: return(FM1702_PARITYERR);
  1077. default: return(FM1702_RESTERR);
  1078. }
  1079. for(i = 0; i < 4; i++) RevBuffer[i] = 0x00;
  1080. temp = Command_Send(4, RevBuffer, Transmit);
  1081. if(temp == FALSE)
  1082. {
  1083. return FM1702_RESTERR;
  1084. }
  1085. return FM1702_OK;
  1086. }
  1087. uchar MIF_Transfer(uchar Block_Adr)
  1088. {
  1089. uchar temp;
  1090. SPIWrite(CRCPresetLSB,0x63);
  1091. SPIWrite(CWConductance,0x3f);
  1092. SPIWrite(ChannelRedundancy,0x07);
  1093. RevBuffer[0] = RF_CMD_TRANSFER;
  1094. RevBuffer[1] = Block_Adr;
  1095. temp = Command_Send(2, RevBuffer, Transceive);
  1096. if(temp == FALSE)
  1097. {
  1098. return FM1702_NOTAGERR;
  1099. }
  1100. temp = SPIRead(FIFO_Length);
  1101. if(temp == 0)
  1102. {
  1103. return FM1702_BYTECOUNTERR;
  1104. }
  1105. Read_FIFO(RevBuffer);
  1106. temp = *RevBuffer;
  1107. switch(temp)
  1108. {
  1109. case 0x00: /* break; */return(FM1702_NOTAUTHERR);
  1110. case 0x04: return(FM1702_EMPTY);
  1111. case 0x0a: return(FM1702_OK);
  1112. case 0x01: return(FM1702_CRCERR);
  1113. case 0x05: return(FM1702_PARITYERR);
  1114. default: return(FM1702_TRANSERR);
  1115. }
  1116. }
  1117. #if 0
  1118. uchar HL_Active(uchar Block_Adr, uchar Mode)
  1119. {
  1120. uchar temp;
  1121. Secnr = Block_Adr / 4;
  1122. MIF_Halt(); /* Halt */
  1123. temp = Request(RF_CMD_REQUEST_STD);
  1124. if(temp != FM1702_OK)
  1125. {
  1126. return(FM1702_REQERR);
  1127. }
  1128. temp = AntiColl();
  1129. if(temp != FM1702_OK)
  1130. {
  1131. return(FM1702_ANTICOLLERR);
  1132. }
  1133. temp = Select_Card();
  1134. if(temp != FM1702_OK)
  1135. {
  1136. return(FM1702_SELERR);
  1137. }
  1138. Load_keyE2_CPY(Secnr, Mode); //%40
  1139. temp = Authentication(UID, Secnr, Mode);
  1140. if(temp != FM1702_OK)
  1141. {
  1142. return(FM1702_AUTHERR);
  1143. }
  1144. return FM1702_OK;
  1145. }
  1146. uchar MIF_Initival(uchar idata *buff, uchar Block_Adr)
  1147. {
  1148. uchar idata temp;
  1149. uchar i;
  1150. for(i = 0; i < 4; i++)
  1151. {
  1152. *(buff + 4 + i) = ~(*(buff + i));
  1153. }
  1154. for(i = 0; i < 4; i++)
  1155. {
  1156. *(buff + 8 + i) = *(buff + i);
  1157. }
  1158. *(buff + 12) = Block_Adr;
  1159. *(buff + 13) = ~Block_Adr;
  1160. *(buff + 14) = Block_Adr;
  1161. *(buff + 15) = ~Block_Adr;
  1162. temp = MIF_Write(buff, Block_Adr);
  1163. return temp;
  1164. }
  1165. #endif
  1166. #if 0
  1167. uchar HL_Read(uchar idata *buff, uchar Block_Adr, uchar Mode)
  1168. {
  1169. uchar temp;
  1170. temp = HL_Active(Block_Adr, Mode);
  1171. if(temp != FM1702_OK)
  1172. {
  1173. return temp;
  1174. }
  1175. temp = MIF_READ(buff, Block_Adr);
  1176. if(temp != FM1702_OK)
  1177. {
  1178. return temp;
  1179. }
  1180. return FM1702_OK;
  1181. }
  1182. uchar HL_Write(uchar idata *buff, uchar Block_Adr, uchar Mode)
  1183. {
  1184. uchar temp;
  1185. temp = HL_Active(Block_Adr, Mode);
  1186. if(temp != FM1702_OK)
  1187. {
  1188. return temp;
  1189. }
  1190. temp = MIF_Write(buff, Block_Adr);
  1191. if(temp != FM1702_OK)
  1192. {
  1193. return FM1702_WRITEERR;
  1194. }
  1195. return FM1702_OK;
  1196. }
  1197. #endif
  1198. ///////////////////////////////////////////////////////////////////////
  1199. // Delay 50us
  1200. ///////////////////////////////////////////////////////////////////////
  1201. ///////////////////////////////////////////////////////////////////////
  1202. // Delay 50us
  1203. ///////////////////////////////////////////////////////////////////////
  1204. void delay_50us(unsigned char _50us)
  1205. {
  1206.     while(_50us--)
  1207. {
  1208.     _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  1209.     _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  1210.     _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  1211.     _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  1212.     _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  1213.     _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  1214.     _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  1215.     _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  1216.     }
  1217. }
  1218. ///////////////////////////////////////////////////////////////////////
  1219. // Delay 10ms
  1220. ///////////////////////////////////////////////////////////////////////
  1221. void delay_10ms(unsigned int _10ms)
  1222. {
  1223. #ifndef NO_TIMER2
  1224.     RCAP2LH = RCAP2_10ms;
  1225.     T2LH    = RCAP2_10ms;
  1226.     
  1227.     TR2 = TRUE;
  1228.     while (_10ms--)
  1229.     {
  1230.     while (!TF2);
  1231.     TF2 = FALSE;
  1232.     }
  1233.     TR2 = FALSE;
  1234. #else
  1235.     while (_10ms--)
  1236.     {
  1237.     delay_50us(19);
  1238.     if (CmdValid)
  1239.         return;
  1240.     delay_50us(20);
  1241.     if (CmdValid)
  1242.         return;
  1243.     delay_50us(20);
  1244.     if (CmdValid)
  1245.         return;
  1246.     delay_50us(20);
  1247.     if (CmdValid)
  1248.         return;
  1249.     delay_50us(20);
  1250.     if (CmdValid )
  1251.         return;
  1252.     delay_50us(20);
  1253.     if (CmdValid)
  1254.         return;
  1255.     delay_50us(20);
  1256.     if (CmdValid)
  1257.         return;
  1258.     delay_50us(20);
  1259.     if (CmdValid)
  1260.         return;
  1261.     delay_50us(20);
  1262.     if (CmdValid)
  1263.         return;
  1264.     delay_50us(19);
  1265.     if (CmdValid)
  1266.         return;
  1267.     }
  1268. #endif
  1269. }