【 秋月 AKI-H8 キットに外バスで HDD を付ける 】

  Back_to_Hobby_趣味ページの先頭に戻る Back_to_Home_表紙に戻るもどる

     > ■「ソフトウエアのページ」へ戻る

        > 「AKI-H8キットはパラダイスですか?」へ戻る

            > 「秋月 AKI-H8 キットに 1MバイトSRAM と LCD を付ける」へ

            > 「★このページはここです」

        > 「AKI-H8キットを使って - メモリと液晶とHDDを配線した写真」

 

 

モード6で16ビットデータ幅のCPU外部バスとして、
nCS2エリアで16ビット外部バスにHDDをつけてみたら、うごき出しました。
接続回路は簡単にしたかったので、危なっかしいですがバストランシーバを省略してます (^o^) 。
C-MOS の 74HC シリーズの手に入りやすい IC 3個だけでやってみました。TTL は H8 端子ドライブパワー不足で無理。74HCで秋葉原で手に入るICでむりやりアドレスデコード。
  INTRQ ラインは、普通のHDDはホストで10kΩプルアップ(CFカードの場合はメーカー都合(=不勉強メーカー都合)次第でプルダウンになるかも、だから)
  nDASP はHDDのアクセスのとき、74HCつかって外付けアクセスランプLED点滅のため。
  DD[15:0]ラインはH8ホスト側にほんとはプルアップ(10kΩ)必要。でもDD7ラインはプルアップ禁止(→だからDD7ラインだけは電流流し出しプルダウン抵抗必要という話に流れる・・この図ではつけてないけど)。
  IORDY は、昔々その昔、ハードディスクが遅くってFDDに毛の生えたレベルの性能のディスクに書いてる途中であふれそうになったらホスト(H8のこと)にnWAIT信号を入力して強制待ちさせてたとき必要だった名残り。OSとかのせるときは邪魔かも。
プロトコルは、ATA/ATAPI-4の PIO で動かしました(下記備考説明も見てください)。
Flash Card メーカーがパラレル True IDE を名乗ってても英語の ATA 標準プロトコル(INTRQタイミング)誤解してつくってるかもしれないのでアメリカ提携メーカーと台湾メーカーが安心。

CPUの外部バスに接続する最も汎用的な形式です、
Cプログラムでレジスタと変数との代入式を1行書くとそのまま読み書き動作します。
H8は高速すぎるので、ループ連続アクセスではムダ処理行を1〜2行いれました。

CPU(AKI−H8)側のアドレス(AD)とATA/ATAPI側のデバイスアドレス(DA)は
16ビットデータ幅でのデバイス結線関係です、一応確認のため。

CPU(AKI−H8)側 ATA/ATAPI側
A03 DA2
A02 DA1
A01 DA0

HDDのレジスタはnCS2エリアに配置しています。
HDDのレジスタは16ビット外バス接続で、nCS2エリアに配置していて、
バスウエイトは3で、外部デバイスからウエイト受付、の設定です。
奇数アドレス配置のレジスタには 16bit short の下位側バイトでアクセスしています。

この回路では、Cプログラムに書く都合で、 A[5:4] = nCS[0:1]に結線しています。
この回路では、DMAデータポートは A[5:4]=B'11(0x400030)にする必要があります。
回路図では液晶がPortA-0をジャマしてるので、DACK関係は未結線、DMA転送は未完成です。

nCS2エリアでのアドレス配置 読出しレジスタ名 書きこみレジスタ名
コマンドブロックレジスタ A[5:4] = [0,1] [nCS1=1, nCS0=0]
0x400010 ( i.e. short 0x400010) データレジスタ データレジスタ
0x400013 ( i.e. short 0x400012) エラーレジスタ フィーチャレジスタ
0x400015 ( i.e. short 0x400014) セクタカウント セクタカウント
0x400017 ( i.e. short 0x400016) セクタナンバー(LBA[7:0]) セクタナンバー(LBA[7:0])
0x400019 ( i.e. short 0x400018) シリンダロー(LBA[15:8]) シリンダロー(LBA[15:8])
0x40001B ( i.e. short 0x40001a) シリンダハイ(LBA[23:16) シリンダハイ(LBA[23:16])
0x40001D ( i.e. short 0x40001c) デバイスヘッド(LBA[27:24]) デバイスヘッド(LBA[27:24])
0x40001F ( i.e. short 0x40001e) ステータスレジスタ コマンドレジスタ
コントロールブロックレジスタ A[5:4] = [1,0] [nCS1=0, nCS0=1]
0x40002D ( i.e. short 0x40002c) アルタネートステータスレジスタ デバイスコントロール

 

 

【ATA/ATAPI標準のインターフェースプロトコルについて】
インターネット公開されている英文ドラフトを、ちゃんと読んで理解することをお勧めします。勉強すれば理解できるように書いてあります。分量は膨大ですが・・・・
オープンマインドのオープンアーキテクチャのアメリカ標準はさすがです。英語が読めれば絶対誤解しようのない、とても丁寧な記述です。趣味でドライブで遊ぶ僕達にも参考になります。
プロトコルをソースコードに書くには、ATA/ATAPI-4の9章の7、8、9がお勧めです。
ATAPIのコマンドコードを使うには、富士山コマンドSFF-8090をお勧めします。
僕はこれらを、自宅の個人趣味で3年くらい日本誤訳して一人で勉強してみました。
なお、ATA/ATAPI 標準委員会は標準書の一部を抜粋して公表する行為を禁止しています。

最近CQ出版社のインターフェース誌7月号にも ATA/ATAPI が特集されましたが、僕は参考にしていません。標準書から見て?で、結果オーライのところあったし・・・。
記事のCソースコードも、マクロ展開定義の記述部分の説明をスッポリ抜いてるので、あまり参考にならないとおもう。わざわざ分からなくするほどの内容でもないのにね (^_^) 。
僕はちゃんときれいに書けたらつけるかもしれない。

 

 Back_to_Hobby_趣味ページの先頭に戻る Back_to_Home_表紙に戻るもどる