Hi there, I tried to do the selftest on MFRC522 through SPI. I have followed the instruction but instead of getting the expected version and value of FIFO buffer stated in the datasheet. I got a different output.
Output:
Version B2
Self-test result:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 E9 C B9 F7 CF DF
F C6 5E A6 35 90 F2 11 64 E2 E 36 2D CA DD A3
D1 1 1B 61 64 3A FB A8 1A 28 37 EE 53 61 37 A3
Below are the selftest instruction along with my code for it.
#include <SPI.h>
const int chipSelectPin = 10;
void setup() {
Serial.begin(9600);
SPI.begin();
pinMode(chipSelectPin, OUTPUT);
digitalWrite(chipSelectPin, HIGH);
performSelfTest();
}
void loop() {
// Your main code here
}
void performSelfTest() {
softReset();
clearInternalBuffer();
enableSelfTest();
writeFIFO(0x00);
startSelfTest();
readSelfTestResult();
}
void softReset() {
writeRegister(0x01, 0x0F); // CommandReg: SoftReset command
}
void clearInternalBuffer() {
for (int i = 0; i < 25; i++) {
writeRegister(0x09, 0x00); // FIFODataReg: write 0x00 to FIFO buffer
}
}
void enableSelfTest() {
writeRegister(0x36, 0x09); // AutoTestReg: enable self-test
}
void writeFIFO(byte value) {
writeRegister(0x09, value); // FIFODataReg: write value to FIFO buffer
}
void startSelfTest() {
writeRegister(0x01, 0x03); // CommandReg: start CalcCRC command
}
void readSelfTestResult() {
byte version = readRegister(0x37);
Serial.println(version,HEX);
Serial.println("Self-test result:");
for (int i = 0; i < 64; i++) {
byte result = readRegister(0x09); // FIFODataReg: read result from FIFO buffer
Serial.print(result, HEX);
Serial.print(" ");
if ((i + 1) % 16 == 0) {
Serial.println();
}
}
}
void writeRegister(byte reg, byte value) {
digitalWrite(chipSelectPin, LOW);
SPI.transfer((reg << 1) & 0x7E); // Address format: 0XXXXXX0 for write operation
SPI.transfer(value);
digitalWrite(chipSelectPin, HIGH);
}
byte readRegister(byte reg) {
digitalWrite(chipSelectPin, LOW);
SPI.transfer(((reg << 1) & 0x7E) | 0x80); // Address format: 1XXXXXX1 for read operation
byte value = SPI.transfer(0x00);
digitalWrite(chipSelectPin, HIGH);
return value;
}

