MFRC522 kutubxonasidagi PCD_ReadRegister funktsiyasida rxAlign parametrining funksiyasi

Men ARM MCU'ga MFRC522 arduino libosini (" github dan) o'tishga harakat qilaman. Mening muammom PCD_ReadRegister funktsiyasidadir:

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

Sizning pochtangizdagi "SPI Ma'lumotlarni Mutolaa" deb nomlangan rasmga kelsak, faqat for = PCD_ReadRegister() da amalga oshirilgan MISO orqali olingan birinchi bayt bekor qilinadi, pastadir va undan keyin n baytlar o'qiladi, 0 sonni o'qishni to'xtatish uchun o'tkaziladi.

Kutubxona va ma'lumotlar sahifasiga tezkorlik bilan qaraganda, rxAlign mustaqil o'zgaruvchisi birinchi olingan baytda birinchi joriy bitni aniqlashda ishlatilishini ko'rsatadi. txLastBits , faqat oxirgi baytning uzatilishi uchun xuddi shunday maqsadga xizmat qiladi. Har ikkisi ham MFRC522 ning BitFramingReg -ga yoziladi va MFRC522 va karta/tag orasida bit-yo'naltirilgan ramkalar uchun zarur.

Masalan, siz yuqorida mavjud bo'lgan funktsiyada, rxAlign = 3 bo'lsa, bu faqatgina bittadan bittadan bittasi bittadan niqob bilan chiqarilgan olingan baytda bittada emas > 11111000 . Shunday qilib, birinchi joriy 'byte' , keyingi qabul qilingan byte'ların bitlerinin 2 - 0'si bilan birleştirilen birinchi olingan baytın 7 dan 3'ünü tashkil etadi. Xuddi shunday, uzatishda txLastBits kartaga/tagga uzatilishi kerak bo'lgan oxirgi baytlarning bitlarini bildiradi. Ikkala holatda ham, RF chastotasi orqali uzatilgan yoki qabul qilingan narsa 8 bo'lishi mumkin, shuning uchun bu argumentlarga va BitFramingReg ga ehtiyoj bor.

Yaxshiyamki, bu kutubxonani ko'chirish bilan hech qanday aralashmasligi kerak. Arduinoga xos funktsiyalarni/interfeyslarni almashtirish va kutubxonaning mavjud mantiqiyligini saqlab qolish imkonini beradi.


EDIT -ni tanlang

Men sizning savollaringizga javob berishga harakat qilaman:

  • Shu nuqtai nazardan, 106kBd RC522 va MCU o'rtasida emas, RC522 va karta orasidagi ma'lumotlar tezligiga ishora qiladi. Maksimal taxminan 848kBd, deb o'ylayman. Batafsil ma'lumot uchun ma'lumot sahifasini tekshiring.
  • Blastlarga qarshi kurash jarayoni uchun bit yo'naltirilgan freymlar kerak . Bir nechta kartalar RC522 bilan bir vaqtning o'zida bog'lanish uchun harakat qilganda, Manchester kodlashda Superimposed bitlar odatiy byte-o'lchamli birliklardan farqli o'laroq, individual bitlarni qayta ishlashni talab qiladi. Qarama-qarshi to'qnashuvlarni tekshiring.
  • Anticollision bir xil o'quvchi o'z diapazonida bir nechta tegga ega bo'lishi kerak. IEEE maqolasidan:

Tag to'qnashuvlari RFID tizimlarida katta samarasizligi keltirib chiqarishi mumkin, natijada past identifikatsiya stavkalari, qisqa o'qish oralig'i va samarasiz resurslardan foydalanish mumkin.

Power va funksionallik cheklovlari sababli passiv belgilarda muammolar mavjud

Shunday qilib, agar siz bir vaqtning o'zida bitta kartani taqdim qilmoqchi bo'lsangiz, kodingizda kutilmagan holni amalga oshirmasdan xavfsiz bo'lishingiz kerak. Boshqa tomondan, o'quvchini chalkashtirib yubormasangiz, sizda hech qanday tanlov yo'q deb qo'rqaman.

Agar xohlasangiz, UID-larni o'qib chiqing va kartadagi bloklardan o'qish (bir vaqtning o'zida) o'qishingiz mumkin bo'lsa, bu to'g'ridan to'g'ri MFRC522 UART kutubxonasi , bu esa anitcollisionni amalga oshirmaydi.

Agar siz hali ham SPI asosidagi kutubxonani portlashni xohlasangiz, unda bir nechta takliflar:

SPORT interfeysini UART bilan almashtirishni xohlaysiz. Bu PCD_ReadRegister() , PCD_WriteRegister() va bir nechta boshqa funktsiyalarda joylashgan past darajadagi materiallar. Ushbu funktsiyalar yuqori darajadagi funktsiyalarga xizmat qiladi, bu ularning ichki bajarilishiga oid hech qanday ma'lumotga ega emas, lekin ulardan ayrim xatti-harakatlar kutish kerak. UART orqali o'quvchi bilan qanday gaplashishni bilganingizdan so'ng, UARTning ekvivalentlari uchun SPI funktsiyalarini almashtiring. Sizning ARM UART funktsiyalari SPI funktsiyalariga o'xshash bo'lsa, ishingiz deyarli bajariladi; yuqori darajadagi funktsiyalardagi hamma narsani sababini o'rganishning hojati yo'q, chunki ular interfeysga xos bo'lgan narsalarga aloqasi yo'q. Bunga rxAlign va unnot haqida hamma narsa kiradi. Omad :).

0
qo'shib qo'ydi
@MahmoudHD Javobni tahrirladim.
qo'shib qo'ydi muallif TisteAndii, manba
@MahmoudHD Ushbu yordammi? Siz bunga erishdingizmi?
qo'shib qo'ydi muallif TisteAndii, manba
@MahmoudHD Siz endi UARTga tashrif buyurdingizmi?
qo'shib qo'ydi muallif TisteAndii, manba
Hurmatli Tiste, Sizning buyuk tavsiflaringiz uchun katta rahmat. Muammo shundaki, kutubxonalar SPIdan UART.3ga yangi aloqa bilan bog'liq bo'lgan kutubxonalarni o'zgartirishi kerak: 1-Datasheet sahifasiga asoslangan 46-jadval 48: Bu bitlar faqat bittadan anticollision 106 kBd da, barcha boshqa usullar uchun ular 0.99 ni o'rnatib, uartdagi 9600 bod tezligi uchun bu to'sqinlik qila olamanmi? 2 soniyalik savol nima qilayotganini tushunyapman, lekin buni nima uchun qilamiz? nima uchun baytlar odatdagidek shakllanmagan va birinchi bitdan haqiqiy emas? Nima uchun ma'lumotlar oqimining boshlanishida oldini olish mumkin bo'lgan bitlar bor? 3 - bu UART rejimida kerakmi?
qo'shib qo'ydi muallif asti, manba
Hurmatli Tiste, Sizning buyuk rahbarligingiz uchun sizga juda minnatdorman, bu jipning rasmiy SPI arduino kutubxonasini maqsadli MCUga berishga harakat qilaman, bu erda yangi savolga o'rin beraman, WBR.
qo'shib qo'ydi muallif asti, manba
Aslida men SPI versiyasini ( github.com/miguelbalboa/rfid ) portiga olishga harakat qilaman. UART bilan boshlanmoqda. Endi bu yerda biz yangi yil bayramlaridamiz va bundan keyin LPC ARM MCUs, WBR uchun ko'chirishni davom ettiraman.
qo'shib qo'ydi muallif asti, manba