#include "rc522.h" //void system_delay_us(unsigned int k) //{ // system_delay_us(k); //} void SPIWriteByte(unsigned char infor) { unsigned int counter; for(counter=0;counter<8;counter++) { if(infor&0x80) IC_MOSI_PIN = 1; else IC_MOSI_PIN = 0; system_delay_us(3); IC_SCK_PIN = 0; system_delay_us(1); IC_SCK_PIN = 1; system_delay_us(3); infor <<= 1; } } unsigned char SPIReadByte(void) { unsigned int counter; unsigned char SPI_Data; for(counter=0;counter<8;counter++) { SPI_Data<<=1; IC_SCK_PIN = 0; system_delay_us(3); if(IC_MISO_PIN == 1) SPI_Data |= 0x01; system_delay_us(2); IC_SCK_PIN = 1; system_delay_us(3); } return SPI_Data; } ///////////////////////////////////////////////////////////////////// //功 能:读RC632寄存器 //参数说明:Address[IN]:寄存器地址 //返 回:读出的值 ///////////////////////////////////////////////////////////////////// unsigned char ReadRawRC(unsigned char Address) { unsigned char ucAddr; unsigned char ucResult=0; IC_SDA_PIN = 0; ucAddr = ((Address<<1)&0x7E)|0x80;//地址变换,SPI的读写地址有要求 SPIWriteByte(ucAddr); ucResult=SPIReadByte(); IC_SDA_PIN = 1; return ucResult; } ///////////////////////////////////////////////////////////////////// //功 能:写RC632寄存器 //参数说明:Address[IN]:寄存器地址 // value[IN]:写入的值 ///////////////////////////////////////////////////////////////////// void WriteRawRC(unsigned char Address, unsigned char value) { unsigned char ucAddr; Address <<= 1; ucAddr = (Address&0x7e); IC_SDA_PIN = 0; SPIWriteByte(ucAddr); SPIWriteByte(value); IC_SDA_PIN = 1; } ///////////////////////////////////////////////////////////////////// //功 能:置RC522寄存器位 //参数说明:reg[IN]:寄存器地址 // mask[IN]:置位值 ///////////////////////////////////////////////////////////////////// void SetBitMask(unsigned char reg,unsigned char mask) { char tmp = 0x0; tmp = ReadRawRC(reg); WriteRawRC(reg,tmp | mask); // set bit mask } ///////////////////////////////////////////////////////////////////// //功 能:清RC522寄存器位 //参数说明:reg[IN]:寄存器地址 // mask[IN]:清位值 ///////////////////////////////////////////////////////////////////// void ClearBitMask(unsigned char reg,unsigned char mask) { char tmp = 0x0; tmp = ReadRawRC(reg); WriteRawRC(reg, tmp & ~mask); // clear bit mask } ///////////////////////////////////////////////////////////////////// //开启天线 //每次启动或关闭天险发射之间应至少有1ms的间隔 ///////////////////////////////////////////////////////////////////// void PcdAntennaOn(void) { unsigned char i; i = ReadRawRC(TxControlReg); if (!(i & 0x03)) { SetBitMask(TxControlReg, 0x03); } } ///////////////////////////////////////////////////////////////////// //关闭天线 ///////////////////////////////////////////////////////////////////// void PcdAntennaOff(void) { ClearBitMask(TxControlReg, 0x03); } ///////////////////////////////////////////////////////////////////// //功 能:复位RC522 //返 回: 成功返回MI_OK ///////////////////////////////////////////////////////////////////// void PcdReset(void) { //PORTD|=(1<