ここでビット単位の操作を行う理由は? (SPI FRAM読み出し方式)

参照: https://github.com/adafruit/Adafruit_FRAM_SPI/blob/master/Adafruit_FRAM_SPI .cpp 次のメソッドは、入力を読み取り、8ビットに変換します。私はその機能に関していくつか質問があります。

例としてaddr = 0xFFFFを使用すると、メソッドは変数を0xFFに変換します。私はビットが最後から削除されていることを理解していますが、確かに65535!= 255です。おそらく相対的に、最大サイズまでですが、これはどのように有用な変換ですか?私はここでビットごとに何かを見逃しているかもしれません..

uint8_t Adafruit_FRAM_SPI::read8 (uint16_t addr)
{
 digitalWrite(_cs, LOW);
 SPItransfer(OPCODE_READ); //read memory from fram array (2-byte)
 SPItransfer((uint8_t)(addr >> 8));
 SPItransfer((uint8_t)(addr & 0xFF));
 uint8_t x = SPItransfer(0);
 digitalWrite(_cs, HIGH);
 return x;
}

私が間違っている場合は、私の修正は、キャスティングは、記号拡張が発生するのを防ぐことです。

私が理論的に理解しているマスキングは、ここではその応用を全く理解していません。

最後に、常に同じ値x = 0を返します。なぜですか?

私はまた、書き込みメソッドがありますが、読み取りメソッドはありません。 read8のみ。推理?

1
追加された 編集された
ビュー: 3
上記のコードは、最初にアドレスの上位8ビット( addr> 8 )を送信し、次に下位8ビットを送信します。彼らがマスキングとキャスティングの両方をする理由は不明です。その後、8ビットのゼロビットを送信します。これらのビットの送信中、FRAMはarduinos MISOピンにアドレスの値を送ります。 8ビットの値は `x変数に格納されます。 SPIは双方向性であり、同時にデータを送受信できます。
追加された 著者 Al.,
数字に何が起こったかを考えてから、それらを4つのSPI転送に接続し、実際にSPIバスで何が起こったかを考えます。
追加された 著者 Majenko,

1 答え

addr0xbeef であるとしましょう。次に、各操作を分解した場合:

expression             │ value
───────────────────────┼───────
addr                   │ 0xbeef
addr >> 8              │ 0x00be
(uint8_t)(addr >> 8)   │   0xbe
addr & 0xFF            │ 0x00ef
(uint8_t)(addr & 0xFF) │   0xef

したがって、これは基本的にアドレスを2つの8ビットチャンクに分割しています。 それらのチャンクを個別に送信する。これは次のように行われます。 SPIはバイトのみを送信します。

キャスティングでは、符号拡張が発生しないようにしています。

addr は符号なしの番号なので、符号拡張ではないことはありません。 キャスティングは実際には有用な目的を果たしません。 コード。これは、 SPItransfer()uint8_t の引数です。 SPItransfer()を使用している場合は、キャスト可能 16ビットバージョンでオーバーロードされました。

最後に、常に同じ値x = 0を返します。なぜですか?

いいえ、 SPItransfer(0); の呼び出しが何を返しても返します。 FRAMモジュールによって送信されるデータ。

3
追加された