接上一篇帖子【Makeblock使用】小试RC522射频模块-Arduino中文社区 http://www.arduino.cn/thread-21478-1-1.html那篇帖子只是测试了一下卡的序列号,接下来写入卡数据
S50卡参数
一、 主要指标 l 容量为8K位EEPROM l 分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位 l 每个扇区有独立的一组密码及访问控制 l 每张卡有唯一序列号,为32位 l 具有防冲突机制,支持多卡操作 l 无电源,自带天线,内含加密控制逻辑和通讯逻辑电路 l 数据保存期为10年,可改写10万次,读无限次 l 工作温度:-20℃~50℃(湿度为90%) l 工作频率:13.56MHZ l 通信速率:106 KBPS l 读写距离:10 cm以内(与读写器有关)
二、 工作原理 卡片的电气部分只由一个天线和ASIC组成。 天线:卡片的天线是只有几组绕线的线圈,很适于封装到IS0卡片中。 ASIC:卡片的ASIC由一个高速(106KB波特率)的RF接口,一个控制单元和一个 8K位EEPROM组成。 工作原理:读写器向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2V时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。
流程图
对数据块的操作 读 (Read):读一个块; 写 (Write):写一个块; 加(Increment):对数值块进行加值; 减(Decrement):对数值块进行减值; 存储(Restore):将块中的内容存到数据寄存器中; 传输(Transfer):将数据寄存器中的内容写入块中; 中止(Halt):将卡置于暂停工作状态;
测试
附程序,中间字符多写了一个“K”,
[mw_shl_code=bash,true]unsigned char serNum[5];
//写卡数据
unsigned char writeDate[16] ={'a', 'r', 'd', 'u', 'i', 'n', 'o', '.', 'k', 'c', 'n', 0, 0, 0, 0, 0};
unsigned char sectorKeyA[16][16] = {
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
unsigned char sectorNewKeyA[16][16] = {
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xff,0x07,0x80,0x69, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},};
void setup()
{
Serial.begin(9600);
SPI.begin();
rfid.init();
}
void loop()
{
unsigned char i,tmp;
unsigned char status;
unsigned char str[MAX_LEN];
unsigned char RC_size;
unsigned char blockAddr;
rfid.isCard();
if (rfid.readCardSerial())
{
Serial.print("The card's number is : ");
Serial.print(rfid.serNum[0],HEX);
Serial.print(rfid.serNum[1],HEX);
Serial.print(rfid.serNum[2],HEX);
Serial.print(rfid.serNum[3],HEX);
Serial.print(rfid.serNum[4],HEX);
Serial.println(" ");
}
rfid.selectTag(rfid.serNum);
blockAddr = 7; //数据块7
if (rfid.auth(PICC_AUTHENT1A, blockAddr, sectorKeyA[blockAddr/4], rfid.serNum) == MI_OK) //认证
{
status = rfid.write(blockAddr, sectorNewKeyA[blockAddr/4]);
Serial.print("set the new card password, and can modify the data of the Sector: ");
Serial.println(blockAddr/4,DEC);
blockAddr = blockAddr - 3 ;
status = rfid.write(blockAddr, writeDate);
if(status == MI_OK)
{
Serial.println("Write card OK!");
}
}
blockAddr = 7;
status = rfid.auth(PICC_AUTHENT1A, blockAddr, sectorNewKeyA[blockAddr/4], rfid.serNum);
if (status == MI_OK) //认证
{
blockAddr = blockAddr - 3 ;
if( rfid.read(blockAddr, str) == MI_OK)
{
Serial.print("Read from the card ,the data is : ");
Serial.println((char *)str);
}
}
rfid.halt();
}[/mw_shl_code]
|