stm32のFMCのアドレスライン
STM32F429に外部メモリを接続する。
F40x系だと、FSMCと称していてスタテック系のタイミングだけだけど、
F42xはSDRAMとかも行けるので、FMCと称している。
いままでも何度か使っていたのだけど、NAND FALSHとか、
小さめのSRAMばかりで、8bit幅ばかりだった。
今回16bit幅を使ったんだけど、A0を繋げるのを
忘れてしまった。
16bitバスなのに、アドレスピンはA0から使うのか...
まあ、そういうものだと言うならそうなんだろうね。
しょうがないので、メモリチップの近くで最上位ビット
のラインをパターンカットして代わりにA0を接続。
------
太古の昔、8086系では、16bitバスを16bitでアクセスする場合、
A0ピンは常にLに固定されていて、A1~A19で実際のメモリアドレス
を指定していた。
8bit単位の書き込み時のみ、A0とBHEが機能して、
奇数アドレスのみ、偶数アドレスのみへの書き込み制御をおこなっていた。
今の人に言っても、信じてもらえないことの一つだと思う。
各アドレスピンが、実際のアクセスアドレスと必ず一致していたので、
まあそうならざるを得ないんだけど。
確か、POWER PC プロセッサなんかは、32bitバス固定で
そもそもアドレスピンは、A2からしかなかったんだったか。
あー、アドレスバスと話はずれるが、
H8-300Hの外部データバス、8bitアクセスの時には、
D8~15を使ってアクセスしていたな。
16bitバス時はD0~15を使って、
当然ながら下位アドレスは、D0~7の方なのだが。
最初、8bitデバイスをD0~7に接続して、
うごかん~とかなった記憶がある。
先にSHを使ったので、思い切り引っかかった...
(SHの8Bitバス設定時のアクセスはD0~7を使う)
------
stm32(のFMC)は、各メモリバンクエリアの
初期設定でバス幅を設定する。
各アドレスピンが、実際のアクセスする
アドレスの各桁と一致しない構造
(設定バス幅によってシフトして出力される)になっている。
byteごとの書き込みには、NBL0~3が併用される
物理的なアドレスバス信号は必ずA0から始まるから、
便利っちゃ便利だけど、一つのメモリバンクエリア内では、
バス幅を混在させられないってことだ。
まあ、今どきそれで困るってことは、無いとは思うが...
stm32f429でも、(普通の)バスアクセスエリアは
4つまで持てるし。
今回はうっかりやってしまったが、
まあ勉強にはなったか。
| 固定リンク | 0
コメント