[求助] ATMEGA16用SPI控制rc522

2949438790   2016-6-1 18:12 楼主
ATMEGA16用SPI控制rc522 。
ATMEGA16的晶振是8M晶振,rc522的晶振是27.120。
求用ATMEGA16用SPI控制rc522的程序要详细的注释 。照片已上传
  • 2.jpg
  • 1.jpg

回复评论 (10)

还要用串口(USART)把卡号发给电脑
点赞  2016-6-1 18:15
没有用过RC522,但淘宝卖家一般会提供参考程序的。
点赞  2016-6-1 20:11
楼主蛮勤快啊,这里也有代码,供参照
https://github.com/miguelbalboa/rfid
MicroPython中文社区https://micropython.org.cn/forum/  
点赞  2016-6-1 20:41
找来一个程序,注释给你翻译了,祝你成功。void loop() {    // 有新Mifare卡,没有就rtn    if ( ! mfrc522.PICC_IsNewCardPresent()) return;    // 读Mifare卡的数据,没有就rtn
    if ( ! mfrc522.PICC_ReadCardSerial()) return;    // 显示一把Mifare的信息    Serial.print("Card UID:");    dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);    Serial.println();    Serial.print("PICC type: ");    byte piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);    Serial.println(mfrc522.PICC_GetTypeName(piccType));    // 看看这Mifare卡的类型支持否    if (    piccType != MFRC522::PICC_TYPE_MIFARE_MINI        &&  piccType != MFRC522::PICC_TYPE_MIFARE_1K        &&  piccType != MFRC522::PICC_TYPE_MIFARE_4K) {        Serial.println("This sample only works with MIFARE Classic cards.");        return;    }    // Mifare卡的头开始,到第二个sector(也叫sector1),写例子    byte sector         = 1;                    // 制定写的sector为 #1    byte blockAddr      = 4;                    // sector1的 block #4    byte dataBlock[]    = {                     // 写数据        0x01, 0x02, 0x03, 0x04,                 //  1,  2,   3,  4,        0x05, 0x06, 0x07, 0x08,                 //  5,  6,   7,  8,        0x08, 0x09, 0xff, 0x0b,                 //  8,  9, 255, 11,        0x0c, 0x0d, 0x0e, 0x0f                  // 12, 13,  14, 15    };    byte trailerBlock   = 7;                    // sector11的trailerblock 为7    byte status;    byte buffer[18];    byte size = sizeof(buffer);    // 用A键认证    // 秘钥是MIFARE_Key key里面定义的 6 Byte码    // 新Mifare卡 初期值用 FF FF FF FF FF FF在setup函数里面设好了    Serial.println("Authenticating using key A...");    status = mfrc522.PCD_Authenticate(        MFRC522::PICC_CMD_MF_AUTH_KEY_A,        // 制定A键        trailerBlock,                           // 制定7号trailerBlock        &key,                                   // 制定秘钥(FF FF FF FF FF FF)        &(mfrc522.uid)                          // 制定 用 Mifare UID    );    if (status != MFRC522::STATUS_OK) return;   // 认证失败就返回    // 读Mifare sector1的数据,显示一把    Serial.println("Current data in sector:");    mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);    Serial.println();    // 读Mifare卡block 4 的数据,并带入 buffer    Serial.print("Reading data from block "); Serial.println(blockAddr);    mfrc522.MIFARE_Read(blockAddr, buffer, &size);    Serial.print("Data in block "); Serial.print(blockAddr); Serial.println(":");    dump_byte_array(buffer, 16); Serial.println(); Serial.println();    // 用B键,对卡认证    Serial.println("Authenticating again using key B...");    status = mfrc522.PCD_Authenticate(        MFRC522::PICC_CMD_MF_AUTH_KEY_B,        // 制定B件认证        trailerBlock,                           // 用7号trailerBlock        &key,                                   // 秘钥(FF FF FF FF FF FF)        &(mfrc522.uid)                          // 指定Mifare的UID    );    if (status != MFRC522::STATUS_OK) return;   // 认证失败就关闭    // dataBlock的数据,写入卡的block4     Serial.print("Writing data into block "); Serial.println(blockAddr);    dump_byte_array(dataBlock, 16); Serial.println();    mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
    // 为了检查,把刚才写的,读一下    Serial.print("Reading data from block "); Serial.println(blockAddr);    status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);    Serial.print("Data in block "); Serial.print(blockAddr); Serial.println(":");    dump_byte_array(buffer, 16); Serial.println();        
    // 读出后,挨个显示下子    Serial.println("Checking result...");    byte count = 0;    for (byte i = 0; i < 16; i++) if (buffer == dataBlock) count++;    if (count == 16) Serial.println("Success :-)");    else Serial.println("Failure, no match :-(");    Serial.println();            // 读卡 sector1的数据,显示下子    Serial.println("Current data in sector:");    mfrc522.PICC_DumpMifareClassicSectorToSerial(&(mfrc522.uid), &key, sector);    Serial.println();    mfrc522.PICC_HaltA();                       // 停止PICC    mfrc522.PCD_StopCrypto1();                  // 停止PCD加密}
MicroPython中文社区https://micropython.org.cn/forum/  
点赞  2016-6-1 21:10
代码贴上去,就没人样了,请参照
http://www.geocities.jp/bokunimowakaru/diy/arduino/rfid.html
MicroPython中文社区https://micropython.org.cn/forum/  
点赞  2016-6-1 21:11
引用: 5525 发表于 2016-6-1 21:10
找来一个程序,注释给你翻译了,祝你成功。void loop() {    // 有新Mifare卡,没有就rtn    if ( ! mfrc52 ...

这个用串口(USART)了吗?就是把卡号发给电脑
点赞  2016-6-2 17:51
引用: 2949438790 发表于 2016-6-2 17:51
这个用串口(USART)了吗?就是把卡号发给电脑

用串口调试了。

Serial.print("Card UID:")
Serial.print("Data in block ");
Serial.print(blockAddr);
Serial.println(":");
MicroPython中文社区https://micropython.org.cn/forum/  
点赞  2016-6-2 20:27
引用: 5525 发表于 2016-6-2 20:27
用串口调试了。

Serial.print("Card UID:")
Serial.print("Data in block ");
Serial.print(blockA ...

额,其实你是怎么写的我没看懂,我是新手,希望能看到完整版的程序,这个程序串口调试没看懂,我需要是用ATMEGA16用SPI控制rc522读出卡号用串口发给电脑就行了。谢谢你,麻烦你了。
点赞  2016-6-3 17:02
引用: 2949438790 发表于 2016-6-2 17:51
这个用串口(USART)了吗?就是把卡号发给电脑

2949438790@qq.com这是我的邮箱放到我的邮箱谢谢你
点赞  2016-6-3 17:08
到这里 https://github.com/miguelbalboa/rfid 下载zip,
加到你自己arduino开发环境里面,
选择打开样例程序就有啊。
MicroPython中文社区https://micropython.org.cn/forum/  
点赞  2016-6-3 22:47
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复