質問: 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](https://i.stack.imgur.com/IZuzZ.jpg)
回答: '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` とその他のものに関するすべてが含まれます。がんばろう :)。