www.pudn.com > RC522.zip > Driver_RC522.c, change:2015-04-11,size:3951b


#include "Driver_RC522.h" 
#include "delay.h" 
#include "spi_driver.h" 
 
///////////////////////////////////////////////////////////////////// 
//功    能:RC522读卡模块引脚初始化 
///////////////////////////////////////////////////////////////////// 
void RC522_GPIO_Init(void) 
{ 
  GPIO_InitTypeDef GPIO_InitStructure; 
#if USE_SOFTWARE_SPI==1 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); 
 
	GPIO_InitStructure.GPIO_Pin  =GPIO_Pin_0|GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_2; 
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_Out_PP; 
	GPIO_Init(GPIOA, &GPIO_InitStructure); 
 
	GPIO_InitStructure.GPIO_Pin  =GPIO_Pin_6; 
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; 
	GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IPU; 
	GPIO_Init(GPIOA, &GPIO_InitStructure); 
#else	 
 	RCC_APB2PeriphClockCmd(RC522_RESET_GPIO_CLK,ENABLE); 
	GPIO_InitStructure.GPIO_Pin = RC522_RESET_PIN;//PA1 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
	GPIO_Init(RC522_RESET_GPIO_PORT, &GPIO_InitStructure); 
	SPI_Configuration(SPI1); 
#endif	 
 
 } 
 
///////////////////////////////////////////////////////////////////// 
//功    能:读RC632寄存器 
//参数说明:Address[IN]:寄存器地址 
//返    回:读出的值 
///////////////////////////////////////////////////////////////////// 
#if USE_SOFTWARE_SPI 
u8 ReadRawRC(u8 Address) 
{ 
     u8 i, ucAddr; 
     u8 ucResult=0; 
  
	   MF522_SCK_L; 
	   MF522_NSS_L; 
     ucAddr = ((Address<<1)&0x7E)|0x80; 
 
    for(i=8;i>0;i--) 
    {		 
			if((ucAddr&0x80)==0x80) 
			 { 
				 MF522_SO_H; 
			 } 
			 else 
			 { 
				 MF522_SO_L; 
			 } 
        MF522_SCK_H; 
 			  delay_us(50); 
        ucAddr <<= 1; 
        MF522_SCK_L; 
			  delay_us(50); 
    } 
 
     for(i=8;i>0;i--) 
     { 
			  MF522_SCK_H; 
        ucResult <<= 1; 
  
				delay_us(50); 
			 if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_6)) 
			 { 
				 ucResult|=1; 
			 } 
			 else 
			 { 
				 ucResult|=0; 
			 } 
			 MF522_SCK_L; 
			 delay_us(50); 
     }  
		 MF522_NSS_H; 
		 MF522_SCK_H; 
     return ucResult; 
} 
 
///////////////////////////////////////////////////////////////////// 
//功    能:写RC632寄存器 
//参数说明:Address[IN]:寄存器地址 
//          value[IN]:写入的值 
///////////////////////////////////////////////////////////////////// 
void WriteRawRC(u8 Address, u8 value) 
{   
    u8 i, ucAddr; 
 
    MF522_SCK_L; 
    MF522_NSS_L; 
    ucAddr = ((Address<<1)&0x7E); 
 
    for(i=8;i>0;i--) 
    { 
			if((ucAddr&0x80)==0x80) 
			 { 
				 MF522_SO_H; 
			 } 
			 else 
			 { 
				 MF522_SO_L; 
			 } 
        MF522_SCK_H; 
				delay_us(50); 
			  ucAddr <<= 1; 
        MF522_SCK_L;		 
				delay_us(50);			  
    } 
 
    for(i=8;i>0;i--) 
    { 
 			if((value&0x80)==0x80) 
			 { 
				 MF522_SO_H; 
			 } 
			 else 
			 { 
				 MF522_SO_L; 
			 } 
        MF522_SCK_H; 
				delay_us(50); 
			  value <<= 1; 
        MF522_SCK_L; 
			  delay_us(50); 
    } 
    MF522_NSS_H; 
    MF522_SCK_H; 
} 
#else 
///////////////////////////////////////////////////////////////////// 
//功    能:读RC632寄存器 
//参数说明:Address[IN]:寄存器地址 
//返    回:读出的值 
///////////////////////////////////////////////////////////////////// 
u8 ReadRawRC(u8 Address) 
{ 
	u8 ucAddr; 
	u8 ucResult=0; 
	ucAddr = ((Address<<1)&0x7E)|0x80; 
	delay_us(1); 
	RC522_ENABLE; 
	SPI_WriteNBytes(SPI1,&ucAddr,1); 
	SPI_ReadNBytes(SPI1,&ucResult,1); 
	RC522_DISABLE; 
	return ucResult; 
} 
 
///////////////////////////////////////////////////////////////////// 
//功    能:写RC632寄存器 
//参数说明:Address[IN]:寄存器地址 
//          value[IN]:写入的值 
///////////////////////////////////////////////////////////////////// 
void WriteRawRC(u8 Address, u8 value) 
{   
	u8 ucAddr; 
	uint8_t write_buffer[2]={0}; 
	ucAddr = ((Address<<1)&0x7E); 
	write_buffer[0] = ucAddr; 
	write_buffer[1] = value; 
	delay_us(1); 
	RC522_ENABLE; 
	SPI_WriteNBytes(SPI1,write_buffer,2); 
	RC522_DISABLE; 
} 
 
 
#endif