fix fifo reading

This commit is contained in:
2022-03-09 13:19:41 +01:00
parent f2d4a9df9e
commit da371f43b7
3 changed files with 72 additions and 11 deletions

View File

@ -14,7 +14,8 @@ uint8_t Mfrc522::read(uint8_t addr)
void Mfrc522::read(uint8_t addr, uint8_t* data, uint8_t datalen, uint8_t rxAlign)
{
_csReg->setBit(_csPin, false);
_spi->readWrite(addr << 1 | (1 << 7));
const uint8_t addrS = addr << 1 | (1 << 7);
_spi->readWrite(addrS);
for(uint8_t i = 0; i < datalen; ++i)
{
if(i == 0 && rxAlign)
@ -22,12 +23,12 @@ void Mfrc522::read(uint8_t addr, uint8_t* data, uint8_t datalen, uint8_t rxAlign
uint8_t mask = 0;
for (uint8_t j = rxAlign; j <= 7; ++j)
mask |= (1 << j);
uint8_t value = _spi->readWrite();
uint8_t value = _spi->readWrite(addrS);
data[0] = (data[0] & ~mask) | (value & mask);
}
else
{
data[i] = _spi->readWrite();
data[i] = _spi->readWrite(addrS);
}
}
_csReg->setBit(_csPin, true);
@ -114,6 +115,24 @@ uint8_t Mfrc522::commuicateWithTag(uint8_t command, uint8_t waitIrq,
write(FIFODataReg, sendData, sendLen); // Fill fifo
write(BitFramingReg, (rxAlign << 4) + validBits);
write(CommandReg, command); // Execute the command
if(serial)
{
serial->write_p(PSTR("Communicate params: CommandReg: "));
serial->write((int)read(CommandReg));
serial->putChar(' ');
serial->write_p(PSTR("FIFO: "));
for(uint8_t i = 0; i < sendLen; ++i)
{
serial->write((int)sendData[i]);
serial->putChar(' ');
}
serial->write_p(PSTR("BitFramingReg: "));
serial->write((int)read(BitFramingReg));
serial->putChar('\n');
}
if (command == TRANSCEIVE)
updateBit(BitFramingReg, 7, true);
@ -142,18 +161,25 @@ uint8_t Mfrc522::commuicateWithTag(uint8_t command, uint8_t waitIrq,
{
uint8_t fifoBites = read(FIFOLevelReg);
if(serial)
{
serial->write_p(PSTR("fifo has "));
serial->write((int)fifoBites);
serial->write_p(PSTR(" bytes\n"));
}
if(fifoBites > *recvLen)
return LEN;
*recvLen = fifoBites;
read(FIFODataReg, recvData, fifoBites, rxAlign);
if(rxValidBits)
*rxValidBits = read(ControlReg) & 0x07;
if(serial)
{
serial->write_p(PSTR("fifo has "));
serial->write((int)fifoBites);
serial->write_p(PSTR(" bytes: "));
for(uint8_t i = 0; i < fifoBites; ++i)
{
serial->write((int)recvData[i]);
serial->putChar(' ');
}
serial->putChar('\n');
}
}
if(errorRegValue & 0x08)
@ -448,3 +474,27 @@ bool Mfrc522::probe(SpiMaster* spi, ShiftReg<NFC_PORTS>* csReg, uint8_t csPin)
csReg->setBit(csPin, true);
return version == 0x91 || version == 0x92;
}
bool Mfrc522::testFifo()
{
uint8_t buffer[8] = {42, 43, 44, 45, 46, 47, 48, 49};
uint8_t buffer2[8] = {};
write(FIFOLevelReg, 1 << 7); // Flush fifo Buffer;
write(FIFODataReg, buffer, sizeof(buffer)); // Fill fifo
if(serial)
serial->write_p(PSTR("Fifo buffer contains: "));
uint8_t len = read(FIFOLevelReg);
read(FIFODataReg, buffer2, len);
bool ret = true;
for(uint8_t i = 0; i < len; ++i)
{
if(buffer[i] != buffer2[i])
ret = false;
serial->write((int)buffer2[i]);
serial->putChar(' ');
}
serial->putChar('\n');
return ret;
}

View File

@ -183,5 +183,7 @@ public:
bool cardPresent();
bool testFifo();
static bool probe(SpiMaster* spi, ShiftReg<NFC_PORTS>* csReg, uint8_t csPin);
};

View File

@ -125,6 +125,15 @@ int NfcBoard::dispatch(char* inBuffer, Serial* serial)
serial->write_p(PSTR("Finished\n"));
return 0;
}
else if(strcmp(inBuffer, "tste") == 0 )
{
serial->write_p(PSTR("Runing fifo test\n"));
Mfrc522::serial = serial;
readers[0].testFifo();
Mfrc522::serial = nullptr;
serial->write_p(PSTR("Finished\n"));
return 0;
}
else if(strcmp(inBuffer, "status") == 0 )
{
printNfcDevices(serial);