お世話になっております。
CPU:RX113
使用する機能:RSPI
RX113をマスターとし、デバイスとなるFRAMメモリのデバイスIDを読み出すことを考えています。
送出するコマンドは、8ビットの0x9F
このコマンドを送出すると、デバイスより32ビットのデータが返ってくることになっています。
● 現在の設定
コマンド数1、転送フレーム数1
ビット長:8ビット
この設定で、次のコードを実行しますと、図に示しましたように、最後の8ビット( Product ID ( 2nd Byte ) )が欠落してしまいます。
( メモリメーカーが示している、Manufacturer ID,Continuation code,Product ID(1st Byte)までは正しく返されています )
//// FRAM デバイスID 読み込み//
Y_RSPI0_Start(); PORT5.PODR.BIT.B3 = 0; // チップセレクト -> FRAM
while(RSPI0.SPSR.BIT.SPTEF == 0); // RDID コマンド送信 ( 送信バイト数:1、データ:0x9F ) RSPI0.SPDR.WORD.H = 0x009F; // データの送信 while(RSPI0.SPSR.BIT.IDLNF == 1); // 送信完了待ち
RSPI0.SPDR.WORD.H = 0x0000; // ID受信用ダミー(1) while(RSPI0.SPSR.BIT.IDLNF == 1); // 送信完了待ち
RSPI0.SPDR.WORD.H = 0x0000; // ID受信用ダミー(2) while(RSPI0.SPSR.BIT.IDLNF == 1); // 送信完了待ち
RSPI0.SPDR.WORD.H = 0x0000; // ID受信用ダミー(3) while(RSPI0.SPSR.BIT.IDLNF == 1); // 送信完了待ち
RSPI0.SPDR.WORD.H = 0x0000; // ID受信用ダミー(4) <--- この行の送信分が欠けてしまう。 while(RSPI0.SPSR.BIT.IDLNF == 1); // 送信完了待ち
while(RSPI0.SPSR.BIT.SPRF == 0); // 受信バッファフルの確認 (1)
FRAM_DEVICE_ID1 = RSPI0.SPDR.WORD.H; // while(RSPI0.SPSR.BIT.SPRF == 0); // 受信バッファフルの確認 (1) FRAM_DEVICE_ID2 = RSPI0.SPDR.WORD.H;
PORT5.PODR.BIT.B3 = 1; // チップセレクト 解除
Y_RSPI0_Stop();
上記コードを実行した時の、波形
転送フレームが1であるから最後の8ビットが欠けてしまったのであろうと、フレーム数を2にしたら、今度は先頭の8ビットしかデータが返ってきませんでした。
そもそもフレームの理解ができていないのですが、今回のように、送信8ビット、受信32ビットを実行するにはどのようにしたらよいのでしょうか。
ハードウェアマニュアルを読みましたが、正直なところよくわかりませんでした。
大変お手数をおかけしますが、ご教示願います。
※ 一連の質問で未だ受信データの取り込みは解決できておりませんが、先にSPIバスにデータが現れることを確認することを先に進めております。
Higetaka様
> 2回読み出すのがポイントです。
> FFなのは、1フレーム目の時のMISOの状態を読み出しているからでは?
> ---
> xxx = RSPI0.SPDR.LONG;
> FRAM_DEVICE_ID = RSPI0.SPDR.LONG;
---
とやってみてください。
あ゛、読めました !
確かに1回目の読み込みはFFでしたが、2回目の読み込みは上図の通り、正しい値が読み取れました。
ただ、わからないのは、この32ビットのデータ(デバイスID)は読み取ることができましたが、
ステータスレジスタなど、8ビットのデータは相変わらず読めず、FFになってしまうのです。
もしかして、強制的に32ビットのクロックを送出してあげないと読み取れないとかでしょうか。
8ビットのデータ(ステータスレジスタの状態)を返すコマンドを試した結果が次の図です。
図1 2フレームを用いて、8ビットのデータを受信してみた
正しい値「0x02」を連続4回送ってきています。
そして、SPDRの値は…
図2 SPDRの値=0
なぜか0.
32ビットの波形が示す値は、0x02020202
何故だろう? また問題が増えてしまいました orz
正しく取れれば、余計な部分はマスクしてしまえばよいのですが、違う値では使えません。orz