版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
wordword/word1.
硬件接口介绍根据上一篇的介绍,小编使用了RC522的SPI口通信方式和51单片机进展通信。硬件接口设计此处不再附图。只是将接口配置列写如下:sbit
spi_cs=P1^6;sbit
spi_ck=P1^5;sbit
spi_mosi=P1^4;sbit
spi_miso=P1^3;sbit
spi_rst=P1^2;
#define
SET_SPI_CS
spi_cs=1#define
CLR_SPI_CS
spi_cs=0#define
SET_SPI_CK
spi_ck=1#define
CLR_SPI_CK
spi_ck=0#define
SET_SPI_MOSI
spi_mosi=1#define
CLR_SPI_MOSI
spi_mosi=0#define
STU_SPI_MISO
spi_miso#define
SET_RC522RST
spi_rst=1#define
CLR_RC522RST
spi_rst=0
2.
51单片机模拟SPI通信函数
void
delay_ns(unsigned
int
data
ns){
unsigned
int
xdata
i;
for(i=0;i
{
nop();
nop();
nop();
}}
unsigned
char
SPIReadByte(void){
unsigned
char
idata
SPICount;
//
Counter
used
to
clock
out
the
data
unsigned
char
idata
SPIData;
SPIData
=
0;
for
(SPICount
=
0;
SPICount
<
8;
SPICount++)
//
Prepare
to
clock
in
the
data
to
be
read
{
SPIData
<<=1;
//
Rotate
the
data
CLR_SPI_CK;
nop();nop();
//
Raise
the
clock
to
clock
the
data
out
of
the
MAX7456
if(STU_SPI_MISO)
{
SPIData|=0x01;
}
SET_SPI_CK;
nop();nop();
//
Drop
the
clock
ready
for
the
next
bit
}
//
and
loop
back
return
(SPIData);
//
Finally
return
the
read
data}
void
SPIWriteByte(unsigned
char
data
SPIData){
unsigned
char
idata
SPICount;
//
Counter
used
to
clock
out
the
data
for
(SPICount
=
0;
SPICount
<
8;
SPICount++)
{
if
(SPIData
&
0x80)
{
SET_SPI_MOSI;
}
else
{
CLR_SPI_MOSI;
}
nop();nop();
CLR_SPI_CK;nop();nop();
SET_SPI_CK;nop();nop();
SPIData
<<=
1;
}
}
3.RC522芯片的存放器、命令字等定义
这些宏定义都是根据RC522数据手册编写的代码。
3.2.
RC522存放器地址定义
4.
Rc522的14443协议代码驱动程序
char
PcdRequest(unsigned
char
data
req_code,unsigned
char
*pTagType){
char
idata
status;
unsigned
int
idata
unLen;unsigned
char
xdata
ucMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08);WriteRawRC(BitFramingReg,0x07);SetBitMask(TxControlReg,0x03);
ucMF522Buf[0]
=
req_code;
status
=
PcdMF522(PCD_TRANSCEIVE,ucMF522Buf,1,ucMF522Buf,&unLen);
if
((status
==
MI_OK)
&&
(unLen
==
0x10)){
*pTagType
=
ucMF522Buf[0];*(pTagType+1)
=
ucMF522Buf[1];}else{
status
=
MI_ERR;
}
return
status;}
char
PcdAnticoll(unsigned
char
*pSnr){
char
xdata
status;
unsigned
char
xdata
i,snr_check=0;
unsigned
int
xdata
unLen;
unsigned
char
xdata
ucMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08);
WriteRawRC(BitFramingReg,0x00);
ClearBitMask(CollReg,0x80);
ucMF522Buf[0]
=
PICC_ANTICOLL1;
ucMF522Buf[1]
=
0x20;
status
=
PcdMF522(PCD_TRANSCEIVE,ucMF522Buf,2,ucMF522Buf,&unLen);
if
(status
==
MI_OK)
{
for
(i=0;
i<4;
i++)
{
*(pSnr+i)
=
ucMF522Buf[i];
snr_check
^=
ucMF522Buf[i];
}
if
(snr_check
!=
ucMF522Buf[i])
{
status
=
MI_ERR;
}
}
SetBitMask(CollReg,0x80);
return
status;}
char
PcdSelect(unsigned
char
*pSnr){
char
xdata
status;
unsigned
char
xdata
i;
unsigned
int
xdata
unLen;
unsigned
char
xdata
ucMF522Buf[MAXRLEN];
ucMF522Buf[0]
=
PICC_ANTICOLL1;
ucMF522Buf[1]
=
0x70;
ucMF522Buf[6]
=
0;
for
(i=0;
i<4;
i++)
{
ucMF522Buf[i+2]
=
*(pSnr+i);
ucMF522Buf[6]
^=
*(pSnr+i);
}
CalulateCRC(ucMF522Buf,7,&ucMF522Buf[7]);
ClearBitMask(Status2Reg,0x08);
status
=
PcdMF522(PCD_TRANSCEIVE,ucMF522Buf,9,ucMF522Buf,&unLen);
if
((status
==
MI_OK)
&&
(unLen
==
0x18))
{
status
=
MI_OK;
}
else
{
status
=
MI_ERR;
}
return
status;}
char
PcdAuthState(unsigned
char
data
auth_mode,unsigned
char
data
addr,unsigned
char
*pKey,unsigned
char
*pSnr){
char
xdata
status;
unsigned
int
xdata
unLen;
unsigned
char
xdata
i,ucMF522Buf[MAXRLEN];
ucMF522Buf[0]
=
auth_mode;
ucMF522Buf[1]
=
addr;
for
(i=0;
i<6;
i++)
{
ucMF522Buf[i+2]
=
*(pKey+i);
}
for
(i=0;
i<6;
i++)
{
ucMF522Buf[i+8]
=
*(pSnr+i);
}
//
memcpy(&ucMF522Buf[2],
pKey,
6);
//
memcpy(&ucMF522Buf[8],
pSnr,
4);
status
=
PcdMF522(PCD_AUTHENT,ucMF522Buf,12,ucMF522Buf,&unLen);
if
((status
!=
MI_OK)
||
(!(ReadRawRC(Status2Reg)
&
0x08)))
{
status
=
MI_ERR;
}
return
status;}M1卡一块数据
char
PcdRead(unsigned
char
data
addr,unsigned
char
*pData){
char
idata
status;
unsigned
int
idata
unLen;
unsigned
char
idata
i,ucMF522Buf[MAXRLEN];
ucMF522Buf[0]
=
PICC_READ;
ucMF522Buf[1]
=
addr;
CalulateCRC(ucMF522Buf,2,&ucMF522Buf[2]);
status
=
PcdMF522(PCD_TRANSCEIVE,ucMF522Buf,4,ucMF522Buf,&unLen);
if
((status
==
MI_OK)
&&
(unLen
==
0x90))
//
{
memcpy(pData,
ucMF522Buf,
16);
}
{
for
(i=0;
i<16;
i++)
{
*(pData+i)
=
ucMF522Buf[i];
}
}
else
{
status
=
MI_ERR;
}
return
status;}M1卡一块
char
PcdWrite(unsigned
char
data
addr,unsigned
char
*pData){
char
idata
status;
unsigned
int
idata
unLen;
unsigned
char
idata
ucMF522Buf[MAXRLEN];
ucMF522Buf[0]
=
PICC_WRITE;
ucMF522Buf[1]
=
addr;
CalulateCRC(ucMF522Buf,2,&ucMF522Buf[2]);
status
=
PcdMF522(PCD_TRANSCEIVE,ucMF522Buf,4,ucMF522Buf,&unLen);
if
((status
!=
MI_OK)
||
(unLen
!=
4)
||
((ucMF522Buf[0]
&
0x0F)
!=
0x0A))
{
status
=
MI_ERR;
}
if
(status
==
MI_OK)
{
memcpy(ucMF522Buf,
pData,
16);
//
for
(i=0;
i<16;
i++)
//
{
//
ucMF522Buf[i]
=
*(pData+i);
//
}
CalulateCRC(ucMF522Buf,16,&ucMF522Buf[16]);
status
=
PcdMF522(PCD_TRANSCEIVE,ucMF522Buf,18,ucMF522Buf,&unLen);
if
((status
!=
MI_OK)
||
(unLen
!=
4)
||
((ucMF522Buf[0]
&
0x0F)
!=
0x0A))
{
status
=
MI_ERR;
}
}
return
status;}
char
PcdHalt(void){
char
idata
status;
unsigned
int
idata
unLen;
unsigned
char
idata
ucMF522Buf[MAXRLEN];
ucMF522Buf[0]
=
PICC_HALT;
ucMF522Buf[1]
=
0;
CalulateCRC(ucMF522Buf,2,&ucMF522Buf[2]);
status
=
PcdMF522(PCD_TRANSCEIVE,ucMF522Buf,4,ucMF522Buf,&unLen);
return
MI_OK;}
RC522计算CRC16
void
CalulateCRC(unsigned
char
*pIndata,unsigned
char
data
len,unsigned
char
*pOutData){
unsigned
char
idata
i,n;
ClearBitMask(DivIrqReg,0x04);
WriteRawRC(mandReg,PCD_IDLE);
SetBitMask(FIFOLevelReg,0x80);
for
(i=0;
i
{
WriteRawRC(FIFODataReg,
*(pIndata+i));
}
WriteRawRC(mandReg,
PCD_CALCCRC);
i
=
0xFF;
do
{
n
=
ReadRawRC(DivIrqReg);
i--;
}
while
((i!=0)
&&
!(n&0x04));
pOutData[0]
=
ReadRawRC(CRCResultRegL);
pOutData[1]
=
ReadRawRC(CRCResultRegM);}
复位RC522
char
PcdReset(void){//PORTD|=(1<<RC522RST);SET_RC522RST;
delay_ns(10);//PORTD&=~(1<<RC522RST);CLR_RC522RST;
delay_ns(10);//PORTD|=(1<<RC522RST);SET_RC522RST;
delay_ns(10);
WriteRawRC(mandReg,PCD_RESETPHASE);
delay_ns(10);
WriteRawRC(ModeReg,0x3D);
//ºÍMifare¿¨Í¨Ñ¶£¬CRC³õʼֵ0x6363
WriteRawRC(TReloadRegL,30);
WriteRawRC(TReloadRegH,0);
WriteRawRC(TModeReg,0x8D);
WriteRawRC(TPrescalerReg,0x3E);
WriteRawRC(TxAutoReg,0x40);//±ØÐëÒª
return
MI_OK;}
设置RC522工作方式
char
M500PcdConfigISOType(unsigned
char
data
type){
if
(type
==
'A')
//ISO14443_A
{
ClearBitMask(Status2Reg,0x08);
WriteRawRC(ModeReg,0x3D);//3F
WriteRawRC(RxSelReg,0x86);//84
WriteRawRC(RFCfgReg,0x7F);
//4F
WriteRawRC(TReloadRegL,30);//tmoLength);//
TReloadVal
=
'h6a
=tmoLength(dec)
WriteRawRC(TReloadRegH,0);
WriteRawRC(TModeReg,0x8D);
WriteRawRC(TPrescalerReg,0x3E);
delay_ns(1000);
PcdAntennaOn();
}
else{
return
-1;
}
return
MI_OK;}
读RC522存放器
unsigned
char
ReadRawRC(unsigned
char
data
Address){
unsigned
char
xdata
ucAddr;
unsigned
char
xdata
ucResult=0;CLR_SPI_CS;
ucAddr
=
((Address<<1)&0x7E)|0x80;
SPIWriteByte(ucAddr);ucResult=SPIReadByte();SET_SPI_CS;
return
ucResult;}
写RC522存放器
void
WriteRawRC(unsigned
char
data
Address,
unsigned
char
data
value){
unsigned
char
xdata
ucAddr;
CLR_SPI_CS;
ucAddr
=
((Address<<1)&0x7E);
SPIWriteByte(ucAddr);SPIWriteByte(value);SET_SPI_CS;}
置和清RC522存放器位
RC522与ISO14443卡通讯
char
PcdMF522(unsigned
char
data
mand,
unsigned
char
*pInData,
unsigned
char
data
InLenByte,
unsigned
char
*pOutData,
unsigned
int
*pOutLenBit){
char
data
status
=
MI_ERR;
unsigned
char
data
irqEn
=
0x00;
unsigned
char
data
waitFor
=
0x00;
unsigned
char
data
lastBits;
unsigned
char
data
n;
unsigned
int
data
i;
switch
(mand)
{
case
PCD_AUTHENT:irqEn
=
0x12;waitFor
=
0x10;break;case
PCD_TRANSCEIVE:irqEn
=
0x77;waitFor
=
0x30;break;default:break;
}
WriteRawRC(IEnReg,irqEn|0x80);
ClearBitMask(IrqReg,0x80);
WriteRawRC(mandReg,PCD_IDLE);
SetBitMask(FIFOLevelReg,0x80);
for
(i=0;
i
{
WriteRawRC(FIFODataReg,
pInData[i]);
}
WriteRawRC(mandReg,
mand);
if
(mand
==
PCD_TRANSCEIVE)
{
SetBitMask(BitFramingReg,0x80);
}
//i
=
600;//¸ù¾ÝʱÖÓƵÂʵ÷Õû£¬²Ù×÷M1¿¨×î´óµÈ´ýʱ¼ä25msi
=
2000;
do
{
n
=
ReadRawRC(IrqReg);
i--;
}
while
((i!=0)
&&
!(n&0x01)
&&
!(n&waitFor));
ClearBitMask(BitFramingReg,0x80);
if
(i!=0)
{
if(!(ReadRawRC(ErrorReg)&0x1B))
{
status
=
MI_OK;
if
(n
&
irqEn
&
0x01)
{
status
=
MI_NOTAGERR;
}
if
(mand
==
PCD_TRANSCEIVE)
{
n
=
ReadRawRC(FIFOLevelReg);
lastBits
=
ReadRawRC(ControlReg)
&
0x07;
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
{
pOutData[i]
=
ReadRawRC(FIFODataReg);
}
}
}
else
{
status
=
MI_ERR;
}
}
SetBitMask(ControlReg,0x80);
//
stop
timer
now
WriteRawRC(mandReg,PCD_IDLE);
return
status;}
天线开启和关闭
扣款和充值
char
PcdValue(unsigned
char
data
dd_mode,unsigned
char
data
ad
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 班级消防安全工作计划
- 给父母的感谢信2篇
- 苏教版高中化学必修第一册专题二测试题含答案
- 浙江省嘉兴市嘉善县姚庄中学高三数学文月考试题含解析
- 车辆使用协议书5篇
- 人教部编版六年级语文下册快乐读书吧:漫步世界名著花园 教学设计
- 幼儿园大班工作计划12篇
- 领班转正申请书6篇
- 体育教育实习自我总结例文3篇
- 黑龙江省哈尔滨市方正第一中学高三数学理下学期摸底试题含解析
- HJ 1226-2021 水质 硫化物的测定 亚甲基蓝分光光度法(正式版)
- 湖南省益阳市资阳区郭鹿坪镇中学 2023-2024学年九年级下学期4月期中道德与法治试题
- 河南省郑州市2024届高中毕业年级第二次质量预测语文试题及答案
- 《电工装备供应商数据采集及接口规范第13部分光纤复合架空地线、光纤复合架空相线》编制说明
- 沪科版九年级物理全册《全球变暖与水资源危机》课件
- 银行地震演练疏散演练方案
- 2022-2023学年黑龙江省齐齐哈尔市铁锋区八年级下学期期中物理试题
- 周杰伦ppt.ppt
- 公文写作素材:统战工作材料写作提纲40例
- 工程监理收费计算器
- 河北省各市地图(可编辑地图PPT).ppt
评论
0/150
提交评论