久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機MFRC522程序注釋
[打印本頁]
作者:
錢錢錢錢錢啊
時間:
2018-11-10 20:14
標題:
51單片機MFRC522程序注釋
單片機源程序如下(帶有詳細的代碼注釋):
#include <intrins.h>
#include "reg52.h"
#include "main.h"
#include "mfrc522.h"
#include <string.h>
#define MAXRLEN 18
/******* RxModeReg默認為106kbit/s的通信速率 ******************/
/***********************************************************************
* 功 能:尋卡
* 參數說明: req_code[IN]:尋卡方式
* 0x52 = 尋感應區內所有符合14443A標準的卡
* 0x26 = 尋未進入休眠狀態的卡
* pTagType[OUT]:卡片類型代碼
* 0x4400 = Mifare_UltraLight
* 0x0400 = Mifare_One(S50)
* 0x0200 = Mifare_One(S70)
* 0x0800 = Mifare_Pro(X)
* 0x4403 = Mifare_DESFire
* 返 回: 成功返回MI_OK
***********************************************************************/
char PcdRequest(unsigned char req_code,unsigned char *pTagType)
{
char status;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
// unsigned char xTest ;
ClearBitMask(Status2Reg,0x08); // 清MFCrypto1On,只能通過軟件清零,該位用來指示Crypto1的接通情況,MFAuthent(驗證密鑰)命令成功執行后置1
WriteRawRC(BitFramingReg,0x07); // TxLastBits([2-0])表示發送的最后一個字節7位發送
// xTest = ReadRawRC(BitFramingReg);
// if(xTest == 0x07 )
// { LED_GREEN =0 ;}
// else {LED_GREEN =1 ;while(1){}}
SetBitMask(TxControlReg,0x03); // TxControlReg低2位(Tx2RFEn和Tx1RFEn)置1,Tx2和Tx1管腳輸出信號調制在13.56MHz的載波上
ucComMF522Buf[0] = req_code;
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen); // PCD_TRANSCEIVE == 0x0c發送并接收數據
// if(status == MI_OK )
// { LED_GREEN =0 ;}
// else {LED_GREEN =1 ;}
if ((status == MI_OK) && (unLen == 0x10)) // 發送成功并且接收16位數據
{
*pTagType = ucComMF522Buf[0];
*(pTagType+1) = ucComMF522Buf[1]; // 接收的卡片類型保存在pTagType中
}
else
{ status = MI_ERR; }
return status;
}
/**********************************************************************
* 功 能:防沖撞
* 參數說明: pSnr[OUT]:卡片序列號,4字節
* 返 回: 成功返回MI_OK
**********************************************************************/
char PcdAnticoll(unsigned char *pSnr)
{
char status;
unsigned char i,snr_check=0;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08); // 清MFCrypto1On,只能通過軟件清零,該位用來指示Crypto1的接通情況,MFAuthent(驗證密鑰)命令成功執行后置1
WriteRawRC(BitFramingReg,0x00); // TxLastBits([2-0])表示發送的最后一個字節的所有位都發送
ClearBitMask(CollReg,0x80); // 高位置0,所有接收的位在沖突后清除
ucComMF522Buf[0] = PICC_ANTICOLL1; // 防沖撞(0x93)
ucComMF522Buf[1] = 0x20;
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);
if (status == MI_OK)
{
for (i=0; i<4; i++)
{
*(pSnr+i) = ucComMF522Buf[i]; // 讀取卡片序列號
snr_check ^= ucComMF522Buf[i];
}
if (snr_check != ucComMF522Buf[i])
{ status = MI_ERR; }
}
SetBitMask(CollReg,0x80); // 置1,回歸正常
return status;
}
/**********************************************************************
* 功 能:選定卡片
* 參數說明: pSnr[IN]:卡片序列號,4字節
* 返 回: 成功返回MI_OK
**********************************************************************/
char PcdSelect(unsigned char *pSnr)
{
char status;
unsigned char i;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_ANTICOLL1; // 防沖撞
ucComMF522Buf[1] = 0x70;
ucComMF522Buf[6] = 0;
for (i=0; i<4; i++)
{
ucComMF522Buf[i+2] = *(pSnr+i); // 將卡片序列號寫進去
ucComMF522Buf[6] ^= *(pSnr+i);
}
CalulateCRC(ucComMF522Buf,7,&ucComMF522Buf[7]); // CRC校驗卡片序列號
ClearBitMask(Status2Reg,0x08); // 清MFCrypto1On,只能通過軟件清零,該位用來指示Crypto1的接通情況,MFAuthent(驗證密鑰)命令成功執行后置1
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,9,ucComMF522Buf,&unLen); // 發送卡片的序列號及其校驗碼
if ((status == MI_OK) && (unLen == 0x18)) // 接收24位
{ status = MI_OK; }
else
{ status = MI_ERR; }
return status;
}
/**********************************************************************
* 功 能:驗證卡片密碼
* 參數說明: auth_mode[IN]: 密碼驗證模式
* 0x60 = 驗證A密鑰
* 0x61 = 驗證B密鑰
* addr[IN]:塊地址
* pKey[IN]:密碼
* pSnr[IN]:卡片序列號,4字節
* 返 回: 成功返回MI_OK
**********************************************************************/
char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
{
char status;
unsigned int unLen;
unsigned char i,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = auth_mode; // 驗證模式
ucComMF522Buf[1] = addr; // 塊地址
for (i=0; i<6; i++)
{ ucComMF522Buf[i+2] = *(pKey+i); } // 密碼
for (i=0; i<4; i++) /*源代碼是6,不知道正不正確*/
{ ucComMF522Buf[i+8] = *(pSnr+i); } // 防沖撞卡號
// memcpy(&ucComMF522Buf[2], pKey, 6);
// memcpy(&ucComMF522Buf[8], pSnr, 4);
status = PcdComMF522(PCD_AUTHENT,ucComMF522Buf,12,ucComMF522Buf,&unLen);
if ((status != MI_OK) || (!(ReadRawRC(Status2Reg) & 0x08)))
{ status = MI_ERR; }
return status;
}
/**********************************************************************
* 功 能:讀取M1卡一塊數據
* 參數說明: addr[IN]:塊地址
* pData[OUT]:讀出的數據,16字節
* 返 回: 成功返回MI_OK
***********************************************************************/
char PcdRead(unsigned char addr,unsigned char *pData)
{
char status;
unsigned int unLen;
unsigned char i,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_READ; // 0x30,讀塊
ucComMF522Buf[1] = addr;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); // 計算CRC,存放在ucComMF522Buf[2]和ucComMF522Buf[3]中
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); // 將4個字節放松出去,并接收數據
if ((status == MI_OK) && (unLen == 0x90)) // 接收144位(18字節)
// { memcpy(pData, ucComMF522Buf, 16); }
{
for (i=0; i<16; i++)
{ *(pData+i) = ucComMF522Buf[i]; } // 將前16字節讀出
}
else
{ status = MI_ERR; }
return status;
}
/********************************************************************
* 功 能:寫數據到M1卡一塊
* 參數說明: addr[IN]:塊地址
* pData[IN]:寫入的數據,16字節
* 返 回: 成功返回MI_OK
********************************************************************/
char PcdWrite(unsigned char addr,unsigned char *pData)
{
char status;
unsigned int unLen;
unsigned char i,ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_WRITE; // 0xa0 寫塊
ucComMF522Buf[1] = addr;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); // 計算CRC
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); // 發送寫命令和地址
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) // 接收低四位為1010
{ status = MI_ERR; }
if (status == MI_OK)
{
//memcpy(ucComMF522Buf, pData, 16);
for (i=0; i<16; i++)
{ ucComMF522Buf[i] = *(pData+i); } // 16字節數據
CalulateCRC(ucComMF522Buf,16,&ucComMF522Buf[16]); // 兩位CRC計算字節
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,18,ucComMF522Buf,&unLen); // 發送18字節
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) // 返回低四位為1010
{ status = MI_ERR; }
}
return status;
}
/*********************************************************************
* 功 能:命令卡片進入休眠狀態
* 返 回: 成功返回MI_OK
*********************************************************************/
char PcdHalt(void)
{
char status;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_HALT; // 0x50,休眠
ucComMF522Buf[1] = 0;
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); // 計算校驗位
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); // 發送
return MI_OK;
}
/*********************************************************************
* 用MF522計算CRC16函數
*********************************************************************/
void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData)
{
unsigned char i,n;
ClearBitMask(DivIrqReg,0x04); // CRCIRQ清零
WriteRawRC(CommandReg,PCD_IDLE); // 空閑命令
SetBitMask(FIFOLevelReg,0x80); // FIFOLevelReg中FlushBuffer位置1,表示緩沖區讀和寫指針清除,即緩沖區無數據,用來存放一下批數據,ErrReg的BufferOvfl清楚
for (i=0; i<len; i++)
{ WriteRawRC(FIFODataReg, *(pIndata+i)); } // 將數據寫入緩沖區
WriteRawRC(CommandReg, PCD_CALCCRC); // 啟動CRC計算,結果存于CRCResultReg中
i = 0xFF;
do
{
n = ReadRawRC(DivIrqReg);
i--;
}
while ((i!=0) && !(n&0x04)); // CRCIRQ置位,當CRC有效且所有數據被處理則需要置1,退出循環,或者是執行了127次讀取認為完成CRC也退出循環
pOutData[0] = ReadRawRC(CRCResultRegL);
pOutData[1] = ReadRawRC(CRCResultRegM); // 計算結果輸出到pOutData中
}
/*********************************************************************
* 功 能:復位RC522
* 返 回: 成功返回MI_OK
*********************************************************************/
char PcdReset(void)
{
MF522_RST=1;
_nop_();
MF522_RST=0; // 復位
_nop_();
MF522_RST=1;
_nop_();
WriteRawRC(CommandReg,PCD_RESETPHASE); // 0x0F,軟件復位
_nop_();
WriteRawRC(ModeReg,0x3D); // 和Mifare卡通訊,CRC初始值0x6363
WriteRawRC(TReloadRegL,30); // 48
WriteRawRC(TReloadRegH,0);
WriteRawRC(TModeReg,0x8D); // 10001101(141):發送完開始計時,接收時停止計時,自動重裝
WriteRawRC(TPrescalerReg,0x3E); // 00111110(62),3390 定時時間:3391*49/6.78=24.5ms
WriteRawRC(TxAutoReg,0x40); // 控制驅動天線
return MI_OK;
}
/*********************************************************************
* 設置RC632的工作方式
*********************************************************************/
char M500PcdConfigISOType(unsigned char type)
{
if (type == 'A') //ISO14443_A
{
ClearBitMask(Status2Reg,0x08);
/* WriteRawRC(CommandReg,0x20); //as default
WriteRawRC(ComIEnReg,0x80); //as default
WriteRawRC(DivlEnReg,0x0); //as default
WriteRawRC(ComIrqReg,0x04); //as default
WriteRawRC(DivIrqReg,0x0); //as default
WriteRawRC(Status2Reg,0x0);//80 //trun off temperature sensor
WriteRawRC(WaterLevelReg,0x08); //as default
WriteRawRC(ControlReg,0x20); //as default
WriteRawRC(CollReg,0x80); //as default
*/
WriteRawRC(ModeReg,0x3D);//3F
/* WriteRawRC(TxModeReg,0x0); //as default???
WriteRawRC(RxModeReg,0x0); //as default???
WriteRawRC(TxControlReg,0x80); //as default???
WriteRawRC(TxSelReg,0x10); //as default???
*/
WriteRawRC(RxSelReg,0x86);//84 // 內部模擬部分的調制信號作為非接觸式UART輸入,發送后接收器啟動延時6個位時鐘
// WriteRawRC(RxThresholdReg,0x84);//as default
// WriteRawRC(DemodReg,0x4D); //as default
// WriteRawRC(ModWidthReg,0x13);//26
WriteRawRC(RFCfgReg,0x7F); //4F // 接收信號電壓增益23dB
/* WriteRawRC(GsNReg,0x88); //as default???
WriteRawRC(CWGsCfgReg,0x20); //as default???
WriteRawRC(ModGsCfgReg,0x20); //as default???
*/
WriteRawRC(TReloadRegL,30);//tmoLength);// TReloadVal = 'h6a =tmoLength(dec)
WriteRawRC(TReloadRegH,0);
WriteRawRC(TModeReg,0x8D);
WriteRawRC(TPrescalerReg,0x3E);
// PcdSetTmo(106);
delay(10);
PcdAntennaOn();
}
else{ return -1; }
return MI_OK;
}
/********************************************************************
* 功 能:讀RC632寄存器 SPI方式
* 參數說明:Address[IN]:寄存器地址
* 返 回:讀出的值
*********************************************************************/
unsigned char ReadRawRC(unsigned char Address)
{
unsigned char i, ucAddr;
unsigned char ucResult=0;
MF522_SCK = 0;
MF522_NSS = 0;
ucAddr = ((Address<<1)&0x7E)|0x80;
for(i=8;i>0;i--)
{
MF522_SI = ((ucAddr&0x80)==0x80);
MF522_SCK = 1;
ucAddr <<= 1;
MF522_SCK = 0;
}
for(i=8;i>0;i--)
{
MF522_SCK = 1;
ucResult <<= 1;
ucResult|=(bit)MF522_SO;
MF522_SCK = 0;
}
MF522_NSS = 1;
MF522_SCK = 1;
return ucResult;
}
/*********************************************************************
* 功 能:寫RC632寄存器
* 參數說明:Address[IN]:寄存器地址
* value[IN]:寫入的值
**********************************************************************/
void WriteRawRC(unsigned char Address, unsigned char value)
{
unsigned char i, ucAddr;
MF522_SCK = 0;
MF522_NSS = 0;
ucAddr = ((Address<<1)&0x7E); // 地址高位為0表示寫,地位必須為0
for(i=8;i>0;i--)
{
MF522_SI = ((ucAddr&0x80)==0x80);
MF522_SCK = 1;
ucAddr <<= 1;
MF522_SCK = 0;
}
for(i=8;i>0;i--)
{
MF522_SI = ((value&0x80)==0x80);
MF522_SCK = 1;
value <<= 1;
MF522_SCK = 0;
}
MF522_NSS = 1;
MF522_SCK = 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
}
/*********************************************************************
* 功 能:通過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)
{
char status = MI_ERR;
unsigned char irqEn = 0x00;
unsigned char waitFor = 0x00;
unsigned char lastBits;
unsigned char n;
unsigned int i;
switch (Command)
{
case PCD_AUTHENT: // 驗證密鑰
irqEn = 0x12;
waitFor = 0x10;
break;
case PCD_TRANSCEIVE: // 發送并接收數據
irqEn = 0x77;
waitFor = 0x30;
break;
default:
break;
}
WriteRawRC(ComIEnReg,irqEn|0x80); // ComIEnReg:中斷請求的使能位。驗證密鑰:(10010010)位7:管腳IRQ與Status1Reg的IRq反相。位4:允許空閑中斷請求(IdleIRq位)傳遞到IRQ管腳上。位1:允許錯誤中斷請求(ErrIRq位)傳遞到IRQ管腳上。
// 發送并接收數據:(11110111)除高位中斷請求外,其他都能傳到IRQ管腳上
ClearBitMask(ComIrqReg,0x80); // ComIrqReg的屏蔽位清零
WriteRawRC(CommandReg,PCD_IDLE); // CommandReg低4位寫0000B,處于空閑模式
SetBitMask(FIFOLevelReg,0x80); // FIFOLevelReg中FlushBuffer位置1,表示緩沖區讀和寫指針清除,即緩沖區無數據,用來存放一下批數據,ErrReg的BufferOvfl清除
for (i=0; i<InLenByte; i++)
{
WriteRawRC(FIFODataReg, pInData[i]); // 將pInData數組的數據寫進FIFO緩沖區
}
WriteRawRC(CommandReg, Command); // 驗證密鑰 or 發送并接收數據
if (Command == PCD_TRANSCEIVE)
{ SetBitMask(BitFramingReg,0x80); } // 啟動數據的發送
// i = 600;//根據時鐘頻率調整,操作M1卡最大等待時間25ms
i = 2000;
do
{
n = ReadRawRC(ComIrqReg);
i--;
}
while ((i!=0) && !(n&0x01) && !(n&waitFor)); //如果i不為0,并且定時器沒減到0,并且沒有未知命令和自身終止命令和接收器沒有檢測到有效數據流,就繼續循環,退出循環則表示接收完成
ClearBitMask(BitFramingReg,0x80); // StartSend位清零
if (i!=0)
{
if(!(ReadRawRC(ErrorReg)&0x1B)) // FIFO沒有溢出、接收器啟動并完成接收之后:(沒沖突)、(CRC沒出錯)、(沒有SOF錯誤)、(驗證時接受字節數沒錯)
{
status = MI_OK;
if (n & irqEn & 0x01) // 發送并接收數據、定時器減到0
{ status = MI_NOTAGERR; } // 沒有找到目標錯誤
if (Command == PCD_TRANSCEIVE)
{
n = ReadRawRC(FIFOLevelReg); // 讀FIFO保存的字節數
lastBits = ReadRawRC(ControlReg) & 0x07; // 最后一個接收的字節的有效位數(0則表示8位都有效)
if (lastBits)
{ *pOutLenBit = (n-1)*8 + lastBits; }
else
{ *pOutLenBit = n*8; }
if (n == 0)
{ n = 1; }
if (n > MAXRLEN)
{ n = MAXRLEN; }
for (i=0; i<n; i++)
{ pOutData[i] = ReadRawRC(FIFODataReg); } // 將緩沖區的數據讀出
}
}
else
{ status = MI_ERR; } // 驗證錯誤
}
SetBitMask(ControlReg,0x80); // stop timer now
WriteRawRC(CommandReg,PCD_IDLE); // 空閑
return status;
}
/********************************************************************
* 開啟天線
* 每次啟動或關閉天險發射之間應至少有1ms的間隔
********************************************************************/
void PcdAntennaOn()
{
unsigned char i;
i = ReadRawRC(TxControlReg);
if (!(i & 0x03))
{
SetBitMask(TxControlReg, 0x03); // Tx1和Tx2管腳的輸出信號調制到13.56MHz的載波上
}
}
/********************************************************************
* 關閉天線
********************************************************************/
void PcdAntennaOff()
{
ClearBitMask(TxControlReg, 0x03);
}
/*********************************************************************
* 功 能:扣款和充值
* 參數說明: dd_mode[IN]:命令字
* 0xC0 = 扣款
* 0xC1 = 充值
* addr[IN]:錢包地址
* pValue[IN]:4字節增(減)值,低位在前
* 返 回: 成功返回MI_OK
*********************************************************************/
char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue)
{
char status;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = dd_mode; // 充值還是扣款(加還是減)
ucComMF522Buf[1] = addr; // 錢包地址(寫卡的地址)
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); // 計算CRC
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); // 發送數據并接收數據
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) // 卡片返回1010
{ status = MI_ERR; }
if (status == MI_OK)
{
//(ucComMF522Buf, pValue, 4);
for (i=0; i<4; i++) //16
{ ucComMF522Buf[i] = *(pValue+i); }
CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
unLen = 0;
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen); // 發送充或者扣的數據
if (status != MI_ERR)
{ status = MI_OK; }
}
if (status == MI_OK)
{
ucComMF522Buf[0] = PICC_TRANSFER; // 保存緩沖區中的數據
ucComMF522Buf[1] = addr; // 地址
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); // 計算crc
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); // 發送保存緩沖區數據的命令
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A)) // 卡片返回1010B
{ status = MI_ERR; }
}
return status;
}
/**********************************************************************
* 功 能:備份錢包
* 參數說明: sourceaddr[IN]:源地址
* goaladdr[IN]:目標地址
* 返 回: 成功返回MI_OK
**********************************************************************/
char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr)
{
char status;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ucComMF522Buf[0] = PICC_RESTORE; // 0xC2,調塊數據到緩沖區
ucComMF522Buf[1] = sourceaddr; // 源地址
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]); // 計算CRC
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); // 發送命令:將源地址的數據調到緩沖區
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
{ status = MI_ERR; }
if (status == MI_OK)
{
ucComMF522Buf[0] = 0;
ucComMF522Buf[1] = 0;
ucComMF522Buf[2] = 0;
ucComMF522Buf[3] = 0;
CalulateCRC(ucComMF522Buf,4,&ucComMF522Buf[4]);
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,6,ucComMF522Buf,&unLen);
if (status != MI_ERR)
{ status = MI_OK; }
}
if (status != MI_OK)
{ return MI_ERR; }
ucComMF522Buf[0] = PICC_TRANSFER; // 保存緩沖區內容命令
ucComMF522Buf[1] = goaladdr; // 目標地址
CalulateCRC(ucComMF522Buf,2,&ucComMF522Buf[2]);
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,4,ucComMF522Buf,&unLen); // 發送命令:將緩沖區的內容發送到目標地址
if ((status != MI_OK) || (unLen != 4) || ((ucComMF522Buf[0] & 0x0F) != 0x0A))
{ status = MI_ERR; }
return status;
}
/*
///////////////////////////////////////////////////////////////////////
// Delay 10ms
///////////////////////////////////////////////////////////////////////
void delay_10ms(unsigned int _10ms)
{
#ifndef NO_TIMER2
RCAP2LH = RCAP2_10ms;
T2LH = RCAP2_10ms;
TR2 = TRUE;
while (_10ms--)
{
while (!TF2);
TF2 = FALSE;
}
TR2 = FALSE;
#else
while (_10ms--)
{
delay_50us(19);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid )
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(19);
if (CmdValid)
return;
}
#endif
}
*/
復制代碼
所有資料51hei提供下載:
mfrc522程序注釋.doc
(23.44 KB, 下載次數: 57)
2018-11-10 20:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
MFRC500中文資料.pdf
(1.7 MB, 下載次數: 36)
2018-11-10 20:14 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
51單片機RC522射頻卡驅動.docx
(21.9 KB, 下載次數: 53)
2018-11-10 20:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
精品久久久久久亚洲综合网站
|
欧美亚洲国产一区二区三区
|
中文字幕在线观看视频网站
|
国产成人一区二区三区久久久
|
91av视频在线免费观看
|
久久久久久av
|
日本在线中文
|
久久国产日韩
|
欧美一级www片免费观看
|
日韩精品在线免费观看视频
|
久久国产精品久久久久久
|
一级毛片在线播放
|
国产乱人伦精品一区二区
|
亚洲一一在线
|
国内自拍第一页
|
韩国久久
|
欧美极品在线
|
国产精品日产欧美久久久久
|
午夜精品久久久久久久久久久久
|
久久精品在线
|
国产98色在线 | 日韩
|
国产精品欧美一区二区三区不卡
|
a级大毛片
|
国产三区在线观看视频
|
9久久精品
|
国产一区二区久久久
|
国产农村妇女毛片精品久久麻豆
|
九九精品在线
|
一区二区亚洲
|
夜夜草av
|
麻豆一区一区三区四区
|
色婷婷久久久久swag精品
|
亚洲一区二区三区久久久
|
国产精品二区三区在线观看
|
国产一区不卡在线观看
|
欧美成人一区二区
|
亚洲视频在线看
|
日本久久一区
|
久久久国产一区二区三区
|
久久久久一区二区
|
国产免费福利
|