//******************************************************************/
//功 能:读RC522寄存器
//参数说明:Address[IN]:寄存器地址
//返 回:读出的值
//******************************************************************/
unsigned char ReadRawRC(unsigned char Address)
{
unsigned char i, ucAddr ;
unsigned char ucResult=0 ;
NSS522_0 ;
SCK522_0 ;
ucAddr = ((Address<<1)&0x7E)|0x80 ;
for(i=8;i>0;i--)
{
if((ucAddr&0x80)==0x80)
SI522_1 ;
else
SI522_0 ;
SCK522_1 ;
ucAddr <<= 1 ;
SCK522_0 ;
}
for(i=8;i>0;i--)
{
SCK522_0 ;
SCK522_1 ;
ucResult <<=1 ;
ucResult |= SO522 ;
SCK522_0 ;
}
SCK522_0 ;
NSS522_1 ;
return ucResult ;
}
//******************************************************************/
//功 能:写RC522寄存器
//参数说明:Address[IN]:寄存器地址
// value[IN]:写入的值
//******************************************************************/
/*
void WriteRawRC(unsigned char Address, unsigned char value)
{
unsigned char i, ucAddr ;
NSS522_0 ;
SCK522_0 ;
ucAddr = ((Address<<1)&0x7E) ;
for(i=8;i>0;i--)
{
if ((ucAddr&0x80)==0x80)
{ SI522_1; }
else
{ SI522_0; }
SCK522_1;
ucAddr <<= 1;
SCK522_0;
}
for(i=8;i>0;i--)
{
if ((value&0x80)==0x80)
{ SI522_1; }
else
{ SI522_0; }
SCK522_1;
value <<= 1;
SCK522_0;
}
SCK522_0;
NSS522_1;
}
*/
/////////////////////////////////////////////////////////////////////
//功 能:读RC522寄存器
//参数说明:Address[IN]:寄存器地址
//返 回:读出的值
/////////////////////////////////////////////////////////////////////
unsigned char ReadRawRC(unsigned char Address)
{
unsigned char i, ucAddr;
unsigned char ucResult=0;
 3OUT&=~(MF522_SCK | MF522_NSS); //MF522_SCK = 0;F //MF522_NSS = 0;
ucAddr = ((Address<<1)&0x7E)|0x80;
for(i=8;i>0;i--)
{
if(ucAddr&0x80)  3OUT|=MF522_MOSI;
else  3OUT&=~MF522_MOSI;
__delay_cycles(8);
 3OUT|=MF522_SCK; // MF522_SCK = 1;
ucAddr <<= 1;
__delay_cycles(8);
 3OUT&=~MF522_SCK; //MF522_SCK = 0;
}
 3DIR&=~MF522_MISO;
for(i=8;i>0;i--)
{
 3OUT|=MF522_SCK; //MF522_SCK = 1;
ucResult <<= 1;
__delay_cycles(8);
ucResult|=((P3IN&MF522_MISO)==MF522_MISO); //ucResult|=(bit)MF522_MISO;
 3OUT&=~MF522_SCK; //MF522_SCK = 0;
__delay_cycles(8);
}
 3OUT|=MF522_NSS; //MF522_NSS = 1;
 3OUT|=MF522_SCK; //MF522_SCK = 1;
return ucResult;
}
/////////////////////////////////////////////////////////////////////
//功 能:写RC522寄存器
//参数说明:Address[IN]:寄存器地址
// value[IN]:写入的值
/////////////////////////////////////////////////////////////////////
void WriteRawRC(unsigned char Address, unsigned char value)
{
unsigned char i, ucAddr;
P3OUT&=~MF522_SCK; //MF522_SCK = 0;
P3OUT&=~MF522_NSS; //MF522_NSS = 0;
ucAddr = ((Address<<1)&0x7E);
for(i=8;i>0;i--)
{
if(ucAddr&0x80) P3OUT|=MF522_MOSI;
else P3OUT&=~MF522_MOSI;
__delay_cycles(10);
P3OUT|=MF522_SCK; //MF522_SCK = 1;
ucAddr <<= 1;
P3OUT&=~MF522_SCK; //MF522_SCK = 0;
__delay_cycles(8);
}
for(i=8;i>0;i--)
{
if(value&0x80) P3OUT|=MF522_MOSI;
else P3OUT&=~MF522_MOSI;
P3OUT|=MF522_SCK; //MF522_SCK = 1;
__delay_cycles(10);
value <<= 1;
P3OUT&=~MF522_SCK; //MF522_SCK = 0;
__delay_cycles(8);
}
P3OUT|=MF522_NSS; //MF522_NSS = 1;
P3OUT|=MF522_SCK; //MF522_SCK = 1;
}
还有一个地方就是这个函数,里面有一个等待时间,时间太短一样不能正确读取到卡
/////////////////////////////////////////////////////////////////////
//功 能:通过RC522和ISO14443卡通讯
//参数说明:Command[IN]:RC522命令字
// pInData[IN]:通过RC522发送到卡片的数据
// InLenByte[IN]:发送数据的字节长度
// pOutData[OUT]:接收到的卡片返回数据
// *pOutLenBit[OUT]:返回数据的位长度
/////////////////////////////////////////////////////////////////////
char PcdComMF522(unsigned char Command,
unsigned char *pInData,
unsigned char InLenByte,
unsigned char *pOutData,
unsigned int *pOutLenBit)
一周热门 更多>