マイコン独立大作戦
SDカードインターフェースの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
独立大作戦の作戦その1はCRTインターフェースボードの製作です。
作戦その2はキーボードインターフェースです。
そして作戦その3は、SDカードインターフェースです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第8回]
●82C55で試してみる
前回までのところでSDカードについての基礎的な事柄についての説明は大体終りました。
あとはこれからの作業の中で必要になった時点で説明を追加していくことにします。
SDカードからデータを読み出したり、SDカードにデータを書いたりするためには、SPIモードでの通信が必要です。
当然そのためのハードとソフトが必要となります。
ネット上ではほとんどの方がPICを使っているようです(しかもC言語で!)。
最近はarduinoなるものを使っている方も多いようです。
arduinoの本体はAVRですが、PICよりも扱いが簡単で(Windows上でいろいろな言語を使って開発できるらしい)、しかも低コストであるというところが人気の秘密のようです。
ま。
しかし。
私の場合、ここにarduinoを使うという選択肢はありません。
パソコンから独立するつもりが、それでは今度はarduinoに手足を縛られてしまいます。
おそらくは最終的にはPICを使うことになろうかとは思います。
もちろんその場合にはC言語ではなくて、PICアセンブラでプログラムをいたします。
ですけれど。
今はとりあえずのテストです。
簡単にカットアンドトライができなくてはテストになりません。
そうなりますと、今ここにPICを使うというのは、Cでもアセンブラでもちょいと厄介です。
カットアンドトライの度に毎回プログラムを焼かなければなりませんし、デバッグもままなりません。
そういうことになりますと、ここはやっぱりND80Z3.5の出番じゃありませんかねえ。
もともとND80Z3.5のもととなりましたTK−80はそういう目的で開発されたはずですから、こういう用途にはぴったりです。
ND80Z3.5はそのTK−80を発展させたものですから、自分で言うのも何なのですけれど、そりゃあ便利なのです。
えっと。
ごたくを並べるのはいい加減にしておきまして、下が今回SDカードの読み書きテストのためにND80Z3.5を使って速攻で作りましたテスト回路です。
ND80Z3.5の82C55入出力コネクタに接続できるように、ありあわせの基板を利用して作った回路です。
SDカードには+3.3V電源が必要です。
たまたまS81230の手持ちがあったので、それを使って+5Vから+3Vを作りました(3Vではちょっと電圧が低いですけれど、なんとかセーフのようです)。
+5Vと+3Vの信号のレベル変換にはオープンコレクタインバータの74HC05を使いました。
インバータですから信号のロジックが反転してしまいますが、そこはとりあえずソフトで対処することにします。
このように書きますと、
本当に82C55でSPIをやるのですか?
と聞かれそうですが。
その通りです。
やりますです。
別に、それほどのことではありませぬ。
ND80Z3.5はこういう場合でも器用にこなしてくれるのです。
こちらが今回試作したテスト回路の実物写真です。
SDカードソケットは今年の春にとりあえず試作的に作った基板に実装しました。
写真をよく見ますとシルクの文字がなんとか読めますが、当初はPIC16F87を使うつもりで設計した基板です。
裏側は毎度のことで、こんな調子です。
●テストプログラム
ND80Z3.5で実行するために、とりあえず作ったテストプログラムです。
2016/10/25 13:53 sdcdif2k.txt END=818E ;;; SD card PCI test program ;16.10.10 10.11 10.12 10.13 10.25 ; ORG $8100 ; CRLF=$101B REENT=$1033 HXDP2=$104B ; 8100 3E90 START0:LD A,90 8102 D383 OUT (83),A ;card init 8104 2E0A LD L,0A 8106 CD6E81 START01:CALL SINOUT 8109 2D DEC L 810A C20681 JP NZ,START01 ;CMD0 out 810D 3E02 LD A,02 810F D382 OUT (82),A;CS=L 8111 1640 LD D,40 8113 CD6E81 CALL SINOUT 8116 0604 LD B,04 8118 C5 START02:PUSH BC 8119 1600 LD D,00 811B CD6E81 CALL SINOUT 811E C1 POP BC 811F 05 DEC B 8120 C21881 JP NZ,START02 8123 1695 LD D,95 8125 CD6E81 CALL SINOUT 8128 16FF START03:LD D,FF 812A CD6E81 CALL SINOUT 812D 63 LD H,E 812E 7B LD A,E 812F F5 PUSH AF 8130 CD4B10 CALL HXDP2 8133 F1 POP AF 8134 FE01 CP 01 8136 C22881 JP NZ,START03 ; ;CMD1 out 8139 1641 START07:LD D,41 813B CD6E81 CALL SINOUT 813E 0604 LD B,04 8140 C5 START08:PUSH BC 8141 1600 LD D,00 8143 CD6E81 CALL SINOUT 8146 C1 POP BC 8147 05 DEC B 8148 C24081 JP NZ,START08 814B 16FF LD D,FF 814D CD6E81 CALL SINOUT 8150 16FF START09:LD D,FF 8152 CD6E81 CALL SINOUT 8155 63 LD H,E 8156 7B LD A,E 8157 F5 PUSH AF 8158 CD4B10 CALL HXDP2 815B F1 POP AF 815C B7 OR A;00? 815D CA6881 JP Z,END 8160 FE01 CP 01 8162 C25081 JP NZ,START09 8165 C33981 JP START07 8168 CD1B10 END:CALL CRLF 816B C33310 JP REENT ; ; D:out data E:in data 816E 0608 SINOUT:LD B,08 8170 7A SINOUT2:LD A,D 8171 2F CPL 8172 D381 OUT (81),A;data out 8174 3E01 LD A,01 8176 D383 OUT (83),A;pc0=1 out ~I_ 8178 7A LD A,D 8179 17 RLA 817A 57 LD D,A 817B 3E00 LD A,00 817D D383 OUT (83),A;pc0=0 out _I~ 817F DB80 IN A,(80) 8181 2F CPL 8182 1F RRA 8183 7B LD A,E 8184 17 RLA 8185 5F LD E,A;data in 8186 05 DEC B 8187 C27081 JP NZ,SINOUT2 818A 3E01 LD A,01 818C D383 OUT (83),A;pc0=1 out ~I_ 818E C9 RET ; ;END CRLF =101B END =8168 HXDP2 =104B REENT =1033 SINOUT =816E SINOUT2 =8170 START0 =8100 START01 =8106 START02 =8118 START03 =8128 START07 =8139 START08 =8140 START09 =8150 |
もちろんいきなり完璧に動くプログラムができたわけではありません。
何回もカットアンドトライを繰り返して、やっとなんとか動くところまで来たのです。
これで出来上がりではなくて、まだテストの途中の段階です。
これから少しずつ改良して、だんだん実用になるプログラムに近づけていきます。
今回はプログラムリストを見ていただくだけで、プログラムの説明には入りません。
次回に説明するつもりです。
今回はSCKの周波数についてだけ、確認をしておきます。
下がSCKパルスを出力する部分です。
8170 7A SINOUT2:LD A,D; 4 | 8171 2F CPL; 4 | 8172 D381 OUT (81),A;data out; 11 | 37 8174 3E01 LD A,01; 7 | 8176 D383 OUT (83),A;pc0=1 out ~I_; 11-- 8178 7A LD A,D; 4--------------------- 8179 17 RLA; 4 | 817A 57 LD D,A; 4 | 30 817B 3E00 LD A,00; 7 | 817D D383 OUT (83),A;pc0=0 out _I~; 11-- 817F DB80 IN A,(80); 11----------------- 8181 2F CPL; 4 | 8182 1F RRA; 4 | 8183 7B LD A,E; 4 | 45 8184 17 RLA; 4 | 8185 5F LD E,A;data in; 4 | 8186 05 DEC B; 4 | 8187 C27081 JP NZ,SINOUT2; 10 | |
SCKは82C55のPC0から出力します。
74HC05によって出力が反転しますから、PC0から1(H)を出力すると、SCKのラインはLになります。
逆にPC0から0(L)を出力すると、SCKのラインはHになります。
ここではちょっと複雑なことをやっています。
PC0からSCKを出力することと、PB7からデータを出力することと、PA0からデータを入力することとを一緒にやっています。
しかし、その動作の詳しい説明については、上に書きましたように、次回にすることにします。
ここではSCKにのみ注目して、その周波数を算定します。
リスト中にコメントとして書きましたように、Lの期間が30クロックでHの期間は82クロックです。
ND80Z3.5は6MHzなので、
30/6=5μs
82/6≒14μs
合計19μs
1000/19≒53KHz
です。
SD Association のSimplified SpecificationsでダウンロードできるPhysical Layer Simplified Specification なるドキュメントによりますと、初期化中(?)は100KHz〜400KHzという制約があるように取れる記載があるのですが(4.4 Clock Control)、上記プログラムを実行して試してみた限りでは、それよりも低い周波数でも問題はないようです。
またデューティも50%ではなくて25%ぐらいとかなり偏っていますが、これも支障はないようです。
このくらいのいい加減なSCKでもよいということになりますと、設計が楽になります。
SDカードインターフェースの製作[第8回]
2016.11.3upload
前へ
次へ
ホームページトップへ戻る