发一个读写RC531的STM32F2XX的DEMO

2020-01-01 17:59发布

近期发现技术贴少了,苦于保密问题,也不好乱发。现在发一个STM32F2XX读取RC531的DEMO。
//------------------------------------------------------------------------------------------------------  
extern void SPI1_Config(void);
extern unsigned char SPI1_ReadWriteByte(unsigned char TxData);
extern unsigned char Read_RC531_IRQ(void);
                               
/* RC531RST 引脚 */                                                                 
       
#define  RC531RST_SET()         RC531_RSTPD(1)                               /* 置 RC500RST 为高电平 */                                                          
#define  RC531RST_CLR()         RC531_RSTPD(0)                               /* 置 RC500RST 为低电平 */                                                          
                                                          
/* RC531NSS 引脚 */                                                                 

#define  RC531NSS_SET()         RC531_CS(1)                               /* 置 RC500RST 为高电平 */                                                          
#define  RC531NSS_CLR()         RC531_CS(0)                               /* 置 RC500RST 为低电平 */                                                          



//全局变量                                                                    
static   volatile MfCmdInfo   MInfo;                                                                      

                                                          
volatile unsigned char SerBuffer[40];                                                           
                                                          
static   volatile MfCmdInfo      *MpIsrInfo;                                                           
static   volatile unsigned char  *MpIsrOut;                                                          
volatile unsigned char MLastSelectedSnr[4];                                                          
                                                          
                                                          
//***********************************************************************
//以下代码为1uS的延时,用视波器调整的,很准,KEIL MDK编译,优化等级为0,频率120M
void tDelay_1us(unsigned int nDly){
         register unsigned char  n;
         while(nDly--){
                         n = 22;
                         while(n--);
         }
}                                                                                                                   
/****************************************************************************                                                         
* 名    称:DelayNS()                                                         
* 功    能:长软件延时。                                                         
* 入口参数:dly      延时参数,值越大,延时越久                                                         
* 出口参数:无                                                         
****************************************************************************/                                                          
void  delay_1ms(unsigned long  dly){                                                            
                tDelay_1us(8000);  //1000us
}                                                          
/****************************************************************************                                                         
* 名    称:delay_50us()                                                         
* 功    能:长软件延时。                                                         
* 入口参数:dly      延时参数,值越大,延时越久                                                         
* 出口参数:无                                                         
****************************************************************************/                                                          
void delay_50us(unsigned char _50us){                                                          
                tDelay_1us(40);  //50us
}
//*****************************************************************************
//不改动原来函数!必须传入数据
void ResetInfo(void){
        memset((unsigned char *)&MInfo,0,sizeof( MInfo));
}
/****************************************************************************                                                         
* 名    称:ReadRawIO()                                                         
* 功    能:从一个地址读出一个数据(EEPROM)。                                                         
* 入口参数:Address  地址                                                         
* 出口参数:数据                                                         
****************************************************************************/                                                          
unsigned char ReadRawIO(unsigned char Address){                                                          
    unsigned char a;                                                          
    RC531NSS_CLR();                                                          
    SPI1_ReadWriteByte((Address<<1)|0x80);                                                          
    a = SPI1_ReadWriteByte(0xff);  //亚指令!                                                         
    SPI1_ReadWriteByte(0x00);                                                             
    RC531NSS_SET();                                                          
    return a;                                                                
}                                                          
                               
/****************************************************************************                                                         
* 名    称:WriteRawIO()                                                         
* 功    能:往一个地址写一个数据(EEPROM)。                                                         
* 入口参数:Address  地址                                                         
            value    数据                                                         
* 出口参数:无                                                         
****************************************************************************/                                                          
void WriteRawIO(unsigned char Address, unsigned char value){                                                          
    RC531NSS_CLR();                                                          
    SPI1_ReadWriteByte((Address<<1)&0x7f);                                                          
    SPI1_ReadWriteByte(value);                                                          
    RC531NSS_SET();                                                          
}                                                          
/****************************************************************************                                                         
* 名    称:WriteIO()                                                         
* 功    能:往一个地址写一个数据(EEPROM)。                                                         
* 入口参数:Address  地址                                                         
            value    数据                                                         
* 出口参数:无                                                         
****************************************************************************/                                                          
void WriteIO(unsigned char Address, unsigned char value){                                                          
    RC531NSS_CLR();                                                          
    SPI1_ReadWriteByte(0x00);                                                          
    SPI1_ReadWriteByte(GetRegPage(Address));                                                          
    RC531NSS_SET();                                                          
                                                              
    RC531NSS_CLR();                                                          
    SPI1_ReadWriteByte((Address<<1)&0x7f);                                                          
    SPI1_ReadWriteByte(value);                                                          
    RC531NSS_SET();                                                                       
}                                                          
/****************************************************************************                                                         
* 名    称:ReadIO()                                                         
* 功    能:从一个地址读出一个数据(EEPROM)。                                                         
* 入口参数:Address  地址                                                         
* 出口参数:数据                                                         
****************************************************************************/                                                          
unsigned char ReadIO(unsigned char Address) {                                                          
   unsigned char a;                                                          
   RC531NSS_CLR();                                                          
   SPI1_ReadWriteByte(0x00);                                                          
   SPI1_ReadWriteByte(GetRegPage(Address));                                                          
   RC531NSS_SET();                                                          
                                                             
   RC531NSS_CLR();                                                          
   SPI1_ReadWriteByte((Address<<1)|0x80);                                                          
   a = SPI1_ReadWriteByte(0xff);  //亚指令!                                                         
   SPI1_ReadWriteByte(0x00);                                                             
   RC531NSS_SET();                                                          
   return a;                                                                       
}                                                           
       
/****************************************************************************                                                         
* 名    称:RFRegWrite()                                                         
* 功    能:往一个地址写一个数据(EEPROM)。                                                         
* 入口参数:Address  地址                                                         
            value    数据                                                         
* 出口参数:无                                                         
****************************************************************************/                                                          
void RFRegWrite(unsigned char Address, unsigned char value){                                                          
    RC531NSS_CLR();                                                          
    SPI1_ReadWriteByte(0x00);                                                          
    SPI1_ReadWriteByte(GetRegPage(Address));                                                          
    RC531NSS_SET();                                                          
                                                              
    RC531NSS_CLR();                                                          
    SPI1_ReadWriteByte((Address<<1)&0x7f);                                                          
    SPI1_ReadWriteByte(value);                                                          
    RC531NSS_SET();                                                                       
}                                                          
/****************************************************************************                                                         
* 名    称:ReadIO()                                                         
* 功    能:从一个地址读出一个数据(EEPROM)。                                                         
* 入口参数:Address  地址                                                         
* 出口参数:数据                                                         
****************************************************************************/                                                          
unsigned char RFRegRead(unsigned char Address){                                                          
   unsigned char a;                                                          
   RC531NSS_CLR();                                                          
   SPI1_ReadWriteByte(0x00);                                                          
   SPI1_ReadWriteByte(GetRegPage(Address));                                                          
   RC531NSS_SET();                                                          
                                                             
   RC531NSS_CLR();                                                          
   SPI1_ReadWriteByte((Address<<1)|0x80);                                                          
   a = SPI1_ReadWriteByte(0xff);  //亚指令!                                                         
   SPI1_ReadWriteByte(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;                                                          
}                                                          
/****************************************************************************                                                         
* 名    称:ClearBitMask()                                                         
* 功    能:清一个bit                                                         
* 入口参数:reg      内存                                                         
            mask俺码                                                         
* 出口参数:无                                                         
****************************************************************************/                                                          
char ClearBitMask(unsigned char reg,unsigned char mask){                                                          
    char tmp = 0x00;                                                          
                                                          
    tmp = ReadIO(reg);                                                          
    WriteIO(reg,tmp & ~mask);  // clear bit mask                                                          
    return 0x00;                                                          
}                                                          
/****************************************************************************                                                         
* 名    称:FlushFIFO()                                                         
* 功    能:清除内部FIFO                                                         
* 入口参数:无                                                         
* 出口参数:无                                                         
****************************************************************************/                                                          
void FlushFIFO(void){                                                            
    SetBitMask(RegControl,0x01);                                                          
}                                                          
/****************************************************************************                                                         
* 名    称:M500PcdCmd()                                                         
* 功    能:清一个bit                                                         
* 入口参数:unsigned char cmd,                                                         
            unsigned char *rcv,                                                         
            MfCmdInfo idata *info                                                         
* 出口参数:0正常,其它错误码                                                         
****************************************************************************/                                                          
char  M500PcdCmd(unsigned char cmd,                                                          
                 unsigned char *rcv,                                                          
                 MfCmdInfo  *info){                                                          
    char status    = MI_OK;                                                          
    unsigned char irqEn = 0x00;                                                          
    unsigned char waitFor = 0x00;                                                          
    unsigned int timecnt = 0;                                                          
    char tmpStatus ;                                                          
    unsigned char lastBits;                                                          
    WriteIO(RegInterruptEn,0x7F);               //开中断                                                          
    WriteIO(RegInterruptRq,0x7F);               //清中断                                                          
    WriteIO(RegCommand,PCD_IDLE);               //清除指令                                                          
                                                              
    FlushFIFO();                                                               
    MpIsrInfo = info;                                                            
    MpIsrOut = rcv;                                                          
                                                              
    info->irqSource = 0x00;                                                                                
                                                              
    switch(cmd){                                                          
        case PCD_IDLE:                          //0x00      无指令,清指令                                                                   
            irqEn = 0x00;                                                          
            waitFor = 0x00;                                                          
            break;                                                          
        case PCD_WRITEE2:                       //0x01      写FIFO,并定入EEPROM                                                           
            irqEn = 0x11;                                                          
            waitFor = 0x10;                                                          
            break;                                                          
        case PCD_READE2:                        //0x03      从EEPROM取数据并写入FIFO                                                               
            irqEn = 0x07;                                                          
            waitFor = 0x04;                                                          
            break;                                                          
        case PCD_LOADCONFIG:                    //0x07      从EEPROM读数据并用于初始化                                                            
        case PCD_LOADKEYE2:                     //0x0b      将密钥从EEPROM复制到KEY缓存                                                          
        case PCD_AUTHENT1:                      //0x0c      执行Cryptol算法的认证过程                                                          
            irqEn = 0x05;                                                          
            waitFor = 0x04;                                                          
            break;                                                          
        case PCD_CALCCRC:                       //0x12      激活CRC                                                          
            irqEn = 0x11;                                                          
            waitFor = 0x10;                                                          
            break;                                                          
        case PCD_AUTHENT2:                      //0x14      执行Cryptol算法的认证过程二                                                          
            irqEn = 0x04;                                                          
            waitFor = 0x04;                                                          
            break;                                                          
        case PCD_RECEIVE:                       //0x16      接收                                                            
            info->nBitsReceived = -(ReadIO(RegBitFraming) >> 4);                                                          
            irqEn = 0x06;                                                          
            waitFor = 0x04;                                                          
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
mon51
1楼-- · 2020-01-01 22:03
#ifndef _RC531_H
#define _RC531_H
//-------------------------------------------------------------------------------------------------------
#define        RC531_CS1                                                         (GPIO_Pin_2)                          //PA2
//********************************************************************************************************************
#define RC531_CS(x) ((x>0)?         (GPIO_SetBits(GPIOA, RC531_CS1)) : (GPIO_ResetBits(GPIOA, RC531_CS1) ))//设置1,0
//-------------------------------------------------------------------------------------------------------
//IRQ 估计是用中断,请注意!!!!
#define        RC531_IRQ1                                                         (GPIO_Pin_1)                          //PA1
//********************************************************************************************************************
#define RC531_IRQ(x) ((x>0)?         (GPIO_SetBits(GPIOA, RC531_IRQ1)) : (GPIO_ResetBits(GPIOA, RC531_IRQ1) ))//设置1,0
//-------------------------------------------------------------------------------------------------------
#define        RC531_RSTPD1                                                 (GPIO_Pin_3)                          //PA3
//********************************************************************************************************************
#define RC531_RSTPD(x) ((x>0)?         (GPIO_SetBits(GPIOA, RC531_RSTPD1)) : (GPIO_ResetBits(GPIOA, RC531_RSTPD1) ))//设置1,0
//******************************************************************************                       
#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                                  
                                  
                                 
#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;)
#endif

/****************************************************************************
* 名    称:Rc500Init
* 功    能:外部中断的初始化。
* 入口参数:无
* 出口参数:0正常,其它错误码
****************************************************************************/
extern unsigned char Rc500Init(void);
///////////////////////////////////////////////////////////////////////
// 14443-3函数
///////////////////////////////////////////////////////////////////////
/****************************************************************************
* 名    称:fine
* 功    能:寻卡
* 入口参数:req_code 寻卡指令 request code ALL = 0x52  or IDLE = 0x26
                        agq 返回卡类型
* 出口参数:0正常,其它错误码
****************************************************************************/
extern char fine(unsigned char req_code,unsigned char *atq) ;
/****************************************************************************
* 名    称:CascAnticoll
* 功    能:防碰撞
* 入口参数:bcnt 0
                        snr 卡序列号
* 出口参数:0正常,其它错误码
****************************************************************************/
extern char CascAnticoll(unsigned char bcnt,unsigned char *snr);

/****************************************************************************
* 名    称:SelectTag
* 功    能:选技卡
* 入口参数:snr 卡序列号
                        返回值
* 出口参数:0正常,其它错误码
****************************************************************************/
extern char SelectTag(unsigned char *snr, unsigned char *sak);

/****************************************************************************
* 名    称:Fine_Card
* 功    能:寻卡,碰撞,选卡
* 入口参数:CardSN 卡序列号
                        cardtype 返回卡类型
* 出口参数:0正常
                        0x10,无卡,
                        0x11,碰撞失败
                        0x12,选卡失败
****************************************************************************/
extern unsigned char Fine_Card(unsigned char *CardSN,unsigned char *cardtype);
/****************************************************************************
* 名    称:ReadCard
* 功    能:读卡
* 入口参数:ReadData         卡数据
                        bank                 块号
* 出口参数:0正常,其它错误码
****************************************************************************/
extern unsigned char ReadCard(        unsigned char *ReadData,unsigned char bank);
/****************************************************************************
* 名    称:WriteCard
* 功    能:写卡
* 入口参数:WriteData         卡数据
                        bank                 块号
* 出口参数:0正常,其它错误码
****************************************************************************/
extern unsigned char WriteCard(unsigned char *WriteData,unsigned char bank);
/****************************************************************************
* 名    称:M500PiccHalt
* 功    能:终止卡的操作
* 入口参数:无
* 出口参数:0正常,其它错误码
****************************************************************************/
extern char M500PiccHalt(void);
/****************************************************************************
* 名    称:DownloadPassWord
* 功    能:内部效验密码
* 入口参数:bank 所使用的块号
* 出口参数:0正常,其它错误码
****************************************************************************/
extern unsigned char DownloadPassWord(unsigned char bank);
/****************************************************************************
* 名    称:DownloadPassWord2
* 功    能:直接效验密码
* 入口参数:bank 所使用的块号
* 出口参数:0正常,其它错误码
****************************************************************************/
unsigned char DownloadPassWord2(unsigned char *password ,unsigned char bank);
/****************************************************************************
* 名    称:ChangePassWord
* 功    能:修改内部密码
* 入口参数:password        密码
                        bank                 所使用的块号
* 出口参数:0正常,其它错误码
****************************************************************************/
extern unsigned char ChangePassWord(unsigned char *password,unsigned char bank);
///////////////////////////////////////////////////////////////////////
// 14443-4函数
///////////////////////////////////////////////////////////////////////
/****************************************************************************
* 名    称:PiccCMD14443_4
* 功    能:14443-4指令的发送与接收
* 入口参数:senddata                                发送的数据
                        readdata                                接收的数据
                        sendlen                                        发送的字节数
                        readlen                                        接收到的字节数
* 出口参数:0正常,,其它错误码
****************************************************************************/
extern char PiccCMD14443_4(unsigned char *senddata,unsigned char *readdata,unsigned char sendlen,unsigned char *readlen);

/****************************************************************************
* 名    称:Select_3f02()
* 功    能:外部中断EINT3服务函数,取反B1控制口。
* 入口参数:指令执行状态
* 出口参数:0正常,,其它错误码
****************************************************************************/
extern unsigned char Select_3f02(unsigned char *p);
/****************************************************************************
* 名    称:read_ls()
* 功    能:读历吏字节。
* 入口参数:olddata                        历吏字节         
* 出口参数:0正常,,其它错误码
****************************************************************************/
extern unsigned char read_ls(unsigned char *olddata);
/****************************************************************************
* 名    称:GetCardSN()
* 功    能:取卡序列号
* 入口参数:SN                卡序列号
* 出口参数:0正常,,其它错误码
****************************************************************************/
extern unsigned char GetCardSN(unsigned char *SN);
///////////////////////////////////////////////////////////////////////
// 14443-4函数
// 国家建设部消费协议
///////////////////////////////////////////////////////////////////////
/****************************************************************************
* 名    称:Cash_Withdraw()
* 功    能:消费初始化
* 入口参数:sn                                 终端编号
                        money                        交易金额
                        passwordtype        密码类型
                        p                                卡返回的数据
                        len                                卡返回数据的长度
* 出口参数:0正常,,其它错误码
****************************************************************************/
extern unsigned char Cash_Withdraw(        unsigned char *sn,//终端编号
                                                                        unsigned char *money,//交易金额
                                                                        unsigned char passwordtype,
                                                                        unsigned char *p,
                                                                        unsigned char *len);//消费初始?

/****************************************************************************
* 名    称:charCash_Withdraw2()
* 功    能:消费
* 入口参数:je_sn                         义易序列号
                        je_data                        交易日期
                        je_time                        交易时间
                        mac1                        MAC1
* 出口参数:0正常,,其它错误码
****************************************************************************/
extern unsigned char charCash_Withdraw2( unsigned char *je_sn,
                                                                                 unsigned char *je_data,
                                                                                 unsigned char *je_time,
                                                                                 unsigned char *mac1
                                                                                );
/****************************************************************************
* 名    称:GetName()
* 功    能:取姓名
* 入口参数:name                         名字
* 出口参数:0正常,,其它错误码
****************************************************************************/
extern unsigned char GetName(        unsigned short *name );
/****************************************************************************
* 名    称:RC531_IRQ_Lib()
* 功    能:中断处理程序
* 入口参数:无
* 出口参数:无
内部处理全局变量 MInfo
****************************************************************************/
extern void  RC531_IRQ_Lib(void);                                                         
//*************************************************************************
//读取IRQ的状态!!!!也可中断判别!!! 返回=1 已经有中断,=0 无!!!
unsigned char Read_RC531_IRQ(void);

mon51
2楼-- · 2020-01-01 22:37

/*
S0SPCCR = 128;                           设置SPI时钟分频值为128   
92.      
93.    S0SPCR  = (0 << 3) |              // CPHA = 0, 数据在SCK 的第一个时钟沿采样   
94.             (1 << 4) |               // CPOL = 1, SCK 为低有效   
95.             (1 << 5) |               // MSTR = 1, SPI 处于主模式   
96.             (0 << 6) |               // LSBF = 0, SPI 数据传输MSB (位7)在先   
97.             (0 << 7);                // SPIE = 0, SPI 中断被禁止   
98.               
*/
//******************************************************************************
#define SPIx_SCK_PIN                     GPIO_Pin_5
#define SPIx_SCK_SOURCE                  GPIO_PinSource5

#define SPIx_MISO_PIN                    GPIO_Pin_6
#define SPIx_MISO_SOURCE                 GPIO_PinSource6

#define SPIx_MOSI_PIN                    GPIO_Pin_7
#define SPIx_MOSI_SOURCE                 GPIO_PinSource7

#define SPIx_NSS_PIN                     GPIO_Pin_2
#define SPIx_NSS_SOURCE                  GPIO_PinSource2
//***************************************************************************
void SPI1_IO_Init(void){
        GPIO_InitTypeDef GPIO_InitStructure;

/* SPI pin mappings */
  GPIO_PinAFConfig(GPIOA, SPIx_SCK_SOURCE, GPIO_AF_SPI1);
  GPIO_PinAFConfig(GPIOA, SPIx_MOSI_SOURCE, GPIO_AF_SPI1);
  GPIO_PinAFConfig(GPIOA, SPIx_MISO_SOURCE, GPIO_AF_SPI1);
// GPIO_PinAFConfig(GPIOB, SPIx_NSS_SOURCE, GPIO_AF_SPI1);
  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;

  /* SPI SCK pin configuration */
  GPIO_InitStructure.GPIO_Pin = SPIx_SCK_PIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* SPI  MOSI pin configuration */
  GPIO_InitStructure.GPIO_Pin =  SPIx_MOSI_PIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* SPI MISO pin configuration */
  GPIO_InitStructure.GPIO_Pin = SPIx_MISO_PIN;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  /* SPI NSS pin configuration */
// GPIO_InitStructure.GPIO_Pin = SPIx_NSS_PIN;
//  GPIO_Init(GPIOB, &GPIO_InitStructure);
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Pin = SPIx_NSS_PIN |  RC531_RSTPD1;        //RC531--两个片选
  GPIO_Init(GPIOA, &GPIO_InitStructure);       
       
        RC531_CS(1);
        RC531_RSTPD(1);
        //** irq set input
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_Pin =  RC531_IRQ1;        //RC531--irq
  GPIO_Init(GPIOA, &GPIO_InitStructure);       

}
//*************************************************************************
//读取IRQ的状态!!!!
unsigned char Read_RC531_IRQ(void){
        return GPIO_ReadInputDataBit(        GPIOA,RC531_IRQ1);
}
//***************************************************************************
void SPI1_Config(void){
  SPI_InitTypeDef  SPI_InitStructure;

  /* Enable the SPI peripheral */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
        //RCC_AHB1PeriphResetCmd(RCC_AHB1Periph_GPIOC, ENABLE);

        SPI1_IO_Init();
  /* SPI configuration -------------------------------------------------------*/
  //SPI_DeInit(SPI1);
  //RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI1, ENABLE);
  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//SPI设置为双线双向全双工
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;//设置为主SPI
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//设置SPI的数据大小:SPI发送接收8位帧结构
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;//选择了串行时钟的稳态:时钟悬空高
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;//数据捕获于第二个时钟沿
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;//Fclk/2
  /* Initialize the SPI_FirstBit member */
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
        SPI_InitStructure.SPI_CRCPolynomial=7;
        SPI_Init(SPI1, &SPI_InitStructure);
  /* Enable SPI1  */
  SPI_Cmd(SPI1, ENABLE);
}
/*******************************************************************************
* Function Name  : SPI_ReadWriteByte
* Description    : SPI读写一个字节(发送完成后返回本次通讯读取的数据)
* Input          : unsigned char TxData 待发送的数
* Output         : None
* Return         : unsigned char RxData 收到的数
Flash_ReadWriteByte
*******************************************************************************/
unsigned char SPI1_ReadWriteByte(unsigned char TxData){
    unsigned char RxData = 0;
   
    //等待发送缓冲区空
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);
    //发一个字节
    SPI_I2S_SendData(SPI1, TxData);
//    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);

    //等待数据接收
    while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);
    //取数据
    RxData = SPI_I2S_ReceiveData(SPI1);
    return (unsigned char)RxData;
}


mon51
3楼-- · 2020-01-02 02:42
#if  RC531_TEST       
/**********************************************************************         
** 函数名称: main()                      
** 功能描述: 系统主函数                   
** 输   入: 无                                          
** 输    出: 无                 
** 函数说明: 程序C语言接口         
***********************************************************************/          
void test_RC531( void ){          
    unsigned char aa[64];          
    unsigned char a;          
//   unsigned short b = 0x1234;          

   a=Rc500Init();  
    while(1){
        if(Fine_Card(aa,&a)==0){          
            for( a = 0 ; a < 6 ; a++ )   aa[a] = 0xff;          
            if((a = DownloadPassWord2(aa,13))==0){          
                if(WriteCard(aa,13)==0){          
                    if((a = ReadCard(aa,13))==0){  //查看A,AA的值         
                        a=0;         
                    }else{          
                        a=a;          
                    }          
                    M500PiccHalt();          
                }          
            }else{          
                                                                a=a;
            }             
        }
                        Delay_1us(10000);
     }          
}          
#endif
mon51
4楼-- · 2020-01-02 04:04
 精彩回答 2  元偷偷看……
mon51
5楼-- · 2020-01-02 09:06
ANT_RC531.rar (1.53 KB, 下载次数: 34) 2014-8-1 10:44 上传 点击文件名下载附件
RC531.rar (3.66 KB, 下载次数: 39) 2014-8-1 10:44 上传 点击文件名下载附件
PCP_ANT.rar (11.48 KB, 下载次数: 32) 2014-8-1 10:45 上传 点击文件名下载附件
X-h-p
6楼-- · 2020-01-02 13:49
顶楼主,好资料,虽然我的已经做出来,还是可以参考下

一周热门 更多>