وظيفة المعامل rxAlign في وظيفة PCD_ReadRegister في مكتبة MFRC522

أحاول أن أحصل على MFRC522 libary (من github ) إلى MCM ARM. مشكلتي في وظيفة PCD_ReadRegister:

/**
 * 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 إجابة

فيما يتعلق بالصورة المنشورة في رسالتك حول "SPI Read Data" ، التي تقول ببساطة أن البايت الأول الذي يتم تلقيه عبر MISO يتم التخلص منه ، يتم ذلك في PCD_ReadRegister() مباشرة قبل لـ حلقة ، ثم يتم قراءة ن بايت ، مع 0 نقل آخر مرة للتوقف عن القراءة.

تُظهر نظرة سريعة على المكتبة ورقة البيانات أن الوسيطة rxAlign تُستخدم في تحديد أول بت صالح في البايتة الأولى المستلمة. يخدم txLastBits غرضًا مشابهًا ، فقط لنقل البايت النهائي. كلاهما مكتوب على BitFramingReg من MFRC522 وهما ضروريان للإطارات الموجهة نحو البتات بين MFRC522 وبطاقة/بطاقة.

على سبيل المثال ، في الوظيفة التي لديك أعلاه ، إذا كانت rxAlign = 3 ، فهذا يعني أن البتات 7 إلى 3 فقط صالحة في أول بايت مستلمة ، يتم استخراجها باستخدام قناع البت > 11111000 </القانون>. لذا فإن أول <�بايت> صالح "بايت" يتألف من بت 7 إلى 3 من البايت الأول المتسلسل المتسلسل مع البتات 2 - 0 من البايت التالي المستلم. وبالمثل ، في الإرسال ، تشير txLastBits إلى عدد بتات البايت الأخير التي سيتم نقلها إلى البطاقة/العلامة. في كلتا الحالتين ، قد لا يكون ما تم نقله أو تلقيه عبر مجال الترددات اللاسلكية مضاعفاً لـ 8 ، وبالتالي فإن الحاجة إلى هذه الحجج و BitFramingReg .

على أي حال ، لا ينبغي لهذا أن يتدخل على الإطلاق مع ترقية المكتبة. ببساطة استبدال وظائف/واجهات اردوينو محددة والسماح للمنطق المكتبة الحالية للبقاء كما هو.


تعديل </قوي>

سأحاول الإجابة عن أسئلتك:

  • في هذا السياق ، يشير 106kBd إلى معدل البيانات بين RC522 والبطاقة ، وليس بين RC522 و MCU. الحد الأقصى هو حوالي 848kBd ، على ما أعتقد. تحقق من ورقة البيانات لمزيد من التفاصيل.
  • الإطارات البالية المنحى ضرورية لعملية مكافحة التصادم. البتات المتراكبة في ترميز مانشستر ، عندما تحاول عدة بطاقات التواصل مع RC522 في وقت واحد ، تتطلب معالجة البتات الفردية على عكس الوحدات المعتادة بحجم بايت. ابحث عن التقنيات المضادة للتصادم.
  • من الضروري استخدام مضاد العدسة إذا كان للقارئ نفسه علامات متعددة في نطاقه. من مقالة IEEE:

يمكن أن تؤدي تصادمات العلامات إلى عدم كفاءة رئيسية في أنظمة RFID ، مما يؤدي إلى معدلات تعريف منخفضة ، ونطاق قراءة قصير ، واستخدام غير فعال للموارد. فهي أكثر إشكالية في العلامات السلبية بسبب القيود على الطاقة والوظائف.

لذا ، إذا كنت ستقدم بطاقة واحدة فقط في كل مرة ، فيجب أن تكون آمنًا دون تنفيذ مضاد للكسر في شفرتك. غير أنني أخشى أن لا يكون أمامك خيار إلا إذا كنت ترغب في إرباك القارئ.

إذا كان كل ما تريد فعله هو قراءة UIDs والقراءة من/الكتابة إلى الكتل على بطاقة (واحد في كل مرة) ، قد ترغب في محاولة نقل هذا مكتبة UART MFRC522 UART ، التي لا تنفذ anitcollision ، بالمناسبة.

إذا كنت لا تزال تريد إدخال المكتبة المستندة إلى SPI ، فبإمكانك تقديم بعض الاقتراحات:

تريد استبدال واجهة SPI بـ UART. هذه هي الأشياء ذات المستوى المنخفض ، وكلها متضمنة في وظائف قليلة مثل PCD_ReadRegister() و PCD_WriteRegister() وعدد قليل من الوظائف الأخرى. هذه الوظائف تخدم وظائف ذات مستوى أعلى ، والتي ليس لديها أي فكرة عن تنفيذها الداخلي ، ولكنها تتوقع سلوك معين منها. قم بمبادلة وظائف SPI لمكافئات UART الخاصة بهم ، بمجرد فهمك كيفية التحدث مع القارئ عبر UART. بمجرد أن تتصرف وظائف UART ARM تمامًا مثل وظائف SPI ، يتم إنجاز عملك تقريبًا ؛ ليست هناك حاجة لمعرفة سبب كل شيء في وظائف المستوى الأعلى لأنها لا ترتبط بأي شيء خاص بالواجهة. يتضمن ذلك كل ما يتعلق بـ rxAlign أو غيرها. حظا سعيدا :).

0
وأضاف
MahmoudHD لقد قمت بتحرير جوابي.
وأضاف المؤلف TisteAndii, مصدر
MahmoudHD هل يساعدك هذا؟ هل حصلت على هذا؟
وأضاف المؤلف TisteAndii, مصدر
MahmoudHD هل أنت غير قادر على الانتقال إلى UART بعد الآن؟
وأضاف المؤلف TisteAndii, مصدر
عزيزي Tiste ، حقا بفضل وصفك العظيم.المشكلة هو أنني يجب أن تغير المكتبات المستخدمة اتصال الطرفية من SPI إلى UART.3 سؤال جديد: 1 - على أساس ورقة البيانات صفحة 46 - الجدول 48: هذه البتات ليست سوى تستخدم ل anticolision البت في 106 kBd ، لجميع الأوضاع الأخرى يتم تعيينها إلى 0. ثم الافتراضي 9600 معدل الباود في uart هل يمكنني تجنب هذا؟ السؤال الثاني هو أنني أفهم ما يفعل ، ولكن لا أعرف لماذا نفعل هذا حتى الآن؟ لماذا لا يتم تكوين وحدات البايت كالمعتاد وغير صالحة من البتة الأولى؟ لماذا هناك بتات يمكن تجنبها في بداية دفق البيانات؟ 3-هل هذا ضروري في وضع UART أيضًا؟
وأضاف المؤلف asti, مصدر
عزيزتي Tiste ، حقا عن تقديره لك التوجيه الخاص بك كبيرة ، وأنا أحاول جاهدا لميناء مكتبة اردوينو SPI الرسمية لهذه الشريحة لبلدي MCU الهدف ، سأكون مكانا لسؤال جديد هنا ، WBR.
وأضاف المؤلف asti, مصدر
في الواقع يعني أنا أحاول أن ميناء نسخة SPI ( github.com/miguelbalboa/rfid ) ل بدء التشغيل مع UART حتى الآن. الآن نحن هنا في عطلة العام الجديد وبعد ذلك سأستمر في نقل ذلك ل LPC ARM MCUs ، WBR.
وأضاف المؤلف asti, مصدر