ATMEGA16用SPI控制rc522 。
ATMEGA16的晶振是8M晶振,rc522的晶振是27.120。
求用ATMEGA16用SPI控制rc522的程序要详细的注释 。照片已上传
没有用过RC522,但淘宝卖家一般会提供参考程序的。
MicroPython中文社区https://micropython.org.cn/forum/
找来一个程序,注释给你翻译了,祝你成功。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/
用串口调试了。
Serial.print("Card UID:")
Serial.print("Data in block ");
Serial.print(blockAddr);
Serial.println(":");
MicroPython中文社区https://micropython.org.cn/forum/
引用: 5525 发表于 2016-6-2 20:27
用串口调试了。
Serial.print("Card UID:")
Serial.print("Data in block ");
Serial.print(blockA ...
额,其实你是怎么写的我没看懂,我是新手,希望能看到完整版的程序,这个程序串口调试没看懂,我需要是用ATMEGA16用SPI控制rc522读出卡号用串口发给电脑就行了。谢谢你,麻烦你了。
到这里
https://github.com/miguelbalboa/rfid 下载zip,
加到你自己arduino开发环境里面,
选择打开样例程序就有啊。
MicroPython中文社区https://micropython.org.cn/forum/