RFID(NFC) CLRC663非打仗读取芯片GD32/STM32 SPI读取 [复制链接]
发表于 2026-2-21 00:36:07 | 显示全部楼层 |阅读模式
根本先容

CLRC663 是高度集成的收发器芯片,用于 13.56 兆赫兹的非打仗式通讯。CLRC663 收发器芯片支
持下列操纵模式
• 读写模式支持 ISO/IEC 14443A/MIFARE
• 读写模式支持 SO/IEC 14443IB
• JIS X 6319-4 读写模式支持(等效于FeliCa1
方案,请参阅章节 21.5)
• 相应于 ISO/IEC 18092 的被动发起方模式
• 读写模式支持 ISO/IEC 15693
• 读写模式支持 ICODE EPC UID/EPC OTP
• 读写模式支持 ISO/IEC 18000-3 mode 3/ EPC Class-1 H
CLRC663 可以大概透过内建发射器直接驱动外置天线与 ISO/IEC 14443A 或 MIFARE 卡片举行通讯,而无
需附加有源电路。数字模块负责全部的 ISO/IEC 14443A 组帧和错误检测功能(奇偶校验和 CRC 循環
冗餘校驗)。
CLRC663支持MIFARE Classic 1K,MIFARE Classic 4K,MIFARE Ultralight,MIFARE Ultralight C,
MIFARE PLUS和 MIFARE DESFire产物。CLRC663支持MIFARE高达848k位元/秒的更高双向传输速
度。
CLRC663支持ISO/IEC 14443B第2和第3层的读写通讯方案,除了防碰撞(Anti-collision)功能。防碰
功能需在主机控制器的固件及更上层中实行。
CLRC663能举行FeliCa编码信号的解调息争码。FeliCa汲取器器件提供为FeliCa编码信号的解调息争码
电路。CLRC663处理处罚,如CRC的FeliCa的订定和错误检测。CLRC663支持FeliCa高达424k位元/秒的更
高速双向传输速率
芯片引脚如下

硬件毗连如下

硬件设置毗连

1供电VBAT和TVDD_INO给的3.3V
2 IFSEL1=1、IFSEL0=0
3 PD拉低
4PVDD高 TVDD高 VDD高
5IRQ拉低
6SPI按照尺度4线举行毗连
硬件毗连详解

供电要求
VDD(PVDD)的伏特必须与VDD一样或更低
IFSEL1=1、IFSEL0=0 告急是用来设置SPI通讯,该芯片支持I2C UART SPI通讯

IRQ是制止哀求,输出信号以表示制止事故,可以用来辨认触发,可以设置成外部触发,固然直接拉低倒霉用也可以
SPI毗连如图

步调代码

具体代码可以淘宝购买开辟板提供。大概csdn搜索资源下载
阿松大
main.c主步调
  1. #include <stdio.h>
  2. #include "stm32f10x.h"
  3. #include "RC663.h"
  4. void System_Init(void);
  5. int main()
  6. {
  7.         System_Init();
  8.        
  9.         RC663_Init();
  10.         printf("reset!!!!\n");
  11.         LED_1;
  12.         while(1)
  13.         {
  14.                 RC663_MifareClassic();        //ISO14443A
  15.                 RC663_ID2();        //ISO14443B
  16.                 RC663_Felica();        //
  17.                 RC663_ISO15693();
  18.                 delay_ms(100);
  19.         }
  20. }
  21. int fputc(int ch, FILE *f)
  22. {
  23.         USART_SendData(USART1, (uint8_t) ch);
  24.         while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  25.         return ch;
  26. }
  27. void System_Init(void)
  28. {
  29.         GPIO_InitTypeDef GPIO_InitStructure;
  30.         USART_InitTypeDef USART_InitStructure;
  31.        
  32.         RCC_HCLKConfig(RCC_SYSCLK_Div1);
  33.         RCC_PCLK1Config(RCC_HCLK_Div2);
  34.         RCC_PCLK2Config(RCC_HCLK_Div1);
  35.        
  36.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_USART1 | RCC_APB2Periph_AFIO, ENABLE);
  37.         RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2,  ENABLE );
  38.        
  39.         ////////////////////////////////////////////////////////////////////////////////UART1
  40.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  41.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  42.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  43.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  44.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  45.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  46.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  47.        
  48.         USART_InitStructure.USART_BaudRate = 115200;                 
  49.         USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  50.         USART_InitStructure.USART_StopBits = USART_StopBits_1;
  51.         USART_InitStructure.USART_Parity = USART_Parity_No;
  52.         USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  53.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  54.         USART_Init(USART1, &USART_InitStructure);
  55.         //USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);                        //Enable UART1 receive interrupt
  56.         USART_Cmd(USART1, ENABLE);
  57.         USART_ClearFlag(USART1, USART_FLAG_TC);
  58.        
  59.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  60.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;                                //flag pb10
  61.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  62.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  63.         FLAG_0;
  64.        
  65.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;                                //led pc13
  66.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  67.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  68.         LED_0;
  69.         delay_init(72);
  70. }
复制代码
RC663.h
  1. #ifndef __RC663_H
  2. #define __RC663_H
  3. #include "stm32f10x.h"
  4. #define UART_PRINT
  5. #define         RC663_NSS                 GPIO_Pin_12                                //PB12
  6. #define         RC663_NSS_0         GPIO_ResetBits(GPIOB,RC663_NSS)
  7. #define         RC663_NSS_1         GPIO_SetBits(GPIOB,RC663_NSS)
  8. #define         RC663_IRQ                 GPIO_Pin_11                        //PB11   
  9. #define         PDOWN                         GPIO_Pin_8                        //PA8
  10. #define         PDOWN_0                 GPIO_ResetBits(GPIOA,PDOWN)
  11. #define         PDOWN_1                 GPIO_SetBits(GPIOA,PDOWN)
  12. #define         FLAG_0                 GPIO_ResetBits(GPIOB,GPIO_Pin_10)
  13. #define         FLAG_1                 GPIO_SetBits(GPIOB,GPIO_Pin_10)
  14. #define         LED_0                 GPIO_ResetBits(GPIOC,GPIO_Pin_13)
  15. #define         LED_1                 GPIO_SetBits(GPIOC,GPIO_Pin_13)
  16. /////////////////////////////////////////////
  17. #define rRegCommand                                         0x00 // Starts and stops command execution
  18. #define rRegHostCtrl                                 0x01 // Host control register
  19. #define rRegFIFOControl                         0x02 // Control register of the FIFO
  20. #define rRegWaterLevel                         0x03 // Level of the FIFO underflow and overflow warning
  21. #define rRegFIFOLength                         0x04 // Length of the FIFO
  22. #define rRegFIFOData                                 0x05 // Data In/Out exchange register of FIFO buffer
  23. #define rRegIRQ0                                                 0x06 // Interrupt register 0
  24. #define rRegIRQ1                                                 0x07 // Interrupt register 1
  25. #define rRegIRQ0En                                         0x08 // Interrupt enable register 0
  26. #define rRegIRQ1En                                         0x09 // Interrupt enable register 1
  27. #define rRegError                                                 0x0A // Error bits showing the error status of the last command execution
  28. #define rRegStatus                                         0x0B // Contains status of the communication
  29. #define rRegRxBitCtrl                                 0x0C // Control register for anticollision adjustments for bit oriented protocols
  30. #define rRegRxColl                                         0x0D // Collision position register
  31. #define rRegTControl                                 0x0E // Control of Timer 0..3
  32. #define rRegT0Control                                 0x0F // Control of Timer0
  33. #define rRegT0ReloadHi                         0x10 // High register of the reload value of Timer0
  34. #define rRegT0ReloadLo                         0x11 // Low register of the reload value of Timer0
  35. #define rRegT0CounterValHi         0x12 // Counter value high register of Timer0
  36. #define rRegT0CounterValLo         0x13 // Counter value low register of Timer0
  37. #define rRegT1Control                                 0x14 // Control of Timer1
  38. #define rRegT1ReloadHi                         0x15 // High register of the reload value of Timer1
  39. #define rRegT1ReloadLo                         0x16 // Low register of the reload value of Timer1
  40. #define rRegT1CounterValHi         0x17 // Counter value high register of Timer1
  41. #define rRegT1CounterValLo         0x18 // Counter value low register of Timer1
  42. #define rRegT2Control                                 0x19 // Control of Timer2
  43. #define rRegT2ReloadHi                         0x1A // High byte of the reload value of Timer2
  44. #define rRegT2ReloadLo                         0x1B // Low byte of the reload value of Timer2
  45. #define rRegT2CounterValHi         0x1C // Counter value high byte of Timer2
  46. #define rRegT2CounterValLo         0x1D // Counter value low byte of Timer2
  47. #define rRegT3Control                                 0x1E // Control of Timer3
  48. #define rRegT3ReloadHi                         0x1F // High byte of the reload value of Timer3
  49. #define rRegT3ReloadLo                         0x20 // Low byte of the reload value of Timer3
  50. #define rRegT3CounterValHi         0x21 // Counter value high byte of Timer3
  51. #define rRegT3CounterValLo         0x22 // Counter value low byte of Timer3
  52. #define rRegT4Control                                 0x23 // Control of Timer4
  53. #define rRegT4ReloadHi                         0x24 // High byte of the reload value of Timer4
  54. #define rRegT4ReloadLo                         0x25 // Low byte of the reload value of Timer4
  55. #define rRegT4CounterValHi         0x26 // Counter value high byte of Timer4
  56. #define rRegT4CounterValLo         0x27 // Counter value low byte of Timer4
  57. #define rRegDrvMod                                         0x28 // Driver mode register
  58. #define rRegTxAmp                                                 0x29 // Transmitter amplifier register
  59. #define rRegDrvCon                                         0x2A // Driver configuration register
  60. #define rRegTxl                                                         0x2B // Transmitter register
  61. #define rRegTxCrcPreset                         0x2C // Transmitter CRC control register, preset value
  62. #define rRegRxCrcPreset                         0x2D // Receiver CRC control register, preset value
  63. #define rRegTxDataNum                                 0x2E // Transmitter data number register
  64. #define rRegTxModWidth                         0x2F // Transmitter modulation width register
  65. #define rRegTxSym10BurstLen         0x30 // Transmitter symbol 1 + symbol 0 burst length register
  66. #define rRegTXWaitCtrl                         0x31 // Transmitter wait control
  67. #define rRegTxWaitLo                                 0x32 // Transmitter wait low
  68. #define rRegFrameCon                                 0x33 // Transmitter frame control
  69. #define rRegRxSofD                                         0x34 // Receiver start of frame detection
  70. #define rRegRxCtrl                                         0x35 // Receiver control register
  71. #define rRegRxWait                                         0x36 // Receiver wait register
  72. #define rRegRxThreshold                         0x37 // Receiver threshold register
  73. #define rRegRcv                                                         0x38 // Receiver register
  74. #define rRegRxAna                                                 0x39 // Receiver analog register
  75. #define rRegRFU_3A                                                0x3A // -
  76. #define rRegSerialSpeed                         0x3B // Serial speed register
  77. #define rRegLFO_Trimm                                 0x3C // Low-power oscillator trimming register
  78. #define rRegPLL_Ctrl                                 0x3D // IntegerN PLL control register, for microcontroller clock output adjustment
  79. #define rRegPLL_DivOut                         0x3E // IntegerN PLL control register, for microcontroller clock output adjustment
  80. #define rRegLPCD_QMin                                 0x3F // Low-power card detection Q channel minimum threshold
  81. #define rRegLPCD_QMax                                 0x40 // Low-power card detection Q channel maximum threshold
  82. #define rRegLPCD_IMin                                 0x41 // Low-power card detection I channel minimum threshold
  83. #define rRegLPCD_I_Result                 0x42 // Low-power card detection I channel result register
  84. #define rRegLPCD_Q_Result                 0x43 // Low-power card detection Q channel result register
  85. #define rRegPadEn                                                 0x44 // PIN enable register
  86. #define rRegPadOut                                         0x45 // PIN out register
  87. #define rRegPadIn                                                 0x46 // PIN in register
  88. #define rRegSigOut                                         0x47 // Enables and controls the SIGOUT Pin
  89. #define rRegTxBitMod                                 0x48 // Transmitter bit mode register
  90. #define rRegRFU_49                                                0x49 // -
  91. #define rRegTxDataCon                                 0x4A // Transmitter data configuration register
  92. #define rRegTxDataMod                                 0x4B // Transmitter data modulation register
  93. #define rRegTxSymFreq                                 0x4C // Transmitter symbol frequency
  94. #define rRegTxSym0H                                         0x4D // Transmitter symbol 0 high register
  95. #define rRegTxSym0L                                         0x4E // Transmitter symbol 0 low register
  96. #define rRegTxSym1H                                         0x4F // Transmitter symbol 1 high register
  97. #define rRegTxSym1L                                         0x50 // Transmitter symbol 1 low register
  98. #define rRegTxSym2                                         0x51 // Transmitter symbol 2 register
  99. #define rRegTxSym3                                         0x52 // Transmitter symbol 3 register
  100. #define rRegTxSym10Len                         0x53 // Transmitter symbol 1 + symbol 0 length register
  101. #define rRegTxSym32Len                         0x54 // Transmitter symbol 3 + symbol 2 length register
  102. #define rRegTxSym10BurstCtrl 0x55 // Transmitter symbol 1 + symbol 0 burst control register
  103. #define rRegTxSym10Mod                         0x56 // Transmitter symbol 1 + symbol 0 modulation register
  104. #define rRegTxSym32Mod                         0x57 // Transmitter symbol 3 + symbol 2 modulation register
  105. #define rRegRxBitMod                                 0x58 // Receiver bit modulation register
  106. #define rRegRxEofSym                                 0x59 // Receiver end of frame symbol register
  107. #define rRegRxSyncValH                         0x5A // Receiver synchronisation value high register
  108. #define rRegRxSyncValL                         0x5B // Receiver synchronisation value low register
  109. #define rRegRxSyncMod                                 0x5C // Receiver synchronisation mode register
  110. #define rRegRxMod                                                 0x5D // Receiver modulation register
  111. #define rRegRxCorr                                         0x5E // Receiver correlation register
  112. #define rRegFabCal                                         0x5F // Calibration register of the receiver, calibration performed at production
  113. #define rReg_60                                                         0x60 //
  114. #define rReg_61                                                         0x61 //
  115. #define rReg_66                                                         0x66 //
  116. #define rReg_6A                                                         0x6A //
  117. #define rReg_6B                                                         0x6B //
  118. #define rReg_6C                                                         0x6C //
  119. #define rReg_6D                                                         0x6D //
  120. #define rReg_6E                                                         0x6E //
  121. #define rReg_6F                                                         0x6F //
  122. #define rRegVersion                                         0x7F // Version and subversion register
  123. //////////////////////////////////////////////////////////
  124. //                Command                         No. Parameter (bytes)         Short description
  125. #define RC663_Idle                                 0x00 //-                                         no action, cancels current command execution
  126. #define RC663_LPCD                                 0x01 //-                                         low-power card detection
  127. #define RC663_LoadKey                 0x02 //(keybyte1..6);                 reads a MIFARE key (size of 6 bytes) from FIFO buffer and puts it into Key buffer
  128. #define RC663_MFAuthent         0x03 //60h or 61h,(block address),(card serial number byte0..3)         performs the MIFARE standard authentication in MIFARE read/write mode only
  129. #define RC663_AckReq                         0x04 //-                                         performs a query, an Ack and a Req-Rn for ISO/IEC 18000-3 mode 3/ EPC Class-1 HF
  130. #define RC663_Receive                 0x05 //-                                         activates the receive circuit
  131. #define RC663_Transmit                 0x06 //-                                         transmits data from the FIFO buffer
  132. #define RC663_Transceive         0x07 //-                                         transmits data from the FIFO buffer and automatically activates the receiver after transmission finished
  133. #define RC663_WriteE2                 0x08 //addressH, addressL, data;         gets one byte from FIFO buffer and writes it to the internal EEPROM,
  134. #define RC663_WriteE2Page 0x09 //(page Address), data0, [data1..data63];         gets up to 64 bytes (one EEPROM page) from the FIFO buffer and writes it to the EEPROM
  135. #define RC663_ReadE2                         0x0A // address H, addressL,length;         reads data from the EEPROM and copies it into the FIFO buffer
  136. #define RC663_LoadReg                 0x0C //(EEPROM addressL), (EEPROM addressH), RegAdr, (number of Register to be copied);  reads data from the internal EEPROM and initializes the CLRC663 registers. EEPROM address needs to be within EEPROM sector 2
  137. #define RC663_LoadProtocol 0x0D //(Protocol number RX), (Protocol number TX);                reads data from the internal EEPROM and initializes the CLRC663 registers needed for a Protocol change
  138. #define RC663_LoadKeyE2         0x0E //KeyNr;                                 copies a key of the EEPROM into the key buffer
  139. #define RC663_StoreKeyE2         0x0F //KeyNr, byte1..6;        stores a MIFARE key (size of 6 bytes) into the EEPROM
  140. #define RC663_ReadRNR                 0x1C //-                                         Copies bytes from the Random Number generator into the FIFO until the FiFo is full
  141. #define RC663_Soft_Reset         0x1F //-                                         resets the CLRC663
  142. //////////////////////////////////////////////////////////
  143. void delay_init(u8 SYSCLK);
  144. void delay_us(u32);
  145. void delay_ms(u16);
  146. void RC663_Init(void);
  147. u8 RC663_ReadReg(u8);
  148. void RC663_WriteReg(u8, u8);
  149. s8 RC663_CMD_ReadE2(u16 addr,u8 len,u8 *pdat);
  150. s8 RC663_CMD_WriteE2(u16 addr,u8 dat);
  151. s8 RC663_CMD_LoadProtocol(u8 rx,u8 tx);
  152. s8 RC663_PcdConfigISOType(u8 type);
  153. void RC663_MifareClassic(void);
  154. void RC663_ID2(void);
  155. void RC663_Felica(void);
  156. void RC663_ISO15693(void);
  157. s8 RC663_Lpcd_Calib(u8 *pI,u8 *pQ);
  158. s8 RC663_Lpcd_Det(u8 ValueI,u8 ValueQ);
  159. #endif
复制代码
#include “RC663.h”
#include “nfc.h”
#include <stdio.h>
#include <string.h>
static u8 fac_us=0;
static u16 fac_ms=0;
//////////////////////////////////////////////////////////////////////////////delay
void delay_ns(u32 ns)
{
u32 i;
for(i=0;i<ns;i++)
{
__nop();
__nop();
__nop();
}
}
void delay_init(u8 SYSCLK) //unit:MHz
{
SysTick->CTRL &= 0xfffffffb;//select internal clk: HCLK/8
fac_us = SYSCLK/8;
fac_ms = (u16)fac_us*1000;
}
void delay_us(u32 Nus)
{
SysTick->LOAD=Nus*fac_us; //load time
SysTick->CTRL|=0x01; //start count
while(!(SysTick->CTRL&(1<<16)));//wait time out
SysTick->CTRL=0X00000000; //close counter
SysTick->VAL=0X00000000; //clear counter
}
void delay_ms(u16 nms) //nms <= 0xffffff8/SYSCLK; for 72M, Nms<=1864
{
SysTick->LOAD=(u32)nms
fac_ms;
SysTick->CTRL|=0x01;
while(!(SysTick->CTRL&(1<<16)));
SysTick->CTRL&=0XFFFFFFFE;
SysTick->VAL=0X00000000;
}
/////////////////////////////////////////////////////////////////////
void RC663_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
u8 temp;
  1. GPIO_InitStructure.GPIO_Pin = PDOWN;                                                 //PA8
  2. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
  3. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
  4. GPIO_Init(GPIOA, &GPIO_InitStructure);
  5. PDOWN_1;
  6. GPIO_InitStructure.GPIO_Pin = RC663_IRQ;                                          //PB11       
  7. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                  
  8. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  9. GPIO_Init(GPIOB, &GPIO_InitStructure);
  10. /* Enable AFIO clock */       
  11. /* Connect EXTI9 Line to PC.9 pin */
  12. GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);         //IRQ
  13. /* Configure EXTI6 line */
  14. EXTI_InitStructure.EXTI_Line = EXTI_Line11; // pb11
  15. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  16. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;          //falling edge of IRQ result interrupt
  17. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  18. EXTI_Init(&EXTI_InitStructure);
  19. NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  20. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
  21. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
  22. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  23. NVIC_Init(&NVIC_InitStructure);       
  24. //IFSEL0,IFSEL1:0 1
  25. //RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2,  ENABLE );
  26. GPIO_InitStructure.GPIO_Pin = RC663_NSS;                                
  27. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
  28. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
  29. GPIO_Init(GPIOB, &GPIO_InitStructure);                                         
  30. RC663_NSS_1;                                     
  31. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  32. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  33. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  34. GPIO_Init(GPIOB, &GPIO_InitStructure);
  35. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  
  36. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;               
  37. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;       
  38. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;               
  39. SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;       
  40. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;               
  41. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;//SPI_BaudRatePrescaler_64;       
  42. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;       
  43. SPI_InitStructure.SPI_CRCPolynomial = 7;       
  44. SPI_Init(SPI2, &SPI_InitStructure);  
  45. SPI_Cmd(SPI2, ENABLE);
  46. PDOWN_0;        //        ->RESET
  47. delay_ms(30);
  48. temp = RC663_ReadReg(rRegVersion);
复制代码
#ifdef UART_PRINT
printf(“version: %X\n”,temp);
#endif
}
//////////////////////////////////////////////
u8 RC663_SPIWriteByte(u8 Byte)
{
while((SPI2->SR&0X02)==0);
SPI2->DR=Byte;
while((SPI2->SR&0X01)==0);
return SPI2->DR;
}
/////////////////////////////////////////////////////////////////////
void RC663_WriteReg(u8 Address, u8 value)
{
RC663_NSS_0;
RC663_SPIWriteByte(Address<<1);
RC663_SPIWriteByte(value);
RC663_NSS_1;
delay_ns(10);
}
u8 RC663_ReadReg(u8 Address)
{
u8 ucResult=0;
RC663_NSS_0;
RC663_SPIWriteByte((Address<<1)|0x01);
ucResult = RC663_SPIWriteByte(0);
RC663_NSS_1;
delay_ns(10);
return ucResult;
}
void RC663_SetBitMask(u8 reg,u8 mask)
{
u8 tmp = RC663_ReadReg(reg);
RC663_WriteReg(reg,tmp | mask);
}
void RC663_ClearBitMask(u8 reg,u8 mask)
{
u8 tmp = RC663_ReadReg(reg);
RC663_WriteReg(reg, tmp & ~mask);
}
void RC663_SetRawRC(u8 reg,u8 mask,u8 set)
{
u8 temp = RC663_ReadReg(reg);
temp = (temp&mask)|set;
RC663_WriteReg(reg,temp);
}
///////////////////////////////////////////////////////////
void RC663_FlushFifo()
{
RC663_SetBitMask(rRegFIFOControl,0x10);
}
void RC663_FieldOn()
{
RC663_SetBitMask(rRegDrvMod,0x08);
}
void RC663_FieldOff()
{
RC663_ClearBitMask(rRegDrvMod,0x08);
}
void RC663_FieldReset()
{
RC663_FieldOff();
delay_ms(20);
RC663_FieldOn();
delay_ms(20);
}
extern u8 Status_INT;
u8 mode;
s8 RC663_Command_Int(struct TranSciveBuffer *pi)
{
u16 i;
u8 j,n;
RC663_WriteReg(rRegCommand,RC663_Idle);
RC663_SetBitMask(rRegFIFOControl,0x10); //FlushFifo
RC663_WriteReg(rRegIRQ0,0x7F);
RC663_WriteReg(rRegIRQ1,0x7F);
  1. for(n=0;n<pi->Length;n++)
  2.         RC663_WriteReg(rRegFIFOData, pi->Data[n]);
  3. if(pi->Command&0x80)
  4. {
  5.         RC663_WriteReg(rRegIRQ0En,0x90);               
  6.         if(mode)
  7.                 RC663_WriteReg(rRegIRQ1En,0xE0);               
  8.         else
  9.                 RC663_WriteReg(rRegIRQ1En,0xE8);               
  10.        
  11.         Status_INT=0;
  12.         RC663_WriteReg(rRegCommand, pi->Command);
  13.         while(Status_INT==0);                                //wait for IRQ
  14.         Status_INT=0;
  15.        
  16.         RC663_WriteReg(rRegIRQ0En,0x10);               
  17.         if(mode)
  18.                 RC663_WriteReg(rRegIRQ1En,0x20);               
  19.         else
  20.                 RC663_WriteReg(rRegIRQ1En,0x28);               
  21. }
  22. else
  23.         RC663_WriteReg(rRegCommand, pi->Command);
  24. for(i=2000;i>0;i--)
  25. {
  26.         n = RC663_ReadReg(rRegIRQ0);       
  27.         if(n&0x10) break;                //IDLEIRQ
  28. }
  29. if(i==0)
  30.         return MI_ERR;
  31. n = RC663_ReadReg(rRegFIFOLength);
  32. for(j=0;j<n;j++)
  33.         pi->Data[j]= RC663_ReadReg(rRegFIFOData);
  34. return MI_OK;
复制代码
}
s8 RC663_CMD_LoadProtocol(u8 rx,u8 tx)
{
struct TranSciveBuffer ComData;
  1. ComData.Command = RC663_LoadProtocol;
  2. ComData.Length = 2;
  3. ComData.Data[0] = rx;
  4. ComData.Data[1] = tx;
  5. return RC663_Command_Int(&ComData);
复制代码
}
s8 RC663_CMD_LoadKey(u8* pkey)
{
struct TranSciveBuffer ComData;
  1. ComData.Command = RC663_LoadKey;
  2. ComData.Length = 6;
  3. memcpy(ComData.Data,pkey,6);
  4. return RC663_Command_Int(&ComData);
复制代码
}
s8 RC663_CMD_MfcAuthenticate(u8 auth_mode,u8 block,u8 *pSnr)
{
s8 status;
u8 reg;
struct TranSciveBuffer ComData;
  1. ComData.Command = RC663_MFAuthent;
  2. ComData.Length = 6;
  3. ComData.Data[0] = auth_mode;
  4. ComData.Data[1] = block;
  5. memcpy(&ComData.Data[2],pSnr,4);
  6. status= RC663_Command_Int(&ComData);
  7. if(status==MI_OK)
  8. {
  9.         reg = RC663_ReadReg(rRegStatus);
  10.         if(!(reg&0x20))
  11.                 status=MI_AUTHERR;
  12. }
  13. return status;
复制代码
}
s8 RC663_PcdConfigISOType(u8 type)
{
// u8 temp;
RC663_WriteReg(rRegT0Control,0x98); //Starts at the end of Tx. Stops after Rx of first data. Auto-reloaded. 13.56 MHz input clock.
RC663_WriteReg(rRegT1Control,0x92); //Starts at the end of Tx. Stops after Rx of first data. Input clock - cascaded with Timer-0.
RC663_WriteReg(rRegT2Control,0x20); //Timer used for LFO trimming
RC663_WriteReg(rRegT2ReloadHi,0x03); //
RC663_WriteReg(rRegT2ReloadLo,0xFF); //
RC663_WriteReg(rRegT3Control,0x00); //Not started automatically. Not reloaded. Input clock 13.56 MHz
if(type==‘A’)
{
RC663_WriteReg(rRegWaterLevel,0x10); //Set WaterLevel =(FIFO length -1)
  1.         RC663_WriteReg(rRegRxBitCtrl,0x80);        //Received bit after collision are replaced with 1.
  2.         RC663_WriteReg(rRegDrvMod,0x80);        //Tx2Inv=1
  3.         RC663_WriteReg(rRegTxAmp,0xC0);        // 0x00
  4.         RC663_WriteReg(rRegDrvCon,0x09);        //01
  5.         RC663_WriteReg(rRegTxl,0x05);        //
  6.         RC663_WriteReg(rRegRxSofD,0x00);        //
  7.        
  8.         RC663_CMD_LoadProtocol(0,0);
  9.         // Disable Irq 0,1 sources
  10.         RC663_WriteReg(rRegIRQ0En,0);
  11.         RC663_WriteReg(rRegIRQ1En,0);
  12.        
  13.         RC663_WriteReg(rRegFIFOControl,0xB0);
  14.         RC663_WriteReg(rRegTxModWidth,0x20); // Length of the pulse modulation in carrier clks+1  
  15.         RC663_WriteReg(rRegTxSym10BurstLen,0); // Symbol 1 and 0 burst lengths = 8 bits.
  16.         RC663_WriteReg(rRegFrameCon,0xCF); // Start symbol=Symbol2, Stop symbol=Symbol3
  17.        
  18.         RC663_WriteReg(rRegRxCtrl,0x04); // Set Rx Baudrate 106 kBaud
  19.         RC663_WriteReg(rRegRxThreshold,0x55); // Set min-levels for Rx and phase shift  //32
  20.         RC663_WriteReg(rRegRcv,0x12);        //
  21.         RC663_WriteReg(rRegRxAna,0x0A); //0
  22.        
  23.         RC663_WriteReg(rRegDrvMod,0x81);
  24.         //> MIFARE Crypto1 state is further disabled.
  25.         RC663_WriteReg(rRegStatus,0);
  26.         //>  FieldOn
  27.         RC663_WriteReg(rRegDrvMod,0x89);
  28. }
  29. else if(type=='B')
  30. {
  31.         RC663_WriteReg(rRegWaterLevel,0x10);        //Set WaterLevel =(FIFO length -1)
  32.                                                                          
  33.         RC663_WriteReg(rRegRxBitCtrl,0x80);        //Received bit after collision are replaced with 1.
  34.         RC663_WriteReg(rRegDrvMod,0x8F);        //Tx2Inv=1
  35.         RC663_WriteReg(rRegTxAmp,0x0C);        // 0xCC       
  36.         RC663_WriteReg(rRegDrvCon,0x01);       
  37.         RC663_WriteReg(rRegTxl,0x05);       
  38.         RC663_WriteReg(rRegRxSofD,0x00);       
  39.        
  40.         RC663_CMD_LoadProtocol(4,4);
  41.         // Disable Irq 0,1 sources
  42.         RC663_WriteReg(rRegIRQ0En,0);
  43.         RC663_WriteReg(rRegIRQ1En,0);
  44.        
  45.         RC663_WriteReg(rRegFIFOControl,0xB0);
  46.         RC663_WriteReg(rRegTxModWidth,0x0A); // Length of the pulse modulation in carrier clks+1  
  47.         RC663_WriteReg(rRegTxSym10BurstLen,0); // Symbol 1 and 0 burst lengths = 8 bits.
  48.         RC663_WriteReg(rRegTXWaitCtrl,1);       
  49.         RC663_WriteReg(rRegFrameCon,0x05);
  50.         RC663_WriteReg(rRegRxSofD,0xB2);
  51.        
  52.         RC663_WriteReg(rRegRxCtrl,0x34); // Set Rx Baudrate 106 kBaud
  53.         RC663_WriteReg(rRegRxThreshold,0x9F); // Set min-levels for Rx and phase shift  0x7F
  54.         RC663_WriteReg(rRegRcv,0x12);
  55.         RC663_WriteReg(rRegRxAna,0x0a); //0x0a 0X0e
  56.        
  57.         RC663_WriteReg(rRegDrvMod,0x87);
  58.         RC663_WriteReg(rRegStatus,0);
  59.         //>  FieldOn
  60.         RC663_WriteReg(rRegDrvMod,0x8F);
  61. }
  62. else if(type=='F')
  63. {
  64.         RC663_WriteReg(rRegWaterLevel,0x10);        //Set WaterLevel =(FIFO length -1)
  65.                                                                          
  66.         RC663_WriteReg(rRegRxBitCtrl,0x80);        //Received bit after collision are replaced with 1.
  67.         RC663_WriteReg(rRegDrvMod,0x88);        //Tx2Inv=1
  68.         RC663_WriteReg(rRegTxAmp,0x04);        //
  69.         RC663_WriteReg(rRegDrvCon,0x01);        //
  70.         RC663_WriteReg(rRegTxl,0x05);        //
  71.         RC663_WriteReg(rRegRxSofD,0x00);        //
  72.        
  73.         RC663_CMD_LoadProtocol(8,8);
  74.         // Disable Irq 0,1 sources
  75.         RC663_WriteReg(rRegIRQ0En,0);
  76.         RC663_WriteReg(rRegIRQ1En,0);
  77.        
  78.         RC663_WriteReg(rRegFIFOControl,0xB0);
  79.        
  80.         RC663_WriteReg(rRegTxModWidth,0x00); // Length of the pulse modulation in carrier clks+1  
  81.         RC663_WriteReg(rRegTxSym10BurstLen,0x03); // Symbol 1 and 0 burst lengths = 8 bits.
  82.         //RC663_WriteReg(rRegTXWaitCtrl,0xC0);       
  83.         //RC663_WriteReg(rRegTxWaitLo,0);
  84.         RC663_WriteReg(rRegFrameCon,0x01);
  85.        
  86.         //RC663_WriteReg(rRegRxSofD,0xB2);
  87.        
  88.         RC663_WriteReg(rRegRxCtrl,0x05); // Set Rx Baudrate 212 kBaud
  89.         RC663_WriteReg(rRegRxThreshold,0x5C); // Set min-levels for Rx and phase shift  0x3C
  90.         RC663_WriteReg(rRegRcv,0x12);
  91.         RC663_WriteReg(rRegRxAna,0x02); //0xa  initial value 0x02
  92.        
  93.         RC663_WriteReg(rRegRxWait,0x86);
  94.        
  95.         RC663_WriteReg(rRegDrvMod,0x87);
  96.         RC663_WriteReg(rRegStatus,0);
  97.         //>  FieldOn
  98.         RC663_WriteReg(rRegDrvMod,0x8F);
  99. }
  100. else if(type=='V')
  101. {
  102.         RC663_WriteReg(rRegWaterLevel,0x10);        //Set WaterLevel =(FIFO length -1)
  103.                                                                          
  104.         RC663_WriteReg(rRegRxBitCtrl,0x80);        //Received bit after collision are replaced with 1.
  105.         RC663_WriteReg(rRegDrvMod,0x89);        //Tx2Inv=1 0x80
  106.         RC663_WriteReg(rRegTxAmp,0x10);        //0        //0x04
  107.         RC663_WriteReg(rRegDrvCon,0x09);        //0x01
  108.         RC663_WriteReg(rRegTxl,0x0A);        //0x05
  109.         RC663_WriteReg(rRegRxSofD,0x00);        //
  110.        
  111.         RC663_CMD_LoadProtocol(0x0A,0x0A);
  112.         // Disable Irq 0,1 sources
  113.         RC663_WriteReg(rRegIRQ0En,0);
  114.         RC663_WriteReg(rRegIRQ1En,0);
  115.        
  116.         RC663_WriteReg(rRegFIFOControl,0xB0);
  117.        
  118.         RC663_WriteReg(rRegTxModWidth,0x00); // Length of the pulse modulation in carrier clks+1  
  119.         RC663_WriteReg(rRegTxSym10BurstLen,0); // Symbol 1 and 0 burst lengths = 8 bits.
  120.         //RC663_WriteReg(rRegTXWaitCtrl,0xC0);        //0x88
  121.         //RC663_WriteReg(rRegTxWaitLo,0);        //0xa9
  122.         RC663_WriteReg(rRegFrameCon,0x0F);
  123.        
  124.         //RC663_WriteReg(rRegRxSofD,0xB2);
  125.        
  126.         RC663_WriteReg(rRegRxCtrl,0x02); // Set Rx Baudrate 26 kBaud
  127.         RC663_WriteReg(rRegRxThreshold,0x74); // Set min-levels for Rx and phase shift  
  128.         RC663_WriteReg(rRegRcv,0x12);
  129.         RC663_WriteReg(rRegRxAna,0x07);
  130.        
  131.         RC663_WriteReg(rRegRxWait,0x9C);       
  132.        
  133.         RC663_WriteReg(rRegDrvMod,0x81);
  134.         RC663_WriteReg(rRegStatus,0);
  135.         //>  FieldOn
  136.         RC663_WriteReg(rRegDrvMod,0x89);
  137. }
  138. return MI_OK;
复制代码
}
s8 RC663_PcdComTransceive(struct TranSciveBuffer *pi)
{
s8 status= MI_ERR;
u16 i;
u8 reg1,temp,lastBits; //reg0,
u8 errReg;
// Terminate any running command.
RC663_WriteReg(rRegCommand,RC663_Idle); // 0x00 // Starts and stops command execution
RC663_SetBitMask(rRegFIFOControl,0x10); //Flush_FiFo 0x02 // Control register of the FIFO
// Clear all IRQ 0,1 flags
RC663_WriteReg(rRegIRQ0,0x7F);
RC663_WriteReg(rRegIRQ1,0x7F);
  1. for(i=0;i<pi->Length;i++)
  2.         RC663_WriteReg(rRegFIFOData,pi->Data[i]);           //  0x05 // Data In/Out exchange register of FIFO buffer
  3. // Idle interrupt(Command terminated), RC663_BIT_IDLEIRQ=0x10
  4. RC663_WriteReg(rRegIRQ0En,0x18);        //IdleIRQEn,TxIRQEn
  5. RC663_WriteReg(rRegIRQ1En,0x42);        //Global IRQ,Timer1IRQEn
  6. //>  Start RC663 command "Transcieve"=0x07. Activate Rx after Tx finishes.
  7. RC663_WriteReg(rRegCommand,RC663_Transceive);
  8. do       
复制代码
{
reg1 = RC663_ReadReg(rRegIRQ1); //07h //wait for TxIRQ
}while((reg1&0x40)==0); //GlobalIRQ
  1. RC663_WriteReg(rRegIRQ0En,0x54);        //HiAlertIRQEN,IdleIRQEn,RxIRQEn
  2. RC663_WriteReg(rRegIRQ1En,0x42);        //Global IRQ,Timer1IRQEn
  3. for(i=8000;i>0;i--)
  4. {
  5.         reg1 = RC663_ReadReg(rRegIRQ1);          //07h  //wait for RxIRQ
  6.         if(reg1&0x40) break;        //GlobalIRQ
  7. }
  8. RC663_WriteReg(rRegIRQ0En,0);               
  9. RC663_WriteReg(rRegIRQ1En,0);
  10. errReg = RC663_ReadReg(rRegError);
  11. if(i==0)
  12.         status = MI_QUIT;
  13. else if(reg1&0x02)                //Timer1IRQ
  14.         status = MI_NOTAGERR;
  15. else if( errReg)          //0Bh
  16. {
  17.         if(errReg&0x04)
  18.                 status = MI_COLLERR;
  19.         else if(errReg&0x01)
  20.                 status = MI_FRAMINGERR;
  21.         else
  22.                 status = MI_ERR;
  23. }
  24. else
  25. {
  26.         status = MI_OK;
  27.         if (pi->Command == RC663_Transceive)
  28.         {
  29.                         temp = RC663_ReadReg(rRegFIFOLength);                 //04h
  30.                         lastBits = RC663_ReadReg(rRegRxBitCtrl) & 0x07;         //0ch
  31.                         if (lastBits)
  32.                                 pi->Length = (temp-1)*8 + lastBits;
  33.                         else
  34.                                 pi->Length = temp*8;
  35.                         if (temp == 0)        temp = 1;
  36.                         if (temp > 250) temp = 250; //maxlen ...
  37.                         for (i=0; i<temp; i++)
  38.                                 pi->Data[i] = RC663_ReadReg(rRegFIFOData);  //05h
  39.         }
  40. }
  41. return status;
复制代码
}
s8 RC663_PcdHaltA(void)
{
s8 status;
struct TranSciveBuffer ComData,*pi= &ComData;
  1. ComData.Command = RC663_Transceive;
  2. ComData.Length  = 2;
  3. ComData.Data[0] = PICC_HALT;
  4. ComData.Data[1] = 0;
  5. status = RC663_PcdComTransceive(pi);
  6. if(status == MI_NOTAGERR)                //halt command has no response
  7.         status = MI_OK;
  8. else
  9.         status = MI_ERR;
  10. return status;
复制代码
}
s8 RC663_PcdRequestA(u8 req_code,u8 *pTagType)
{
s8 status;
struct TranSciveBuffer ComData,*pi= &ComData;
  1. RC663_WriteReg(rRegTxCrcPreset,0x18);  //0x2C Transmitter CRC control register, preset value
  2. RC663_WriteReg(rRegRxCrcPreset,0x18);
  3. RC663_WriteReg(rRegStatus,0);           //  0x0B  Contains status of the communication
  4. RC663_WriteReg(rRegTXWaitCtrl,0xC0);        //0x31  TxWaitStart at the end of Rx data
  5. RC663_WriteReg(rRegTxWaitLo,0x0B);        // 0x32   Set min.time between Rx and Tx or between two Tx   
  6. // Set timeout for this command cmd. Init reload values for timers-0,1
  7. RC663_WriteReg(rRegT0ReloadHi,0x08);         //2196/fc        0x10 // High register of the reload value of Timer0
  8. RC663_WriteReg(rRegT0ReloadLo,0x94);            //0x11 // Low register of the reload value of Timer0
  9. RC663_WriteReg(rRegT1ReloadHi,0);                     //0x15 // High register of the reload value of Timer1
  10. RC663_WriteReg(rRegT1ReloadLo,0x40);        //timerout ~= 10ms              0x16 // Low register of the reload value of Timer1
  11. RC663_WriteReg(rRegIRQ0,0x08);                          //        0x06 // Interrupt register 0
  12. RC663_WriteReg(rRegRxWait,0x90);                            //0x36 // Receiver wait register
  13. RC663_WriteReg(rRegTxDataNum,0x0F);  //7bit                      0x2E // Transmitter data number register
  14. //> Send the ReqA command
  15. ComData.Command = RC663_Transceive;           //0x07 //- transmits data from the FIFO buffer and automatically activates the receiver after transmission finished
  16. ComData.Length  = 1;
  17. ComData.Data[0] = req_code;
  18. FLAG_1;
  19. status = RC663_PcdComTransceive(pi);
  20. FLAG_0;
  21. if (status == MI_OK)
  22. {
  23.         if(ComData.Length == 0x10)
  24.         {
  25.                 *pTagType     = ComData.Data[0];
  26.                 *(pTagType+1) = ComData.Data[1];
  27.         }
  28.         else
  29.                 status = MI_VALERR;
  30. }
  31. //RC663_WriteReg(rRegTxDataNum,0x08);
  32. return status;
复制代码
}
s8 RC663_PcdAnticoll(u8 *pSnr)
{
s8 status ;
u8 i;
u8 ucBits,ucBytes;
u8 snr_check = 0;
u8 ucCollPosition = 0;
u8 ucTemp;
u8 ucSNR[5] = {0, 0, 0, 0 ,0};
struct TranSciveBuffer ComData,*pi = &ComData;
  1.         RC663_WriteReg(rRegTxDataNum,0x08);
  2. do
  3. {
  4.                 ucBits = (ucCollPosition) % 8;
  5.                 if (ucBits != 0)
  6.                 {
  7.                     ucBytes = ucCollPosition / 8 + 1;
  8.                                 RC663_SetRawRC(rRegRxBitCtrl, 0x8f,ucBits<<4);
  9.                                 RC663_SetRawRC(rRegTxDataNum, 0xf8,ucBits);
  10.                 }
  11.                 else
  12.                      ucBytes = ucCollPosition / 8;
  13.                 ComData.Command = RC663_Transceive;
  14.                 ComData.Data[0] = PICC_ANTICOLL1;
  15.                 ComData.Data[1] = 0x20 + ((ucCollPosition / 8) << 4) + (ucBits & 0x0F);
  16.                 for (i=0; i<ucBytes; i++)
  17.                   ComData.Data[i + 2] = ucSNR[i];
  18.                 ComData.Length = ucBytes + 2;
  19.     status = RC663_PcdComTransceive(pi);
  20.     ucTemp = ucSNR[(ucCollPosition / 8)];
  21.                 if (status == MI_COLLERR)
  22.                 {
  23.                   for (i=0; i < 5 - (ucCollPosition / 8); i++)
  24.                      ucSNR[i + (ucCollPosition / 8)] = ComData.Data[i+1];
  25.                   ucSNR[(ucCollPosition / 8)] |= ucTemp;
  26.                   ucCollPosition = ComData.Data[0];
  27.                 }
  28.                 else if (status == MI_OK)
  29.                 {
  30.             for (i=0; i < (ComData.Length / 8); i++)
  31.                ucSNR[4 - i] = ComData.Data[ComData.Length/8 - i - 1];
  32.             ucSNR[(ucCollPosition / 8)] |= ucTemp;
  33.                 }
  34. } while (status == MI_COLLERR);
  35.                
  36. if (status == MI_OK)
  37. {
  38.          for (i=0; i<4; i++)
  39.    {   
  40.      *(pSnr+i)  = ucSNR[i];
  41.      snr_check ^= ucSNR[i];
  42.    }
  43.    if (snr_check != ucSNR[i])
  44.            status = MI_COM_ERR;
  45. }
  46. return status;
复制代码
}
s8 RC663_PcdSelect(u8 *pSnr,u8 *pSize)
{
s8 status;
u8 i,snr_check = 0;
struct TranSciveBuffer ComData,*pi = &ComData;
  1. RC663_SetRawRC(rRegTxCrcPreset,0xfe,0x01);        //On
  2. RC663_SetRawRC(rRegRxCrcPreset,0xfe,0x01);        //On
  3. ComData.Command = RC663_Transceive;
  4. ComData.Length  = 7;
  5. ComData.Data[0] = PICC_ANTICOLL1;
  6. ComData.Data[1] = 0x70;
  7. for (i=0; i<4; i++)
  8. {
  9.         snr_check ^= *(pSnr+i);
  10.         ComData.Data[i+2] = *(pSnr+i);
  11. }
  12. ComData.Data[6] = snr_check;
  13. status = RC663_PcdComTransceive(pi);
  14. if (status == MI_OK)
  15. {
  16. if (ComData.Length != 0x8)
  17.         status = MI_BITCOUNTERR;
  18. else
  19.         *pSize = ComData.Data[0];
  20. }
  21. return status;
复制代码
}
s8 RC663_PcdRead(u8 addr,u8 *pReaddata)
{
s8 status;
struct TranSciveBuffer ComData,*pi = &ComData;
  1. RC663_SetRawRC(rRegTxCrcPreset,0xfe,0x01);        //on
  2. RC663_SetRawRC(rRegRxCrcPreset,0xfe,0x00);        //off
复制代码
ComData.Command = RC663_Transceive;
ComData.Length = 2;
ComData.Data[0] = PICC_READ;
ComData.Data[1] = addr;
  1. status = RC663_PcdComTransceive(pi);
复制代码
if (status == MI_OK)
{
if (ComData.Length != 0x90)
status = MI_BITCOUNTERR;
else
memcpy(pReaddata, &ComData.Data[0], 16);
}
return status;
}
s8 RC663_PcdWrite(u8 addr,u8 *pWritedata)
{
s8 status;
struct TranSciveBuffer ComData,*pi = &ComData;
  1. ComData.Command = RC663_Transceive;ComData.Length  = 2;ComData.Data[0] = PICC_WRITE;ComData.Data[1] = addr;status = RC663_PcdComTransceive(pi);
  2. if (status != MI_NOTAGERR){                if(ComData.Length != 4)                        status=MI_BITCOUNTERR;                else                {                         ComData.Data[0] &= 0x0F;                         switch (ComData.Data[0])                         {                                        case 0x00:                                                 status = MI_NOTAUTHERR;                                                 break;                                        case 0x0A:                                                 status = MI_OK;                                                 break;                                        default:                                                 status = MI_CODEERR;                                                 break;                         }                }}    if (status == MI_OK){                ComData.Command = RC663_Transceive;                ComData.Length  = 16;                memcpy(&ComData.Data[0], pWritedata, 16);                                status = RC663_PcdComTransceive(pi);
  3.                 if (status != MI_NOTAGERR)                {                                ComData.Data[0] &= 0x0F;                                switch(ComData.Data[0])                                {                                         case 0x00:                                                        status = MI_WRITEERR;                                                        break;                                         case 0x0A:                                                        status = MI_OK;                                                        break;                                         default:                                                        status = MI_CODEERR;                                                        break;                         }                }}return status;
复制代码
}
void RC663_MifareClassic(void)
{
s8 status;
u8 i;
u8 M1_Data[7],RD_Data[16]; //CT:2 SN:4 SAK:1
static u8 KEY[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};
  1. RC663_PcdConfigISOType('A');
  2. //delay_ms(10);
  3. ///////////////////////////////////mifare S50       
  4. status = RC663_PcdRequestA(PICC_REQALL,M1_Data);
复制代码
#ifdef UART_PRINT
printf(“ATQA: %d_”,status);
if(status==MI_OK)
printf(" %02X %02X",M1_Data[1],M1_Data[0]);
printf(“\n”);
#endif
if(status!=MI_OK) return;
  1. status = RC663_PcdAnticoll(&M1_Data[2]);
复制代码
#ifdef UART_PRINT
printf(“UID: %d_”,status);
if(status==MI_OK)
printf(“%02X %02X %02X %02X”,M1_Data[2],M1_Data[3],M1_Data[4],M1_Data[5]);
printf(“\n”);
#endif
if(status!=MI_OK) return;
  1. status = RC663_PcdSelect(&M1_Data[2],&M1_Data[6]);
复制代码
#ifdef UART_PRINT
printf(“SELECT: %d_”,status);
if(status==MI_OK)
printf(“%02X”,M1_Data[6]);
printf(“\n”);
#endif
if(status!=MI_OK) return;
  1. status = RC663_CMD_LoadKey(KEY);
复制代码
#ifdef UART_PRINT
printf(“LoadKey: %d\n”,status);
#endif
if(status!=MI_OK) return;
status = RC663_CMD_MfcAuthenticate(0x60,0,&M1_Data[2]);
#ifdef UART_PRINT
printf(“Auth: %d\n”,status);
#endif
if(status!=MI_OK) return;
  1. status=RC663_PcdRead(1,RD_Data);
复制代码
#ifdef UART_PRINT
printf(“READ:%d_”,status);
for(i=0;i<16;i++)
printf(" %02X",RD_Data);
printf(“\n”);
#endif
if(status!=MI_OK) return;
/RD_Data[15]++;
status=RC663_PcdWrite(1,RD_Data);
#ifdef UART_PRINT
printf(“Write:%d --\n”,status);
#endif
if(status!=MI_OK) return;
status=RC663_PcdRead(1,RD_Data);

#ifdef UART_PRINT
printf(“READ:%d --”,status);
for(i=0;i<16;i++)
printf(" %2X “,RD_Data);
printf(”\n");
//printf(“Please remove card!\n”);
#endif
/
//if(status!=MI_OK) return;
do
{
RC663_FieldOff();
delay_ms(10);
RC663_FieldOn();
//status = RC663_PcdHaltA();
LED_1;
delay_ms(10);
status = RC663_PcdRequestA(PICC_REQALL,M1_Data);
if(statusMI_OK)
{
LED_0;
}
else
break;
}while(statusMI_OK);
}
  1. [/code] [size=4]代码表明[/size]
  2. 起首先必要设置SPI的根本通讯,根本通讯参考STM32/GD32通例通讯即可
  3. 必要设置GPIO
  4. 1管脚
  5. 2SPI接口
  6. 3模式0大概模式3
  7. 可以设置外部触发,不外我没有设置,不影响通讯
  8. [code]void RC663_Init(void)
  9. {
  10.         GPIO_InitTypeDef GPIO_InitStructure;
  11.         SPI_InitTypeDef  SPI_InitStructure;
  12.         EXTI_InitTypeDef   EXTI_InitStructure;
  13.         NVIC_InitTypeDef NVIC_InitStructure;
  14.         u8 temp;
  15.         GPIO_InitStructure.GPIO_Pin = PDOWN;                                                 //PA8
  16.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
  17.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
  18.         GPIO_Init(GPIOA, &GPIO_InitStructure);
  19.         PDOWN_1;
  20.        
  21.         GPIO_InitStructure.GPIO_Pin = RC663_IRQ;                                          //PB11       
  22.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;                  
  23.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  24.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  25.        
  26.         /* Enable AFIO clock */       
  27.         /* Connect EXTI9 Line to PC.9 pin */
  28.         GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);         //IRQ
  29.         /* Configure EXTI6 line */
  30.         EXTI_InitStructure.EXTI_Line = EXTI_Line11; // pb11
  31.         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  32.         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;          //falling edge of IRQ result interrupt
  33.         EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  34.         EXTI_Init(&EXTI_InitStructure);
  35.         NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
  36.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
  37.         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
  38.         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  39.         NVIC_Init(&NVIC_InitStructure);       
  40.        
  41.         //IFSEL0,IFSEL1:0 1
  42.         //RCC_APB1PeriphClockCmd(        RCC_APB1Periph_SPI2,  ENABLE );
  43.         GPIO_InitStructure.GPIO_Pin = RC663_NSS;                                
  44.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  
  45.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;               
  46.         GPIO_Init(GPIOB, &GPIO_InitStructure);                                         
  47.         RC663_NSS_1;                                     
  48.        
  49.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  50.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  51.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  52.         GPIO_Init(GPIOB, &GPIO_InitStructure);
  53.        
  54.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  
  55.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;               
  56.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;       
  57.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;               
  58.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;       
  59.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;               
  60.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;//SPI_BaudRatePrescaler_64;       
  61.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;       
  62.         SPI_InitStructure.SPI_CRCPolynomial = 7;       
  63.         SPI_Init(SPI2, &SPI_InitStructure);  
  64.         SPI_Cmd(SPI2, ENABLE);
  65.         PDOWN_0;        //        ->RESET
  66.         delay_ms(30);
  67.         temp = RC663_ReadReg(rRegVersion);
  68. #ifdef UART_PRINT
  69.         printf("version: %X\n",temp);
  70. #endif
  71. }
复制代码
然后就是设置SPI发送和汲取函数
  1. u8 RC663_SPIWriteByte(u8 Byte)
  2. {
  3.         while((SPI2->SR&0X02)==0);                 
  4.         SPI2->DR=Byte;                            
  5.         while((SPI2->SR&0X01)==0);     
  6.         return SPI2->DR;                  
  7. }
复制代码
然后设置写寄存器和读寄存器,包罗寄存器位设置
  1. void RC663_WriteReg(u8   Address, u8   value)
  2. {  
  3.         RC663_NSS_0;
  4.         RC663_SPIWriteByte(Address<<1);
  5.         RC663_SPIWriteByte(value);
  6.         RC663_NSS_1;
  7.         delay_ns(10);
  8. }
  9. u8 RC663_ReadReg(u8   Address)
  10. {
  11.         u8  ucResult=0;
  12.         RC663_NSS_0;
  13.         RC663_SPIWriteByte((Address<<1)|0x01);
  14.         ucResult = RC663_SPIWriteByte(0);
  15.         RC663_NSS_1;
  16.         delay_ns(10);
  17.         return ucResult;
  18. }
  19. void RC663_SetBitMask(u8   reg,u8   mask)  
  20. {
  21.     u8  tmp = RC663_ReadReg(reg);
  22.     RC663_WriteReg(reg,tmp | mask);  
  23. }
  24. void RC663_ClearBitMask(u8   reg,u8   mask)  
  25. {
  26.     u8  tmp = RC663_ReadReg(reg);
  27.     RC663_WriteReg(reg, tmp & ~mask);  
  28. }
  29. void RC663_SetRawRC(u8   reg,u8 mask,u8 set)
  30. {
  31.         u8 temp = RC663_ReadReg(reg);
  32.         temp = (temp&mask)|set;
  33.         RC663_WriteReg(reg,temp);
  34. }
复制代码
然后就是设置CLRC663的SPI寄存器初始化
请注意,由于13.56mhz通讯协议包罗ISO14443A
ISO14443B 大概ISO15693 ,这几种的设置如下
  1. s8 RC663_PcdConfigISOType(u8 type)
  2. {
  3. //        u8 temp;
  4.         RC663_WriteReg(rRegT0Control,0x98); //Starts at the end of Tx. Stops after Rx of first data. Auto-reloaded. 13.56 MHz input clock.
  5.         RC663_WriteReg(rRegT1Control,0x92); //Starts at the end of Tx. Stops after Rx of first data. Input clock - cascaded with Timer-0.
  6.         RC663_WriteReg(rRegT2Control,0x20); //Timer used for LFO trimming
  7.         RC663_WriteReg(rRegT2ReloadHi,0x03);        //
  8.         RC663_WriteReg(rRegT2ReloadLo,0xFF);        //
  9.         RC663_WriteReg(rRegT3Control,0x00);        //Not started automatically. Not reloaded. Input clock 13.56 MHz       
  10.         if(type=='A')
  11.         {
  12.                 RC663_WriteReg(rRegWaterLevel,0x10);        //Set WaterLevel =(FIFO length -1)
  13.                                                                                  
  14.                 RC663_WriteReg(rRegRxBitCtrl,0x80);        //Received bit after collision are replaced with 1.
  15.                 RC663_WriteReg(rRegDrvMod,0x80);        //Tx2Inv=1
  16.                 RC663_WriteReg(rRegTxAmp,0xC0);        // 0x00
  17.                 RC663_WriteReg(rRegDrvCon,0x09);        //01
  18.                 RC663_WriteReg(rRegTxl,0x05);        //
  19.                 RC663_WriteReg(rRegRxSofD,0x00);        //
  20.                
  21.                 RC663_CMD_LoadProtocol(0,0);
  22.                 // Disable Irq 0,1 sources
  23.                 RC663_WriteReg(rRegIRQ0En,0);
  24.                 RC663_WriteReg(rRegIRQ1En,0);
  25.                
  26.                 RC663_WriteReg(rRegFIFOControl,0xB0);
  27.                 RC663_WriteReg(rRegTxModWidth,0x20); // Length of the pulse modulation in carrier clks+1  
  28.                 RC663_WriteReg(rRegTxSym10BurstLen,0); // Symbol 1 and 0 burst lengths = 8 bits.
  29.                 RC663_WriteReg(rRegFrameCon,0xCF); // Start symbol=Symbol2, Stop symbol=Symbol3
  30.                
  31.                 RC663_WriteReg(rRegRxCtrl,0x04); // Set Rx Baudrate 106 kBaud
  32.                 RC663_WriteReg(rRegRxThreshold,0x55); // Set min-levels for Rx and phase shift  //32
  33.                 RC663_WriteReg(rRegRcv,0x12);        //
  34.                 RC663_WriteReg(rRegRxAna,0x0A); //0
  35.                
  36.                 RC663_WriteReg(rRegDrvMod,0x81);
  37.                 //> MIFARE Crypto1 state is further disabled.
  38.                 RC663_WriteReg(rRegStatus,0);
  39.                 //>  FieldOn
  40.                 RC663_WriteReg(rRegDrvMod,0x89);
  41.         }
  42.         else if(type=='B')
  43.         {
  44.                 RC663_WriteReg(rRegWaterLevel,0x10);        //Set WaterLevel =(FIFO length -1)
  45.                                                                                  
  46.                 RC663_WriteReg(rRegRxBitCtrl,0x80);        //Received bit after collision are replaced with 1.
  47.                 RC663_WriteReg(rRegDrvMod,0x8F);        //Tx2Inv=1
  48.                 RC663_WriteReg(rRegTxAmp,0x0C);        // 0xCC       
  49.                 RC663_WriteReg(rRegDrvCon,0x01);       
  50.                 RC663_WriteReg(rRegTxl,0x05);       
  51.                 RC663_WriteReg(rRegRxSofD,0x00);       
  52.                
  53.                 RC663_CMD_LoadProtocol(4,4);
  54.                 // Disable Irq 0,1 sources
  55.                 RC663_WriteReg(rRegIRQ0En,0);
  56.                 RC663_WriteReg(rRegIRQ1En,0);
  57.                
  58.                 RC663_WriteReg(rRegFIFOControl,0xB0);
  59.                 RC663_WriteReg(rRegTxModWidth,0x0A); // Length of the pulse modulation in carrier clks+1  
  60.                 RC663_WriteReg(rRegTxSym10BurstLen,0); // Symbol 1 and 0 burst lengths = 8 bits.
  61.                 RC663_WriteReg(rRegTXWaitCtrl,1);       
  62.                 RC663_WriteReg(rRegFrameCon,0x05);
  63.                 RC663_WriteReg(rRegRxSofD,0xB2);
  64.                
  65.                 RC663_WriteReg(rRegRxCtrl,0x34); // Set Rx Baudrate 106 kBaud
  66.                 RC663_WriteReg(rRegRxThreshold,0x9F); // Set min-levels for Rx and phase shift  0x7F
  67.                 RC663_WriteReg(rRegRcv,0x12);
  68.                 RC663_WriteReg(rRegRxAna,0x0a); //0x0a 0X0e
  69.                
  70.                 RC663_WriteReg(rRegDrvMod,0x87);
  71.                 RC663_WriteReg(rRegStatus,0);
  72.                 //>  FieldOn
  73.                 RC663_WriteReg(rRegDrvMod,0x8F);
  74.         }
复制代码
然后就可以编写CLRC663轮询函数了
轮询思绪
控制寄存器,使能芯片,天线工作辨认芯片返回数据
查抄返回数据是否正常

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表