⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rc500.c

📁 ARM7 SPI RC531驱动程序,数据手册
💻 C
📖 第 1 页 / 共 5 页
字号:
/****************************************Copyright (c)**************************************************
**                                   
**                                    
**                                        
**
**                                 
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: RC500.c
**创   建   人: 李功周
**最后修改日期: 2008年12月18日
**描        述: RC500 驱动与API 函数 
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 李功周
** 版  本: v1.0
** 日 期: 2008年12月18日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
*/
#include <LPC2103.H>
#include "../INT0/INT0.H"
//#include "../Uart1/Uart1.h"
#include "../SPI0/SPI0.h"
//#include "../SPK/SPK.h"
#include "RC500.h"

#include <string.h>
#include <stdio.h>
#include <absacc.h>


#ifndef MFERRNO_H
#define MFERRNO_H

#define READER_ERR_BASE_START           0
#define MI_OK                           0
#define MI_CHK_OK                       0
#define MI_CRC_ZERO                     0

#define MI_CRC_NOTZERO                  1

#define MI_NOTAGERR                     1
#define MI_CHK_FAILED                   1
#define MI_CRCERR                       2
#define MI_CHK_COMPERR                  2
#define MI_EMPTY                        3
#define MI_AUTHERR                      4
#define MI_PARITYERR                    5
#define MI_CODEERR                      6

#define MI_SERNRERR                     8
#define MI_KEYERR                       9
#define MI_NOTAUTHERR                   10
#define MI_BITCOUNTERR                  11
#define MI_BYTECOUNTERR                 12
#define MI_IDLE                         13
#define MI_TRANSERR                     14
#define MI_WRITEERR                     15
#define MI_INCRERR                      16
#define MI_DECRERR                      17
#define MI_READERR                      18
#define MI_OVFLERR                      19
#define MI_POLLING                      20
#define MI_FRAMINGERR                   21
#define MI_ACCESSERR                    22
#define MI_UNKNOWN_COMMAND              23
#define MI_COLLERR                      24
#define MI_RESETERR                     25
#define MI_INITERR                      25
#define MI_INTERFACEERR                 26
#define MI_ACCESSTIMEOUT                27
#define MI_NOBITWISEANTICOLL            28
#define MI_QUIT                         30
#define MI_RECBUF_OVERFLOW              50 
#define MI_SENDBYTENR                   51
	
#define MI_SENDBUF_OVERFLOW             53
#define MI_BAUDRATE_NOT_SUPPORTED       54
#define MI_SAME_BAUDRATE_REQUIRED       55

#define MI_WRONG_PARAMETER_VALUE        60

#define MI_BREAK                        99
#define MI_NY_IMPLEMENTED               100
#define MI_NO_MFRC                      101
#define MI_MFRC_NOTAUTH                 102
#define MI_WRONG_DES_MODE               103
#define MI_HOST_AUTH_FAILED             104

#define MI_WRONG_LOAD_MODE              106
#define MI_WRONG_DESKEY                 107
#define MI_MKLOAD_FAILED                108
#define MI_FIFOERR                      109
#define MI_WRONG_ADDR                   110
#define MI_DESKEYLOAD_FAILED            111

#define MI_WRONG_SEL_CNT                114

#define MI_WRONG_TEST_MODE              117
#define MI_TEST_FAILED                  118
#define MI_TOC_ERROR                    119
#define MI_COMM_ABORT                   120
#define MI_INVALID_BASE                 121
#define MI_MFRC_RESET                   122
#define MI_WRONG_VALUE                  123
#define MI_VALERR                       124
#define MI_SAKERR                       0x46	//added by robbie

#endif // COMMON_H

#define     RegPage               0x00
#define     RegCommand            0x01
#define     RegFIFOData           0x02
#define     RegPrimaryStatus      0x03
#define     RegFIFOLength         0x04  
#define     RegSecondaryStatus    0x05  
#define     RegInterruptEn        0x06  
#define     RegInterruptRq        0x07  
#define     RegControl            0x09  
#define     RegErrorFlag          0x0A  
#define     RegCollPos            0x0B  
#define     RegTimerValue         0x0C  
#define     RegCRCResultLSB       0x0D  
#define     RegCRCResultMSB       0x0E  
#define     RegBitFraming         0x0F  
#define     RegTxControl          0x11  
#define     RegCwConductance      0x12
#define     RFU13                 0x13
#define     RegModConductance     0x13   //驱动电导系数寄存器
#define     RegCoderControl       0x14
#define     RegModWidth           0x15
#define     RFU16                 0x16
#define     RFU17                 0x17
#define     RegTypeBFraming       0x17   //TypeB帧设置寄存器
#define     RegRxControl1         0x19 
#define     RegDecoderControl     0x1A 
#define     RegBitPhase           0x1B 
#define     RegRxThreshold        0x1C 
#define     RFU1D                 0x1D  
#define     RegBPSKDemControl     0x1D   //BPSK解调控制寄存器
#define     RegRxControl2         0x1E  
#define     RegClockQControl      0x1F  
#define     RegRxWait             0x21   
#define     RegChannelRedundancy  0x22   
#define     RegCRCPresetLSB       0x23   
#define     RegCRCPresetMSB       0x24   
#define     RFU25                 0x25  
#define     RegMfOutSelect        0x26  
#define     RFU27                 0x27  
#define     RegFIFOLevel          0x29  
#define     RegTimerClock         0x2A  
#define     RegTimerControl       0x2B  
#define     RegTimerReload        0x2C  
#define     RegIRqPinConfig       0x2D  
#define     RFU2E                 0x2E   
#define     RFU2F                 0x2F   
#define     RFU31                 0x31  
#define     RFU32                 0x32  
#define     RFU33                 0x33
#define     RFU34                 0x34
#define     RFU35                 0x35
#define     RFU36                 0x36
#define     RFU37                 0x37
#define     RFU39                 0x39
#define     RegTestAnaSelect      0x3A  
#define     RFU3B                 0x3B  
#define     RFU3C                 0x3C  
#define     RegTestDigiSelect     0x3D  
#define     RFU3E                 0x3E  
#define     RegTestDigiAccess     0x3F
#define     DEF_FIFO_LENGTH       64  
#define     PCD_IDLE              0x00 
#define     PCD_WRITEE2           0x01 
#define     PCD_READE2            0x03 
#define     PCD_LOADCONFIG        0x07
#define     PCD_LOADKEYE2         0x0B 
#define     PCD_AUTHENT1          0x0C 
#define     PCD_CALCCRC           0x12 
#define     PCD_AUTHENT2          0x14 
#define     PCD_RECEIVE           0x16 
#define     PCD_LOADKEY           0x19 
#define     PCD_TRANSMIT          0x1A
#define     PCD_TRANSCEIVE        0x1E 
#define     PCD_RESETPHASE        0x3F
#define     PICC_REQIDL           0x26         
#define     PICC_REQALL           0x52         
#define     PICC_ANTICOLL1        0x93         
#define     PICC_ANTICOLL2        0x95        
#define     PICC_ANTICOLL3        0x97         
#define     PICC_AUTHENT1A        0x60        
#define     PICC_AUTHENT1B        0x61         
#define     PICC_READ             0x30      
#define     PICC_WRITE            0xA0     
#define     PICC_DECREMENT        0xC0     
#define     PICC_INCREMENT        0xC1       
#define     PICC_RESTORE          0xC2        
#define     PICC_TRANSFER         0xB0       
#define     PICC_HALT             0x50      

#define mifare1			1
#define mifarepro		2
#define mifarelight		3
#define unkowncard		4

#define GetRegPage(addr)    (0x80 | (addr>>3))




typedef struct 
         {
            unsigned char  cmd;           
            char           status;        
            unsigned char  nBytesSent;   
            unsigned char  nBytesToSend; 
            unsigned char  nBytesReceived;
            unsigned short nBitsReceived; 
            unsigned char  irqSource;     
            unsigned char  collPos;       
                                          
         } MfCmdInfo;
		 
		 
		 
#define 	ResetInfo(info)    \
            info.cmd            = 0;\
            info.status         = MI_OK;\
            info.irqSource      = 0;\
            info.nBytesSent     = 0;\
            info.nBytesToSend   = 0;\
            info.nBytesReceived = 0;\
            info.nBitsReceived  = 0;\
            info.collPos        = 0;
			



/* RC531RST 引脚 */		
#define  RC531RST      			0x00008000              	 	
#define  RC531RST_GPIO()		PINSEL0 &= ~((unsigned int)0x03 << 30)			/* 设置 RC500RST 口为GPIO口 */
#define  RC531RST_OUT()			IODIR |= RC531RST			 					/* 设置 RC500RST 口为输出口 */
#define	 RC531RST_SET()			IOSET |= RC531RST								/* 置 RC500RST 为高电平 */
#define	 RC531RST_CLR()			IOCLR |= RC531RST								/* 置 RC500RST 为低电平 */

/* RC531NSS 引脚 */		
#define  RC531NSS      			0x00000400              	 	
#define  RC531NSS_GPIO()		PINSEL0 &= ~((unsigned int)0x03 << 20)			/* 设置 RC500RST 口为GPIO口 */
#define  RC531NSS_OUT()			IODIR |= RC531NSS			 					/* 设置 RC500RST 口为输出口 */
#define	 RC531NSS_SET()			IOSET |= RC531NSS								/* 置 RC500RST 为高电平 */
#define	 RC531NSS_CLR()			IOCLR |= RC531NSS								/* 置 RC500RST 为低电平 */




//全局变量			
static   volatile MfCmdInfo   MInfo; 			


volatile unsigned char SerBuffer[40]; 

static   volatile MfCmdInfo      *MpIsrInfo; 
static   volatile unsigned char  *MpIsrOut;
volatile unsigned char MLastSelectedSnr[4];



/****************************************************************************
* 名    称:DelayNS()
* 功    能:长软件延时。
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  delay_1ms(unsigned long  dly)
{  
    unsigned long  i;
	while(dly--)
	{
		i = 8000;
		while(i--);
	}
}




/****************************************************************************
* 名    称:delay_50us()
* 功    能:长软件延时。
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void delay_50us(unsigned char _50us)
{
	unsigned long  i;
	while(_50us--)
	{
		i = 400;
		while(i--);
	}		
}



/****************************************************************************
* 名    称:ReadRawIO()
* 功    能:从一个地址读出一个数据(EEPROM)。
* 入口参数:Address  地址
* 出口参数:数据
****************************************************************************/
unsigned char ReadRawIO(unsigned char Address)
{
	unsigned char a;
	RC531NSS_CLR();
   	SPI_SendByte((Address<<1)|0x80);
   	a = SPI_RecByte(); 
   	SPI_SendByte(0x00);   
   	RC531NSS_SET();
   	return a;      
}




/****************************************************************************
* 名    称:WriteRawIO()
* 功    能:往一个地址写一个数据(EEPROM)。
* 入口参数:Address  地址
			value    数据
* 出口参数:无
****************************************************************************/
void WriteRawIO(unsigned char Address, unsigned char value)
{
	RC531NSS_CLR();
	SPI_SendByte((Address<<1)&0x7f);
    SPI_SendByte(value);
	RC531NSS_SET();
}




/****************************************************************************
* 名    称:WriteIO()
* 功    能:往一个地址写一个数据(EEPROM)。
* 入口参数:Address  地址
			value    数据
* 出口参数:无
****************************************************************************/
void WriteIO(unsigned char Address, unsigned char value)
{
	RC531NSS_CLR();
    SPI_SendByte(0x00);
    SPI_SendByte(GetRegPage(Address));
	RC531NSS_SET();
    
	RC531NSS_CLR();
	SPI_SendByte((Address<<1)&0x7f);
    SPI_SendByte(value);
	RC531NSS_SET();             
}



/****************************************************************************
* 名    称:ReadIO()
* 功    能:从一个地址读出一个数据(EEPROM)。
* 入口参数:Address  地址
* 出口参数:数据
****************************************************************************/
unsigned char ReadIO(unsigned char Address)
{
   unsigned char a;
   RC531NSS_CLR();
   SPI_SendByte(0x00);
   SPI_SendByte(GetRegPage(Address));
   RC531NSS_SET();
   
   RC531NSS_CLR();
   SPI_SendByte((Address<<1)|0x80);
   a = SPI_RecByte(); 
   SPI_SendByte(0x00);   
   RC531NSS_SET();
   return a;             
} 





/****************************************************************************
* 名    称:RFRegWrite()
* 功    能:往一个地址写一个数据(EEPROM)。
* 入口参数:Address  地址
			value    数据
* 出口参数:无
****************************************************************************/
void RFRegWrite(unsigned char Address, unsigned char value)
{
	RC531NSS_CLR();
    SPI_SendByte(0x00);
    SPI_SendByte(GetRegPage(Address));
	RC531NSS_SET();
    
	RC531NSS_CLR();
	SPI_SendByte((Address<<1)&0x7f);
    SPI_SendByte(value);
	RC531NSS_SET();             
}



/****************************************************************************
* 名    称:ReadIO()
* 功    能:从一个地址读出一个数据(EEPROM)。
* 入口参数:Address  地址
* 出口参数:数据
****************************************************************************/
unsigned char RFRegRead(unsigned char Address)
{
   unsigned char a;
   RC531NSS_CLR();
   SPI_SendByte(0x00);
   SPI_SendByte(GetRegPage(Address));
   RC531NSS_SET();
   
   RC531NSS_CLR();
   SPI_SendByte((Address<<1)|0x80);
   a = SPI_RecByte(); 
   SPI_SendByte(0x00);   
   RC531NSS_SET();
   return a;             
}





/****************************************************************************
* 名    称:SetBitMask()
* 功    能:清一个bit
* 入口参数:reg		内存
			mask俺码
* 出口参数:无
****************************************************************************/
char SetBitMask(unsigned char reg,unsigned char mask)  
{
    char tmp = 0x00;

    tmp = ReadIO(reg);
    WriteIO(reg,tmp | mask);  // set bit mask
    return 0x00;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -