fix fifo reading
This commit is contained in:
72
mfrc522.cpp
72
mfrc522.cpp
@ -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)
|
void Mfrc522::read(uint8_t addr, uint8_t* data, uint8_t datalen, uint8_t rxAlign)
|
||||||
{
|
{
|
||||||
_csReg->setBit(_csPin, false);
|
_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)
|
for(uint8_t i = 0; i < datalen; ++i)
|
||||||
{
|
{
|
||||||
if(i == 0 && rxAlign)
|
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;
|
uint8_t mask = 0;
|
||||||
for (uint8_t j = rxAlign; j <= 7; ++j)
|
for (uint8_t j = rxAlign; j <= 7; ++j)
|
||||||
mask |= (1 << j);
|
mask |= (1 << j);
|
||||||
uint8_t value = _spi->readWrite();
|
uint8_t value = _spi->readWrite(addrS);
|
||||||
data[0] = (data[0] & ~mask) | (value & mask);
|
data[0] = (data[0] & ~mask) | (value & mask);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
data[i] = _spi->readWrite();
|
data[i] = _spi->readWrite(addrS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_csReg->setBit(_csPin, true);
|
_csReg->setBit(_csPin, true);
|
||||||
@ -114,9 +115,27 @@ uint8_t Mfrc522::commuicateWithTag(uint8_t command, uint8_t waitIrq,
|
|||||||
write(FIFODataReg, sendData, sendLen); // Fill fifo
|
write(FIFODataReg, sendData, sendLen); // Fill fifo
|
||||||
write(BitFramingReg, (rxAlign << 4) + validBits);
|
write(BitFramingReg, (rxAlign << 4) + validBits);
|
||||||
write(CommandReg, command); // Execute the command
|
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)
|
if (command == TRANSCEIVE)
|
||||||
updateBit(BitFramingReg, 7, true);
|
updateBit(BitFramingReg, 7, true);
|
||||||
|
|
||||||
uint16_t i = 2000;
|
uint16_t i = 2000;
|
||||||
uint8_t irq = read(ComIrqReg);
|
uint8_t irq = read(ComIrqReg);
|
||||||
while(irq & waitIrq)
|
while(irq & waitIrq)
|
||||||
@ -141,19 +160,26 @@ uint8_t Mfrc522::commuicateWithTag(uint8_t command, uint8_t waitIrq,
|
|||||||
if (recvData && recvLen)
|
if (recvData && recvLen)
|
||||||
{
|
{
|
||||||
uint8_t fifoBites = read(FIFOLevelReg);
|
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)
|
if(fifoBites > *recvLen)
|
||||||
return LEN;
|
return LEN;
|
||||||
*recvLen = fifoBites;
|
*recvLen = fifoBites;
|
||||||
read(FIFODataReg, recvData, fifoBites, rxAlign);
|
read(FIFODataReg, recvData, fifoBites, rxAlign);
|
||||||
if(rxValidBits)
|
if(rxValidBits)
|
||||||
*rxValidBits = read(ControlReg) & 0x07;
|
*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)
|
if(errorRegValue & 0x08)
|
||||||
@ -448,3 +474,27 @@ bool Mfrc522::probe(SpiMaster* spi, ShiftReg<NFC_PORTS>* csReg, uint8_t csPin)
|
|||||||
csReg->setBit(csPin, true);
|
csReg->setBit(csPin, true);
|
||||||
return version == 0x91 || version == 0x92;
|
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;
|
||||||
|
}
|
||||||
|
@ -183,5 +183,7 @@ public:
|
|||||||
|
|
||||||
bool cardPresent();
|
bool cardPresent();
|
||||||
|
|
||||||
|
bool testFifo();
|
||||||
|
|
||||||
static bool probe(SpiMaster* spi, ShiftReg<NFC_PORTS>* csReg, uint8_t csPin);
|
static bool probe(SpiMaster* spi, ShiftReg<NFC_PORTS>* csReg, uint8_t csPin);
|
||||||
};
|
};
|
||||||
|
@ -125,6 +125,15 @@ int NfcBoard::dispatch(char* inBuffer, Serial* serial)
|
|||||||
serial->write_p(PSTR("Finished\n"));
|
serial->write_p(PSTR("Finished\n"));
|
||||||
return 0;
|
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 )
|
else if(strcmp(inBuffer, "status") == 0 )
|
||||||
{
|
{
|
||||||
printNfcDevices(serial);
|
printNfcDevices(serial);
|
||||||
|
Reference in New Issue
Block a user