2016.11.3
前へ
次へ
ホームページトップへ戻る

マイコン独立大作戦
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

前へ
次へ
ホームページトップへ戻る