|
|
void MFWriteReg(uchar reg,uchar dat)//向某個(gè)寄存器寫(xiě)數(shù)據(jù)
{
uchar i,addr;
MF_SCK=0;
MF_CS=0;
addr=((reg<<1)&0x7e);//寫(xiě)寄存時(shí)地址最高位為0,地址格式為0xxxxxxx0
for(i=0;i<8;i++)
{
MF_MOSI=((addr&0x80)==0x80);//從高位開(kāi)始寫(xiě)
MF_SCK=1;
addr<<=1;
MF_SCK=0;//下降沿寫(xiě)一位
}
for(i=0;i<8;i++)
{
MF_MOSI=((dat&0x80)==0x80);
MF_SCK=1;
dat<<=1;
MF_SCK=0;
}
MF_CS=1;
MF_SCK=1;
}
uchar MFReadReg(uchar reg)//從某個(gè)寄存器讀數(shù)據(jù)
{
uchar i,addr;
uchar dat=0;
MF_SCK=0;
MF_CS=0;
addr=((reg<<1)&0x7E) | 0x80;//讀寄存器時(shí)地址最高位為1,地址格式為1xxxxxxx0
for(i=0;i<8;i++)
{
MF_MOSI=((addr&0x80)==0x80);
MF_SCK=1;
addr<<=1;
MF_SCK=0;
}
for(i=0;i<8;i++)
{
MF_SCK=1;
dat<<=1;
dat|=(bit)MF_MISO;
MF_SCK=0;
}
MF_CS=1;
MF_SCK=1;
return dat;
}
/////////////以上是我的讀寫(xiě)寄存器函數(shù)////////////////
void MFInit()//MFRC522初始化
{
MF_RST=1;//復(fù)位口上電,允許復(fù)位
MFReset();
MFWriteReg(TModeReg,0x8d);//定時(shí)器自啟動(dòng),定時(shí)器遞減到0時(shí)TimerIRq置位,0~3位為T(mén)PreScaler高4位
MFWriteReg(TPrescalerReg,0x3e);//預(yù)分頻器設(shè)定,0~7位為T(mén)PreScaler低8位,f(Timer) = 6.78MHz/TPreScaler
MFWriteReg(TReloadRegL,0x1e);//計(jì)數(shù)器重裝值
MFWriteReg(TReloadRegH,0x00);
MFWriteReg(TxAutoReg,0x40);//100%應(yīng)答
MFWriteReg(ModeReg,0x3D);//CRC預(yù)置值0x6363 SIGIN高電平有效
MFAntennaOn();
}
///////以上是初始化函數(shù)//////
void ICManagement()//IC卡管理
{
uchar state;
MFInit();
while(KeyValue==15)
{
OledClear();
OledShowSentence(8,3," IC-TEST ");
while(1)
{
state=MFReadReg(TReloadRegL);
Delay1ms(500);
UartSentByte(state);
}
}
}
調(diào)用函數(shù)后對(duì)“TReloadRegL”寄存器進(jìn)行讀取,但是讀取回來(lái)的都是0xFF,這是咋回事。
|
|