MFRC522ライブラリのPCD_ReadRegister関数のrxAlignパラメータの機能

私はMFRC522 arduino libary( github から)をARM MCUに移植しようとしています。 私の問題は、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で受け取った最初のバイトは破棄され、 for の直前にある PCD_ReadRegister()最後に n バイトが読み込まれ、読み込みを停止する前に0が転送されます。

ライブラリとデータシートを簡単に見ると、 rxAlign 引数は、最初に受信したバイトの最初の有効ビットを識別するために使用されます。 txLastBits は同様の目的で使用され、最終バイトの送信にのみ使用されます。どちらもMFRC522の BitFramingReg に書き込まれ、MFRC522とカード/タグの間のビット指向フレームに必要です。

たとえば、上記の関数では、 rxAlign = 3 の場合、最初の受信バイトでビット7〜3のみが有効で、ビットマスク > 11111000 。したがって、最初の有効なバイトは、次の受信バイトのビット2〜0で連結された最初の受信バイトのビット7〜3を含みます。同様に、送信において、 txLastBits は、カード/タグに送信される最後のバイトのビット数を示す。どちらの場合も、RFフィールドで送受信されるものは8の倍数ではないため、これらの引数と BitFramingReg が必要です。

とにかく、これはライブラリの移植に全く干渉しないはずです。 Arduino固有の関数/インタフェースを置き換えて、ライブラリの既存ロジックをそのまま使用できるようにするだけです。


編集

私はあなたの質問に答えようとします:

  • この文脈では、106kBdはRC522とMCUの間のデータレートではなく、RC522とカード間のデータレートを指します。最大値は約848kBdです。詳細については、データシートを確認してください。
  • ビット指向のフレームは、アンチコリジョンプロセスのために必要です。いくつかのカードが一度にRC522と通信しようとするとき、マンチェスターエンコーディングのスーパーインポーズビットは、通常のバイトサイズの単位ではなく個々のビットを処理する必要があります。アンチコリジョン技術を見つけてください。
  • 同じ読者がその範囲内に複数のタグを持つ可能性がある場合は、衝突防止が必要です。 IEEEの記事:

タグの衝突は、RFIDシステムの大きな非効率性を招き、識別率が低く、読み取り範囲が狭くなり、リソースの使用効率が低下する可能性があります。パワフルな機能と機能性の制限により、受動的なタグでは問題が増えています。

したがって、一度に1つのカードしか提示しない場合は、コードに衝突防止を実装せずに安全でなければなりません。そうでなければ、あなたが読者を混乱させたくなければ、あなたは選択肢がないのではないかと思います。

あなたがしたいのは、UIDを読んだり、カード上のブロック(一度に1つずつ)に読み書きするだけのものであれば、この簡単な移植を試してみてください。 MFRC522 UARTライブラリを使用してください。

SPIベースのライブラリをまだ移植したい場合は、いくつかの提案をしてください:

SPIインターフェイスをUARTに置き換えたいとします。これは低レベルのもので、すべて PCD_ReadRegister()PCD_WriteRegister()などのいくつかの関数に含まれています。これらの関数は、内部実装の手がかりを持たない上位レベルの関数を提供しますが、それらの関数から特定の動作を期待します。 UARTで読者と会話する方法を理解するとすぐに、UART相当物のSPI機能を交換してください。 ARM UART関数がSPI関数とまったく同じように動作すると、ほとんどの作業が完了します。インタフェース固有のものには関係しないので、上位レベルの関数のすべての理由を知る必要はありません。これには rxAlign とその他のものに関するすべてが含まれます。がんばろう :)。

0
追加された
@MahmoudHD私は自分の答えを編集しました。
追加された 著者 TisteAndii,
@MahmoudHDこれは役に立ちますか?これを過ぎましたか?
追加された 著者 TisteAndii,
@MahmoudHDあなたはもうUARTに移植できませんか?
追加された 著者 TisteAndii,
おかげさまで、本当にありがとうございます。問題は、SPIからUARTへの接続周辺機器を使用するライブラリを変更する必要があることです。新しい質問:1 - データシートに基づくページ46-表48:これらのビットは、ビット単位の衝突防止106kBdで、他のモードでは0に設定されています。デフォルトでは、9600のボーレートでこれを避けることができますか?2秒の質問は私が何をしているのか理解していますが、なぜバイトがいつものように形成されず、最初のビットからは有効でないのですか?なぜデータストリームの始めに回避可能なビットがあるのですか?3 - これはUARTモードでも必要ですか?
追加された 著者 asti,
親愛なるTiste、本当にあなたの偉大な指導に感謝、私はターゲットMCUにこのチップの公式SPI Arduinoライブラリを移植するために懸命に取り組んでいます、私はここで新しい質問、WBRに配置されます。
追加された 著者 asti,
実際には、私はSPIバージョン( github.com/miguelbalboa/rfid )を移植しようとしています。まだUARTで初期化しています。今ここでは新年の祝日を過ごしています。その後、LPC ARM MCU、WBRの移植を続けます。
追加された 著者 asti,