フォト
無料ブログはココログ

MyList

« やっぱりソニーの話題に反応してしまう | トップページ | 「文章の書き方」本 »

2012年7月30日 (月)

バウンダリスキャンでRAMを読む

 若い人たちに、バウンダリスキャンでRAMを読む解説をすることがあるのだが、説明が悪いのか聞いてる人たちはあまりピンときてないようなので、LCMXO2280C-B-EVN+UrJTAGを使ってデモ環境を作ってみた。

「NORFlashやSRAMは、NANDFlashと違ってアドレスを入力してOE,CEをLにすればデータが出てくるので簡単に読める。」
という説明をしたいのである。

  • アドレス、OE、CE制御→データ出力
  • バウンダリスキャンでアドレス、OE、CE出力可能
  • バウンダリスキャンでデータ入力可能

簡単でしょ! というわけだ。
ベテランの人にこの話をしたら、
「そもそも、NORFlashやSRAMのアクセス方法を知らない人には、イメージできないのでは?」
という意見をもらった。
ならばと、アドレス、データに接続したスイッチをパチパチやって、データのアクセスが簡単っていうことが体験できるように、アドレス用8bit、データ用8bitのDipSWとOE、WEのスイッチを載せてみた。
Memtestboard

アドレス、データ入力スイッチはトグル・スイッチを使いたいところだけれど、安さに負けてDIPスイッチにした。

こんな↓回路にしてみた。

Memtestboard

バウンダリスキャンでRAMにアクセスしなければならないので、RAM(HM628256:256Kx8 SRAM)の端子、SWは個別にCPLDに入力し、バッファを経由してSWとRAMを接続している。

ここからが本題 バウンダリスキャンでRAMを読む
UrJTAGでFlashにアクセスするためにはBUSを定義するのが簡単である。デバイスがCPUであればすでに定義されていて、

jtag> help initbus
Usage: initbus BUSNAME
Initialize new bus driver for active part.

BUSNAME       Name of the bus

List of available buses:
au1500     AU1500 BUS Driver via BSR
avr32      Atmel AVR32 multi-mode bus driver, requires <mode> parameter
           valid <mode> parameters:
               x8:   8 bit bus for the uncached HSB area, via OCD registers
               x16:  16 bit bus for the uncached HSB area, via OCD registers
               x32:  32 bit bus for the uncached HSB area, via OCD registers
               OCD : 32 bit bus for the OCD registers
               HSBC: 32 bit bus for the cached HSB area, via SAB
               HSBU: 32 bit bus for the uncached HSB area, via SAB
                               (
                                )
prototype  Configurable prototype bus driver via BSR, requires parameters:
           amsb=<addr> alsb=<addr> dmsb=<data> dlsb=<data>
           ncs=<cs#>|cs=<cs> noe=<oe#>|oe=<oe> nwe=<we#>|we=<we>
      [amode=auto|x8|x16|x32]
                               (
                                )

で一覧が表示される。
このデモ環境ではCPLDを使用しているので、prototypeバスを使って自分でBUSを定義する必要がある。

jtag> initbus prototype amsb=A14 alsb=A0 dmsb=D7 dlsb=D0 ncs=nCS noe=nOE nwe=nWE amode=x8

のように指定すると、信号名D7、D6、D5、D3、D2、D1、D0を自動的に探してくれる。同様に信号名A14からA0を自動的に探してくれるので隣り合ったピンに配置していなくてもよい。
問題はA14~A0、D7~D0のように、プレフィックス'A'や'D'が同じで、サフィックス'14'~'0'が連続していなければならないことである。
LCMO2280では信号名はPT2D、PT2Cのような名づけ規則なので

jtag> initbus prototype amsb=PT2C alsb=PT6C ・・・・

のように指定してもうまく探してくれない。

エイリアス機能があって、PT2C→A14、PT6C→A0のエイリアスを指定してやればよさそうだ。エイリアス機能 saliasのヘルプを表示させると

jtag> help salias
Usage: signal ALIAS SIGNAL
Define new signal ALIAS as alias for existing SIGNAL.

ALIAS         New signal alias name
SIGNAL        Existing signal name

signalコマンドのヘルプが表示される。
aliasコマンドではなくてsignalコマンドを使えと言うことかと、signalでnOEを指定し、nOEに’0’を出力してみた。

jtag> signal nOE PT7A
jtag> print signals
Signals:
nOE PT7A
PL2A    input=PL2A      output=PL2A
         (
         省略
          )
jtag> set signal nOE out 0
signal 'nOE' cannot be set as output

ところが、nOEは出力に設定できないとおっしゃる。
ユーザマニュアルには saliasコマンドがちゃんと記載されているので、saliasコマンドでやってみると、

jtag> salias nOE PT7A
jtag> set signal nOE out 0

ちゃんと指定できるではないか。
ということで、SRAMの全ピンのエイリアスを設定するスクリプトを書いて実行すると、A14~A0、D7~D0、nCE、nOE、nWEが使えるようになった。

メモリ・アドレス0000hのデータを読むには、

  1. 外部テストモードに設定
  2. BSRのA14~A0にアドレス(0000h)、nCE、nOEに'0、nWEに'1'をセット
  3. BSR出力
  4. BSR入力
  5. データ表示
jtag> instruction EXTEST
jtag> shift ir
jtag> set signal A14 out 0
jtag> set signal A13 out 0
jtag> set signal A12 out 0
           (
            )
jtag> set signal A2 out 0
jtag> set signal A1 out 0
jtag> set signal A0 out 0
jtag> set signal nCE out 0
jtag> set signal nOE out 0
jtag> set signal nWE out 1

jtag> shift dr
jtag> shfit dr
jtag> get signal D7
D7 = 1
jtag> get signal D6
D6 = 1
         (
          )
jtag> get signal D1
D1 = 1
jtag> get signal D0
D0 = 0

メモリ・アドレス0000hにデータA5hを書くには、

  1. 外部テストモードに設定
  2. BSRのA14~A0にアドレス(0000h)、D7~D0にデータ(A5h)、nCE、nOWに'0、nOEに'1'をセット
  3. BSR出力
  4. BSRのnOEに'1'をセット
  5. BSR出力
jtag> instruction EXTEST
jtag> shift ir
jtag> set signal A14 out 0
jtag> set signal A13 out 0
jtag> set signal A12 out 0
           (
            )
jtag> set signal A2 out 0
jtag> set signal A1 out 0
jtag> set signal A0 out 0

jtag> set signal D7 out 1
jtag> set signal D6 out 0
jtag> set signal D5 out 1
jtag> set signal D4 out 0
jtag> set signal D3 out 0
jtag> set signal D2 out 1
jtag> set signal D1 out 0
jtag> set signal D0 out 1

jtag> set signal nCE out 0
jtag> set signal nOE out 1
jtag> set signal nWE out 0

jtag> shift dr

jtag> set signal nWE out 1
jtag> shfit dr

 基本的にはこれで読み書きできるのだが、この操作をアドレスを変えて何回も繰り返すのは大変だ。
ということでこれらの操作を自動的に行うメモリアクセス系のコマンド、peek、poke、writemem、readmemがある。

 アドレス0000hにA5hを書いて、それを読みだすには peek、pokeを使うととっても簡単である。

jtag> script D:\Users\Yoshi\Documents\JTAG\alias.txt 
Please use the 'include' command instead of 'script'
jtag> initbus prototype amsb=A14 alsb=A0 dmsb=D7 dlsb=D0 ncs=nCE
   nwe=nWE noe=nOE amode=x8
jtag> poke 0x0000 0xA5
jtag> peek 0x0000
bus_read(0x00000000) = 0xA5 (165)

めでたし、めでたし。
( 修正2012/8/26: nitbus→initbus)

 最も大きな問題は、このデモでNORFlash、SRAMはバウンダリスキャンで簡単に読めるということが分かってもらえるどうかなのだが


「自分の常識他人の非常識」にはいつも気を付けているつもりなのだが、見事にハマってしまった。

« やっぱりソニーの話題に反応してしまう | トップページ | 「文章の書き方」本 »

JTAG」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: バウンダリスキャンでRAMを読む:

« やっぱりソニーの話題に反応してしまう | トップページ | 「文章の書き方」本 »