MFRC522 Kitaplıktaki PCD_ReadRegister işlevindeki rxAlign parametresinin işlevi

ARM MCU'lara MFRC522 arduino libary ( github 'dan) bağlantı kurmaya çalışıyorum. Sorun PCD_ReadRegister işlevinde:

/**
 * 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 cevap

Gönderinizdeki görüntünün, "SPI Read Data" ile ilgili olarak, basitçe MISO üzerinden alınan ilk baytın atıldığını ve bunun PC'den önce kodundan önce içinde yapıldığını söyler. döngü ve sonra n bayt okunur, 0 okumayı son kez aktarır.

Kütüphaneye ve veri sayfasına hızlı bir şekilde bakıldığında, rxAlign argümanının, alınan ilk bayttaki ilk geçerli bitin belirlenmesinde kullanıldığını gösterir. txLastBits , yalnızca son baytın iletilmesi için benzer bir amaca hizmet eder. Her ikisi de MFRC522'nin BitFramingReg 'e yazılır ve MFRC522 ile bir kart/etiket arasındaki bit yönelimli çerçeveler için gereklidir.

Örneğin, yukarıda sahip olduğunuz işlevde, rxAlign = 3 ise, bit maskesi alınan bayt 'da yalnızca 7 - 3 bitlerinin geçerli olduğu anlamına gelir. > 11111000 . Dolayısıyla, ilk geçerli 'bayt' , bir sonraki alınan baytın bitleri 2 - 0 ile birleştirilmiş ilk alınan baytın bitlerini 7 ila 3 içerir. Benzer şekilde, iletimde txLastBits , son baytın, karta/etikete iletilecek bit sayısını belirtir. Her iki durumda da, RF alanı üzerinden iletilen veya alınan, 8'in katları olmayabilir, dolayısıyla bu argümanlara ve BitFramingReg 'e olan gereksinim olabilir.

Her neyse, bu kütüphaneyi taşıyarak hiç müdahale etmemelidir. Arduino'ya özgü fonksiyonları/arayüzleri değiştirin ve kütüphanenin mevcut mantığının olduğu gibi kalmasına izin verin.


DÜZENLEME

Sorularınızı cevaplamaya çalışacağım:

  • Bu bağlamda, 106kBd, RC522 ve bir kart arasındaki veri oranını, RC522 ve MCU arasında değil, belirtir. Maksimum yaklaşık 848kBd olduğunu düşünüyorum. Daha fazla bilgi için veri sayfasını kontrol edin.
  • Çarpışma karşıtı işlemler için bit yönelimli çerçeveler gerekli . Manchester kodlamasındaki üst üste binen bitler, birkaç kart RC522 ile aynı anda iletişim kurmaya çalıştığında, her bir bitin normal bayt boyutlu birimlere karşı işlenmesini gerektirir. Anti-çarpışma tekniklerini arayın.
  • Aynı okuyucunun kendi aralığı içinde birden çok etiketi olması durumunda, büyük bir önleme gerekir. Bir IEEE makalesinden:

Etiket çarpışmaları RFID sistemlerinde büyük bir verimsizlik oluşturabilir, bu da düşük tanımlama oranları, kısa okuma aralığı ve etkisiz kaynak kullanımı ile sonuçlanır. Güç ve işlevsellik sınırlamaları nedeniyle pasif etiketlerde daha sorunludurlar.

Dolayısıyla, bir seferde sadece bir kart sunacak olursanız, kodunuzda önyargısızlık uygulamaya geçmeden güvenli olmalısınız. Else, korkarım okuyucuyu karıştırmak istemediğiniz sürece başka seçeneğiniz yok.

Tek yapmanız gereken, UID'leri okumak ve bir karttaki bloklardan/bloklara okuma (her seferinde bir tane) ise, bunu basit bir şekilde MFRC522 UART kitaplığı .

SPI tabanlı kitaplığı hala taşımak istiyorsanız, birkaç öneri:

SPI arayüzünü UART ile değiştirmek istersiniz. Bu, hepsi PCD_ReadRegister() , PCD_WriteRegister() ve diğer birkaç işlev dahilinde yer alan düşük seviyeli öğelerdir. Bu işlevler, kendi iç uygulamalarına dair hiçbir fikre sahip olmayan, üst düzey işlevlere hizmet eder, ancak onlardan bazı davranışlar beklerler. UART üzerinden okuyucuyla nasıl konuşulacağını anladığınız anda, UART eşdeğerleri için SPI işlevlerini değiştirin. ARM UART işlevleriniz SPI işlevleri gibi davrandığında, işiniz neredeyse bitmiştir; arayüze özgü herhangi bir şeyle ilgili olmadıklarından, üst düzey işlevlerdeki her şeyin sebebini öğrenmeye gerek yoktur. Bu, rxAlign ile ilgili her şeyi ve neyi içerir? İyi şanslar :).

0
katma
@MahmoudHD Cevabımı düzenledim.
katma yazar TisteAndii, kaynak
@MahmoudHD Bu yardımcı olur mu? Bunu geçtin mi?
katma yazar TisteAndii, kaynak
@MahmoudHD Artık UART'a taşınacak mısın?
katma yazar TisteAndii, kaynak
Sevgili Tiste, Gerçekten harika bir açıklama için teşekkür ederim.Problem, SPI'dan UART.3'e kadar olan bağlantıların periferik olarak kullanılan kütüphaneleri değiştirmem gerektiğidir. Yeni soru: 1-Datasheet sayfa 46-tablo 48'e göre: Bu bitler sadece bitly anticollision için kullanılır. 106 kBd'de, diğer tüm modlar için, uart'ta varsayılan 9600 baud hızı için 0. olarak ayarlanmış olabilir. Bunu önleyebilir miyim? 2 saniye soru, ne olduğunu anlıyorum ama bunu neden yaptığımızı bilmiyorum? neden baytlar her zamanki gibi oluşturulmaz ve ilk bitten geçerli değiller neden veri akışının başlangıcında kaçan bitler var? 3-bu UART modunda da gerekli midir?
katma yazar asti, kaynak
Sevgili Tiste, Büyük rehberliğiniz için sizi gerçekten takdir ediyorum, hedef bir MCI'ye bu çipin resmi bir SPI arduino kütüphanesini taşımak için çok çalışıyorum, yeni soruya burada yer vereceğim, WBR.
katma yazar asti, kaynak
Demek istediğim, SPI versiyonunu ( github.com/miguelbalboa/rfid ) henüz UART ile başlıyoruz.Şimdi burada yeni yıl tatillerindeyiz ve bundan sonra LPC ARM MCU'lar, WBR için bunu taşımaya devam edeceğim.
katma yazar asti, kaynak