基于IPv6的Contiki系统入门实验全解.docx
- 文档编号:25818073
- 上传时间:2023-06-15
- 格式:DOCX
- 页数:23
- 大小:653.59KB
基于IPv6的Contiki系统入门实验全解.docx
《基于IPv6的Contiki系统入门实验全解.docx》由会员分享,可在线阅读,更多相关《基于IPv6的Contiki系统入门实验全解.docx(23页珍藏版)》请在冰豆网上搜索。
基于IPv6的Contiki系统入门实验全解
实验题目基于IPv6的Contiki系统入门实验实验时间2015/1/4
一、实验目的:
了解RFID相关知识。
掌握RFID模块自动识别IC卡工作原理。
二、实验原理及程序分析:
1、STM8S处理器概述
本实验所使用RFID模块由STM8处理器和MFRC531(高集成非接触读写芯片)两片芯片搭建而成的。
STM8是基于8位框架结构的微控制器,其CPU内核有6个内部寄存器,通过这些寄存器可高效地进行数据处理。
STM8的指令集支持80条基本语句及20种寻址模式,而且CPU的6个内部寄存器都拥有可寻址的地址。
STM8内部的FLASH程序存储器和数据EEPROM由一组通用寄存器来控制。
用户可以使用这些寄存器来编程或擦除存储器的内容、设置写保护、或者配置特定的低功耗模式。
用户也可以对器件的选项字节(Optionbyte)进行编程。
FLASH
●STM8SEEPROM分为两个存储器阵列:
─最多至128K字节的FLASH程序存储器,不同的器件容量有所不同。
─最多至2K字节的数据EEPROM(包括optionbyte-选择字节),不同的器件容量有所不同。
●编程模式
─字节编程和自动快速字节编程(没有擦除操作)
─字编程
─块编程和快速块编程(没有擦除操作)
─在编程/擦除操作结束时和发生非法编程操作时产生中断
●读同时写(RWW)功能。
该特性并不是所有STM8S器件都拥有。
●在应用编程(IAP)和在线编程(ICP)能力。
●保护特性
─存储器读保护(ROP)
─基于存储器存取安全系统(MASS密钥)的程序存储器写保护
─基于存储器存取安全系统(MASS密钥)的数据存储器写保护
─可编程的用户启动代码区域(UBC)写保护
●在待机(Halt)模式和活跃待机(Active-halt)模式下,存储器可配置为运行状态和掉电状态。
数据EEPROM(DATA)区域可用于存储用户具体项目所需的数据。
默认情况下,DATA区域是写保护的,这样可以在主程序工作在IAP模式时防止DATA区域被无意地修改。
只有使用特定的MASS密钥才能对DATA区域的写保护解锁。
2、MFR531概述
MFRC531是应用于13.56MHz非接触式通信中高集成读写卡芯片系列中的一员。
该读写卡芯片系列利用了先进的调制和解调概念,完全集成了在13.56MHz下所有类型的被动非接触式通信方式和协议。
芯片管脚兼容MFRC500、MFRC530和SLRC400。
MFRC531支持ISO/IEC14443A/B的所有层和MIFARE经典协议,以及与该标准兼容的标准。
支持®高速MIFARE非接触式通信波特率。
内部的发送器部分不需要增加有源电路就能够直接驱动近操作距离®的天线(可达100mm)。
接收器部分提供一个坚固而有效的解调和解码电路,用于ISO14443A兼容的应答器信号。
数字部分处理ISO14443A帧和错误检测(奇偶&CRC)。
此外,它还支持快速CRYPTO1加密算法,用于验证MIFARE系列产品。
与主机通信模式有8位并行和SPI模式,用户可根据不同的需求选择不同的模式,这样给读卡器/终端的设计提供了极大的灵活性。
图1.1MFRC531
特性
●高集成度的调制解调电路;
●采用少量外部器件,即可输出驱动级接至天线;
●最大工作距离100mm;
●支持ISO/IEC14443A/B和MIFARE经典协议;
●支持非接触式高速通信模式,波特率可达424kb/s;
●采用Crypto1加密算法并含有安全的非易失性内部密匙存储器;
●管脚兼容MFRC500、MFRC530和SLRC400;
●与主机通信的2种接口:
并行接口和SPI,可满足不同用户的需求;
●自动检测微处理器并行接口类型;
●灵活的中断处理;
●64字节发送和接收FIFO缓冲区;
●带低功耗的硬件复位;
●可编程定时器;
●唯一的序列号;
●用户可编程初始化配置;
●面向位和字节的帧结构;
●数字、模拟和发送器部分经独立的引脚分别供电;
●内部振荡器缓存器连接13.56MHz石英晶体;
●数字部分的电源(DVDD)可选择3.3V或5V;
●在短距离应用中,发送器(天线驱动)可以用3.3V供电。
MFRC531适用于各种基于ISO/IEC14443标准,并且要求低成本、小尺寸、高性能以及单电源的非接触式通信的应用场合。
●公共交通终端;
●手持终端;
●板上单元;
●非接触式PC终端;
●计量;
●非接触式公用电话。
并行微控制器接口自动检测连接的8位并行接口的类型。
它包含一个的双向FIFO缓冲区和一个可配置的中断输出。
这样就为连接各种MCU提供了很大的灵活性。
即使使用非常低成本的器件也能满足高速非接触式通信的要求。
带FIFO的SPI从机接口,其串行时钟SCK由主机提供。
数据处理部分执行数据的并行-串行转换。
它支持的帧包括CRC和奇偶校验。
它以完全透明的模式进行操作,因而支持ISO14443A的所有层。
状态和控制部分允许对器件进行配置以适应环境的影响并使性能调节到最佳状态。
当与MIFAREStandard和MIFARE产品通信时,使用高速CRYPTO1流密码单元和一个可靠的非易失性密匙存储器。
模拟电路包含了一个具有非常低阻抗桥驱动器输出的发送部分。
这使得最大操作距离可达100mm。
接收器可以检测到并解码非常弱的应答信号。
由于采用了非常先进的技术,接收器已不再是限制操作距离的因素了。
该器件为32脚SO封装。
器件使用了3个独立的电源以实现在EMC特性和信号解耦方面达到最佳性能。
MFRC531具有出色的RF性能并且模拟和数字部分可适应不同的操作电压。
非接触式天线使用以下4个管脚:
为了驱动天线,MFRC531通过TX1和TX2提供13.56MHz的能量载波。
根据寄存器的设定对发送数据进行调制得到发送的信号。
卡采用RF场的负载调制进行响应。
天线拾取的信号经过天线匹配电路送到RX脚。
MFRC531内部接收器对信号进行检测和解调并根据寄存器的设定进行处理。
然后数据发送到并行接口由微控制器进行读取。
MFRC531支持MIFARE有源天线的概念。
它可以处理管脚甅FIN和MFOUT处的MIFARE核心®模块的基带信号NPAUSE和KOMP。
MIFARE接口可采用下列方式与甅FRC531的模拟或数字部分单独通信:
●模拟电路可通过MIFARE接口独立使用。
这种情况下,MFIN连接到外部产生的NPAUSE信号。
MFOUT提供KOMP信号。
●数字电路可通过MIFARE接口驱动外部信号电路。
这种情况下,甅FOUT提供内部产生的NPAUSE信号而MFIN连接到外部输入的KOMP信号。
4线SPI接口:
代码实现如下
/////////////////////////////////////////////////////////////////////
//功能:
寻卡
//参数说明:
req_code[IN]:
寻卡方式
//0x52=寻感应区内所有符合14443A标准的卡
//0x26=寻未进入休眠状态的卡
//pTagType[OUT]:
卡片类型代码
//0x4400=Mifare_UltraLight
//0x0400=Mifare_One(S50)
//0x0200=Mifare_One(S70)
//0x0800=Mifare_Pro
//0x0403=Mifare_ProX
//0x4403=Mifare_DESFire
//返回:
成功返回MI_OK
/////////////////////////////////////////////////////////////////////
signedcharPcdRequest(unsignedcharreq_code,unsignedchar*pTagType)
{
signedcharstatus;
structTransceiveBufferMfComData;
structTransceiveBuffer*pi;
pi=&MfComData;
MFRC531_WriteReg(RegChannelRedundancy,0x03);
MFRC531_ClearBitMask(RegControl,0x08);
MFRC531_WriteReg(RegBitFraming,0x07);
MFRC531_SetBitMask(RegTxControl,0x03);
MFRC531_SetTimer(4);
MfComData.MfCommand=PCD_TRANSCEIVE;
MfComData.MfLength=1;
MfComData.MfData[0]=req_code;
status=MFRC531_ISO14443_Transceive(pi);
if(!
status)
{
if(MfComData.MfLength!
=0x10)
{status=MI_BITCOUNTERR;}
}
*pTagType=MfComData.MfData[0];
*(pTagType+1)=MfComData.MfData[1];
returnstatus;
}
/////////////////////////////////////////////////////////////////////
//将存在RC531的EEPROM中的密钥匙调入RC531的FIFO
//input:
startaddr=EEPROM地址
/////////////////////////////////////////////////////////////////////
charPcdLoadKeyE2(unsignedintstartaddr)
{
charstatus;
structTransceiveBufferMfComData;
structTransceiveBuffer*pi;
pi=&MfComData;
MfComData.MfCommand=PCD_LOADKEYE2;
MfComData.MfLength=2;
MfComData.MfData[0]=startaddr&0xFF;
MfComData.MfData[1]=(startaddr>>8)&0xFF;
status=MFRC531_ISO14443_Transceive(pi);
returnstatus;
}
/////////////////////////////////////////////////////////////////////
//功能:
将已转换格式后的密钥送到RC531的FIFO中
//input:
keys=密钥
/////////////////////////////////////////////////////////////////////
signedcharPcdAuthKey(unsignedchar*pKeys)
{
signedcharstatus;
structTransceiveBufferMfComData;
structTransceiveBuffer*pi;
pi=&MfComData;
MFRC531_SetTimer(4);
MfComData.MfCommand=PCD_LOADKEY;
MfComData.MfLength=12;
memcpy(&MfComData.MfData[0],pKeys,12);
status=MFRC531_ISO14443_Transceive(pi);
returnstatus;
}
////////////////////////////////////////////////////////////////////////
//功能:
用存放RC531的FIFO中的密钥和卡上的密钥进行验证
//input:
auth_mode=验证方式,0x60:
验证A密钥,0x61:
验证B密钥
//block=要验证的绝对块号
//g_cSNR=序列号首地址
/////////////////////////////////////////////////////////////////////
signedcharPcdAuthState(unsignedcharauth_mode,unsignedchar
block,unsignedchar*pSnr)
{
signedcharstatus;
structTransceiveBufferMfComData;
structTransceiveBuffer*pi;
pi=&MfComData;
MFRC531_WriteReg(RegChannelRedundancy,0x0F);
MFRC531_SetTimer(4);
MfComData.MfCommand=PCD_AUTHENT1;
MfComData.MfLength=6;
MfComData.MfData[0]=auth_mode;
MfComData.MfData[1]=block;
memcpy(&MfComData.MfData[2],pSnr,4);
status=MFRC531_ISO14443_Transceive(pi);
if(status==MI_OK)
{
if(MFRC531_ReadReg(RegSecondaryStatus)&0x07)
{status=MI_BITCOUNTERR;}
else
{
MfComData.MfCommand=PCD_AUTHENT2;
MfComData.MfLength=0;
status=MFRC531_ISO14443_Transceive(pi);
if(status==MI_OK)
{
if(MFRC531_ReadReg(RegControl)&0x08)
{status=MI_OK;}
else
{status=MI_AUTHERR;}
}
}
}
returnstatus;
}
/////////////////////////////////////////////////////////////////////
//读mifare_one卡上一块(block)数据(16字节)
//input:
addr=要读的绝对块号
//output:
readdata=读出的数据
/////////////////////////////////////////////////////////////////////
signedcharPcdRead(unsignedcharaddr,unsignedchar*pReaddata)
{
signedcharstatus;
structTransceiveBufferMfComData;
structTransceiveBuffer*pi;
pi=&MfComData;
MFRC531_SetTimer(4);
MFRC531_WriteReg(RegChannelRedundancy,0x0F);
MfComData.MfCommand=PCD_TRANSCEIVE;
MfComData.MfLength=2;
MfComData.MfData[0]=PICC_READ;
MfComData.MfData[1]=addr;
status=MFRC531_ISO14443_Transceive(pi);
if(status==MI_OK)
{
if(MfComData.MfLength!
=0x80)
{status=MI_BITCOUNTERR;}
else
{memcpy(pReaddata,&MfComData.MfData[0],16);}
}
returnstatus;
}
/////////////////////////////////////////////////////////////////////
//写数据到卡上的一块{
signedcharstatus;
structTransceiveBufferMfComData;
structTransceiveBuffer*pi;
pi=&MfComData;
MFRC531_SetTimer(5);
MFRC531_WriteReg(RegChannelRedundancy,0x07);
MfComData.MfCommand=PCD_TRANSCEIVE;
MfComData.MfLength=2;
MfComData.MfData[0]=PICC_WRITE;
MfComData.MfData[1]=addr;
status=MFRC531_ISO14443_Transceive(pi);
if(status!
=MI_NOTAGERR)
{
if(MfComData.MfLength!
=4)
{status=MI_BITCOUNTERR;}
else
{
MfComData.MfData[0]&=0x0F;
switch(MfComData.MfData[0])
{
case0x00:
status=MI_NOTAUTHERR;
//input:
adde=要写的绝对块号
//writedata=写入数据
/////////////////////////////////////////////////////////////////////
signedcharPcdWrite(unsignedcharaddr,unsignedchar
*pWritedata)
{
signedcharstatus;
structTransceiveBufferMfComData;
structTransceiveBuffer*pi;
pi=&MfComData;
MFRC531_SetTimer(5);
MFRC531_WriteReg(RegChannelRedundancy,0x07);
MfComData.MfCommand=PCD_TRANSCEIVE;
MfComData.MfLength=2;
MfComData.MfData[0]=PICC_WRITE;
MfComData.MfData[1]=addr;
status=MFRC531_ISO14443_Transceive(pi);
if(status!
=MI_NOTAGERR)
{
if(MfComData.MfLength!
=4)
{status=MI_BITCOUNTERR;}
else
{
MfComData.MfData[0]&=0x0F;
switch(MfComData.MfData[0])
{
case0x00:
status=MI_NOTAUTHERR;
break;
case0x0A:
status=MI_OK;
break;
default:
status=MI_CODEERR;
break;
}
}
}
if(status==MI_OK)
{
MFRC531_SetTimer(5);
MfComData.MfCommand=PCD_TRANSCEIVE;
MfComData.MfLength=16;
memcpy(&MfComData.MfData[0],pWritedata,16);
status=MFRC531_ISO14443_Transceive(pi);
if(status!
=MI_NOTAGERR)
{
MfComData.MfData[0]&=0x0F;
switch(MfComData.MfData[0])
{
case0x00:
status=MI_WRITEERR;
break;
case0x0A:
status=MI_OK;
break;
default:
status=MI_CODEERR;
break;
}
}
MFRC531_SetTimer(4);
}
returnstatus;
}
/////////////////////////////////////////////////////////////////////
//命令卡进入休眠状态
/////////////////////////////////////////////////////////////////////
signedcharPcdHalt()
{
signedcharstatus=MI_OK;
structTransceiveBufferMfComData;
structTransceiveBuffer*pi;
pi=&MfComData;
MfComData.MfCommand=PCD_TRANSCEIVE;
MfComData.MfLength=2;
MfComData.MfData[0]=PICC_HALT;
MfComData.MfData[1]=0;
status=MFRC531_ISO14443_Transceive(pi);
if(status)
{
if(status==MI_NOTAGERR||status==MI_ACCESSTIMEOUT)
status=MI_OK;
}
MFRC531_WriteReg(RegCommand,PCD_IDLE);
returnstatus;
}
//硬件版本号
constunsignedcharhardmodel[12]={"SL601F-0512"};
unsignedcharg_bReceOk;//正确接收到上位机指令标志
unsignedcharg_bReceAA;//接收到上位机发送的AA字节标志
unsignedcharg_bRc531Ok;//RC531复位正常标志
unsignedintg_cReceNum;//接收到上位机的字节数
unsignedintg_cCommand;//接收到的命令码
unsignedcharg_cSNR[4];//M1卡序列号
unsignedcharg_cI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 IPv6 Contiki 系统 入门 实验