Functie van de parameter rxAlign in de functie PCD_ReadRegister in de MFRC522-bibliotheek

Ik probeer MFRC522 arduino libary (van github ) naar de ARM MCU's te sturen. mijn probleem is in PCD_ReadRegister-functie:

/**
 * Reads a number of bytes from the specified register in the MFRC522 chip.
 * The interface is described in the datasheet section 8.1.2.
 */
void MFRC522::PCD_ReadRegister( byte reg,       ///< The register to read from. One of the PCD_Register enums.
                                byte count,     ///< The number of bytes to read
                                byte *values,   ///< Byte array to store the values in.
                                byte rxAlign    ///< Only bit positions rxAlign..7 in values[0] are updated.
                                ) {

    if (count == 0) {
        return;
    }
    //Serial.print(F("Reading "));  Serial.print(count); Serial.println(F(" bytes from register."));
    byte address = 0x80 | (reg & 0x7E);    //MSB == 1 is for reading. LSB is not used in address. Datasheet section 8.1.2.3.
    byte index = 0;                        //Index in values array.
    SPI.beginTransaction(SPISettings(SPI_CLOCK_DIV4, MSBFIRST, SPI_MODE0));//Set the settings to work with SPI bus
    digitalWrite(_chipSelectPin, LOW);     //Select slave
    count--;                               //One read is performed outside of the loop
    SPI.transfer(address);                 //Tell MFRC522 which address we want to read
    while (index < count) {
        if (index == 0 && rxAlign) {       //Only update bit positions rxAlign..7 in values[0]
           //Create bit mask for bit positions rxAlign..7
            byte mask = 0;
            for (byte i = rxAlign; i <= 7; i++) {
                mask |= (1 << i);
            }
           //Read value and tell that we want to read the same address again.
            byte value = SPI.transfer(address);
           //Apply mask to both current value of values[0] and the new data in value.
            values[0] = (values[index] & ~mask) | (value & mask);
        }
        else {//Normal case
            values[index] = SPI.transfer(address); //Read value and tell that we want to read the same address again.
        }
        index++;
    }
    values[index] = SPI.transfer(0);           //Read the final byte. Send 0 to stop reading.
    digitalWrite(_chipSelectPin, HIGH);        //Release slave again
    SPI.endTransaction();//Stop using the SPI bus

}//End PCD_ReadRegister()

I Read Datasheet several times & can't understand whats function of his parameter! Based on datasheet for reading a register from rc522 : enter image description here

1

1 antwoord

Betreffende de afbeelding in uw bericht over 'SPI Read Data', die eenvoudigweg zegt dat de eerste byte die wordt ontvangen via MISO wordt weggegooid, wat wordt gedaan in PCD_ReadRegister() vlak voor de voor loop en vervolgens worden n bytes gelezen, waarbij 0 de laatste keer wordt overgedragen om te stoppen met lezen.

Een snelle blik op de bibliotheek en datasheet laat zien dat het argument rxAlign wordt gebruikt om het eerste geldige bit in de eerste ontvangen byte te identificeren. txLastBits heeft een soortgelijk doel, alleen voor verzending van de laatste byte. Beide zijn geschreven naar BitFramingReg van de MFRC522 en zijn noodzakelijk voor bitgeoriënteerde frames tussen de MFRC522 en een kaart/tag.

In de functie die u hierboven heeft, bijvoorbeeld, als rxAlign = 3 , betekent dit dat alleen bits 7 tot 3 geldig zijn in de eerste ontvangen byte , uitgepakt met bitmasker 11111000 . Dus de eerste geldige 'byte' omvat bits 7 tot 3 van de eerste ontvangen byte aaneengeschakeld met bits 2 - 0 van de volgende ontvangen byte. Op dezelfde manier geeft txLastBits tijdens de verzending het aantal bits van de laatste byte aan dat naar de kaart/tag moet worden verzonden. In beide gevallen is wat wordt verzonden of ontvangen via het RF-veld mogelijk geen veelvoud van 8, vandaar de noodzaak van deze argumenten en BitFramingReg .

In elk geval zou dit niet moeten interfereren met het porten van de bibliotheek. Vervang gewoon de Arduino-specifieke functies/interfaces en laat de bestaande logica van de bibliotheek ongewijzigd blijven.


Bewerken

Ik zal proberen je vragen te beantwoorden:

  • In deze context verwijst 106kBd naar de gegevenssnelheid tussen de RC522 en een kaart, en niet tussen de RC522 en de MCU. Het maximum is ongeveer 848kBd, denk ik. Raadpleeg de datasheet voor meer informatie.
  • Bitgeoriënteerde frames zijn noodzakelijk voor het anti-collisionproces. Boven elkaar geplaatste bits in de Manchester-codering, wanneer meerdere kaarten tegelijk proberen te communiceren met de RC522, vereisen dat individuele bits worden verwerkt in tegenstelling tot de eenheden van de gebruikelijke bytegrootte. Antibotsingtechnieken opzoeken.
  • Anticollisie is nodig als dezelfde lezer mogelijk meerdere tags binnen zijn bereik heeft. Uit een IEEE-artikel:

Tagbotsingen kunnen een grote inefficiëntie in RFID-systemen met zich meebrengen, wat resulteert in lage herkenningspercentages, een kort leesbereik en ineffectief gebruik van middelen. Ze zijn problematischer in passieve tags vanwege beperkingen van het vermogen en de functionaliteit.

Dus als u slechts één kaart tegelijkertijd presenteert, moet u veilig zijn zonder de anticollisie in uw code te implementeren. Anders ben ik bang dat je geen keus hebt tenzij je de lezer in de war wilt brengen.

Als u alleen UID's wilt lezen en blokken van/naar blokken op een kaart wilt lezen (een voor een), probeert u dit rechttoe rechtaan MFRC522 UART-bibliotheek , die trouwens geen anitcollision implementeert.

Als je de SPI-gebaseerde bibliotheek nog steeds wilt porten, dan zijn er een paar suggesties:

U wilt de SPI-interface vervangen door UART. Dit zijn dingen op een laag niveau, allemaal in een paar functies zoals PCD_ReadRegister() , PCD_WriteRegister() en een paar andere. Deze functies dienen functies op een hoger niveau, die geen idee hebben van hun interne implementatie, maar van hen bepaald gedrag verwachten. Verwissel de SPI-functies voor hun UART-equivalenten, zodra u begrijpt hoe u met de lezer kunt praten via UART. Zodra uw ARM UART-functies zich precies gedragen zoals de SPI-functies, is uw werk bijna voltooid; het is niet nodig om de reden voor alles in de functies op een hoger niveau te leren, omdat ze niet gerelateerd zijn aan interface-specifiek. Dit omvat alles met betrekking tot rxAlign en wat dan ook. Succes :).

0
toegevoegd
@MahmoudHD Ik heb mijn antwoord bewerkt.
toegevoegd de auteur TisteAndii, de bron
@MahmoudHD Helpt dit? Ben je hier voorbij gekomen?
toegevoegd de auteur TisteAndii, de bron
@MahmoudHD U gaat niet meer porten naar UART?
toegevoegd de auteur TisteAndii, de bron
Beste Tiste, Echt bedankt voor je geweldige beschrijving. Het probleem is dat ik de gebruikte verbindingsrandapparatuur van SPI naar UART.3 moet veranderen van nieuwe vraag: 1 - Gebaseerd op Datasheet pagina 46 - tabel 48: deze bits mogen alleen worden gebruikt voor bitwise anticollision bij 106 kBd, voor alle andere modi zijn ze ingesteld op 0. dan voor standaard 9600 baudsnelheid in uart kan ik dit vermijden? 2-secondenvraag is dat ik begrijp wat is doen, maar ik weet niet waarom we dit nog doen? waarom bytes niet worden gevormd zoals gebruikelijk en niet geldig zijn vanaf het eerste bit? Waarom zijn er vermijdbare bits in het begin van de gegevensstroom? 3 is dit ook nodig in de UART-modus?
toegevoegd de auteur asti, de bron
Beste Tiste, Ik heb je echt gewaardeerd voor je goede begeleiding. Ik probeer hard om een ​​officiële SPI Arduino-bibliotheek van deze chip naar mijn doel-MCU te porteren. Ik zal hier een nieuwe vraag stellen, WBR.
toegevoegd de auteur asti, de bron
Ik bedoel eigenlijk, ik probeer de SPI-versie ( github.com/miguelbalboa/rfid ) te porten naar initialiseren met UART tot nu toe. Nu zijn we op nieuwjaarsvakantie en daarna zal ik dat blijven overdragen voor LPC ARM MCU's, WBR.
toegevoegd de auteur asti, de bron