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

マイコン独立大作戦
SDカードインターフェースの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
独立大作戦の作戦その1はCRTインターフェースボードの製作です。
作戦その2はキーボードインターフェースです。
そして作戦その3は、SDカードインターフェースです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第12回]


●プログラムを改良しました

今まではとりあえずSDカードから何かを読み出すことができるところまでのテストでした。
そのためセクタREADコマンドCMD17も引数部は0のままで実行するプログラムになっていました。
結果としてはセクタbOが読み出されましたので、それまでのところはなんとかうまくいったようです。
そこで今度はセクタb指定して、その通りに読み出せるかどうかということのテストと、うまく読み出せたらその内容を解析する、という作業に移りたいと思います。
今までのプログラムでもできないことはないのですが、そのままではちょっと扱いにくいところがありますので、次のステップに移るために、プログラムの一部を改良しました。
下が改良したプログラムsdcdif2rのアセンブルリストです。

2016/10/26  21:50  sdcdif2r.txt
END=820F
              ;;; SD card PCI test program
              ;16/10/10 10/11 10/12 10/13 10/25 10/26
              ;
                ORG $8100
              ;
                CRLF=$101B
                REENT=$1033
                HXDP2=$104B
              ;
8100 C30681     JP START0
8103 00       SCTN_H:DB 00
8104 00       SCTN_M:DB 00
8105 00       SCTN_L:DB 00
8106 3E90     START0:LD A,90
8108 D383       OUT (83),A
              ;card init
810A 2E0A       LD L,0A
810C 16FF     START01:LD D,FF
810E CDBC81     CALL SOUT
8111 2D         DEC L
8112 C20C81     JP NZ,START01
              ;CMD0 out
8115 3E02       LD A,02
8117 D382       OUT (82),A;CS=L
8119 1640       LD D,40
811B CDBC81     CALL SOUT
811E 0604       LD B,04
8120 C5       START02:PUSH BC
8121 1600       LD D,00
8123 CDBC81     CALL SOUT
8126 C1         POP BC
8127 05         DEC B
8128 C22081     JP NZ,START02
812B 1695       LD D,95
812D CDBC81     CALL SOUT
8130 CDD681   START03:CALL SIN
8133 63         LD H,E
8134 7B         LD A,E
8135 F5         PUSH AF
8136 CD4B10     CALL HXDP2
8139 F1         POP AF
813A FE01       CP 01
813C C23081     JP NZ,START03
              ;
              ;CMD1 out
813F 0E41     START07:LD C,41
8141 110000     LD DE,$0000
8144 210000     LD HL,$0000
8147 CDF381     CALL COUT
814A CDD681   START09:CALL SIN
814D 63         LD H,E
814E 7B         LD A,E
814F F5         PUSH AF
8150 CD4B10     CALL HXDP2
8153 F1         POP AF
8154 B7         OR A;00?
8155 CA6081     JP Z,RTEST
8158 FE01       CP 01
815A C24A81     JP NZ,START09
815D C33F81     JP START07
              ;read test
8160 0E51     RTEST:LD C,51;index=11(17d)
8162 3A0581     LD A,(SCTN_L)
8165 B7         OR A;reset CF
8166 17         RLA
8167 67         LD H,A
8168 3A0481     LD A,(SCTN_M)
816B 17         RLA
816C 5F         LD E,A
816D 3A0381     LD A,(SCTN_H)
8170 17         RLA
8171 57         LD D,A
8172 2E00       LD L,00
8174 CDF381     CALL COUT
              ;test
8177 CDD681   RTEST2:CALL SIN
817A 63         LD H,E
817B 7B         LD A,E
817C F5         PUSH AF
817D CD4B10     CALL HXDP2
8180 F1         POP AF
8181 FEFE       CP FE;token
8183 C27781     JP NZ,RTEST2
8186 CD1B10     CALL CRLF
              ;data block read
8189 0610       LD B,10;=16 16x32=512
818B 210088     LD HL,$8800;*********** test
818E 0E20     RTEST3:LD C,20;=32byte
8190 C5       RTEST4:PUSH BC
8191 CDD681     CALL SIN
8194 E5         PUSH HL
8195 63         LD H,E
8196 CD4B10     CALL HXDP2
8199 E1         POP HL
819A 73         LD (HL),E
819B 23         INC HL
819C C1         POP BC
819D 0D         DEC C
819E C29081     JP NZ,RTEST4
81A1 CD1B10     CALL CRLF
81A4 05         DEC B
81A5 C28E81     JP NZ,RTEST3
81A8 CDD681     CALL SIN;crc(2bytes) read 
81AB 63         LD H,E
81AC CD4B10     CALL HXDP2
81AF CDD681     CALL SIN
81B2 63         LD H,E
81B3 CD4B10     CALL HXDP2
81B6 CD1B10   END:CALL CRLF
81B9 C33310     JP REENT
              ;
              ; D:out data
81BC 0608     SOUT:LD B,08
81BE 7A       SOUT2:LD A,D
81BF 2F         CPL
81C0 D381       OUT (81),A;data out
81C2 3E01       LD A,01
81C4 D383       OUT (83),A;pc0=1 out ~I_
81C6 7A         LD A,D
81C7 17         RLA
81C8 57         LD D,A
81C9 3E00       LD A,00
81CB D383       OUT (83),A;pc0=0 out _I~
81CD 05         DEC B
81CE C2BE81     JP NZ,SOUT2
81D1 3E01       LD A,01
81D3 D383       OUT (83),A;pc0=1 out ~I_
81D5 C9         RET
              ; E:in data
81D6 0608     SIN:LD B,08
81D8 3E01     SIN2:LD A,01
81DA D383       OUT (83),A;pc0=1 out ~I_
81DC 00         NOP
81DD 00         NOP
81DE 00         NOP
81DF 3E00       LD A,00
81E1 D383       OUT (83),A;pc0=0 out _I~
81E3 DB80       IN A,(80)
81E5 2F         CPL
81E6 1F         RRA
81E7 7B         LD A,E
81E8 17         RLA
81E9 5F         LD E,A;data in
81EA 05         DEC B
81EB C2D881     JP NZ,SIN2
81EE 3E01       LD A,01
81F0 D383       OUT (83),A;pc0=1 out ~I_
81F2 C9         RET
              ; CMD out
              ;C cmd
              ;D,E,H,L argument
81F3 D5       COUT:PUSH DE
81F4 51         LD D,C
81F5 CDBC81     CALL SOUT;cmd out
81F8 D1         POP DE
81F9 D5         PUSH DE
81FA CDBC81     CALL SOUT;D out
81FD 53         LD D,E
81FE CDBC81     CALL SOUT;E out
8201 54         LD D,H
8202 CDBC81     CALL SOUT;H out
8205 55         LD D,L
8206 CDBC81     CALL SOUT;L out
8209 16FF       LD D,FF
820B CDBC81     CALL SOUT;crc(dummy)+stop bit out
820E D1         POP DE
820F C9         RET
              ;
              ;END
COUT         =81F3  CRLF         =101B  END          =81B6  
HXDP2        =104B  REENT        =1033  RTEST        =8160  
RTEST2       =8177  RTEST3       =818E  RTEST4       =8190  
SCTN_H       =8103  SCTN_L       =8105  SCTN_M       =8104  
SIN          =81D6  SIN2         =81D8  SOUT         =81BC  
SOUT2        =81BE  START0       =8106  START01      =810C  
START02      =8120  START03      =8130  START07      =813F  
START09      =814A  

改良点のその1は、先頭にセクタアドレスを指定するためのエリアを置いたことです。
8103〜8105にセクタアドレスをセットして8100からプログラムを実行することで、指定したセクタを簡単に読み出すことができるようにしました(下にその部分を示します)。

8100 C30681     JP START0
8103 00       SCTN_H:DB 00
8104 00       SCTN_M:DB 00
8105 00       SCTN_L:DB 00
8106 3E90     START0:LD A,90

ここで指定した値は、下のRTEST:以下のところで、CMD17のアーギュメントとしてSDカードに送出されます。
しかしそのままではなくてちょっと変わった加工をしています。
何をしているのでしょうか?

              ;read test
8160 0E51     RTEST:LD C,51;index=11(17d)
8162 3A0581     LD A,(SCTN_L)
8165 B7         OR A;reset CF
8166 17         RLA
8167 67         LD H,A
8168 3A0481     LD A,(SCTN_M)
816B 17         RLA
816C 5F         LD E,A
816D 3A0381     LD A,(SCTN_H)
8170 17         RLA
8171 57         LD D,A
8172 2E00       LD L,00
8174 CDF381     CALL COUT

今回のプログラム変更によって、プログラムの先頭部分に置かれたセクタアドレスは3バイトです。
しかしSPIコマンドのアーギュメント(引数)は4バイトでした。
実はCMD17で指定するセクタアドレスはセクタbナはなくて、そのセクタの先頭アドレス(単位はバイト)なのです。

セクタbOはたまたま先頭のセクタなのでバイト単位で示しても00 00 00 00になって、問題はなかったのですが、たとえばセクタbPは00 00 00 01ではなくて、00 00 02 00になります(0200H=512バイト)。
また前回の終わりに出てきた、セクタbWB(00 00 00 8B)は、CMD17の引数では、00 01 16 00になります。
これは8Bをまず10進数に直して(139)、そこに512をかけて(71168)、それをまた16進数に直した値です。
または8B×200という16進数の計算をした結果です。
しかし毎回こんな計算をするのは厄介です。
そこでセクタbゥらバイトに換算する計算を組み込んだのが上のプログラムです。

セクタbェ1のときにバイトに換算したアドレスは00 00 02 00になります。
ビット表現に直すと 00000000 00000000 00000010 00000000 です。
最下位の1バイトは常に00000000です。
2番目から上のバイトはセクタb1ビット左にシフトした値になることに着目しました。

そのことをセクタbWBで確認してみます。
8Bは 00000000 00000000 10001011 です。
左に1ビットシフトすると 00000000 00000001 00010110 になります。
最下位の1バイトは常に00000000ですから、セクタbWBを読み出す命令は
51 00 01 16 00 FF になります。
なおSPI命令の引数の並びはリトルエンディアンではなくて普通に上位桁が先頭になるように配置します。

今回のプログラムではもうひとつ変更したところがあります。
それは読み出したデータの表示に関する部分です。
前回のプログラムでは読み出したセクタの内容を16進数でベタに表示しました。
そのままでは内容を解析するのに不便ですから、一旦適当なメモリアドレスに格納したうえで、プログラムの実行を終了してから、あらためてDMコマンドでその内容を表示できるようにしました。
下がメモリアドレス8800以降にデータを格納するようにした部分です。

               ;data block read
8189 0610       LD B,10;=16 16x32=512
818B 210088     LD HL,$8800;*********** test
818E 0E20     RTEST3:LD C,20;=32byte
8190 C5       RTEST4:PUSH BC
8191 CDD681     CALL SIN
8194 E5         PUSH HL
8195 63         LD H,E
8196 CD4B10     CALL HXDP2
8199 E1         POP HL
819A 73         LD (HL),E
819B 23         INC HL
819C C1         POP BC
819D 0D         DEC C
819E C29081     JP NZ,RTEST4
81A1 CD1B10     CALL CRLF
81A4 05         DEC B
81A5 C28E81     JP NZ,RTEST3

●セクタbWBを読み出してみました

プログラムを実行したあとで、DMコマンドでセクタbWBの内容を表示してみました。

logfile nd80zlog\11072127.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
ndwr2h.bin loaded,from E23F to E535
>/ld sdcdif2r.bin,8100
loading SDCDIF2R.BIN ...0110(272)bytes loaded,from 8100 to 820F
>cm 8103
8103 00-
8104 00-
8105 00-8b
8106 3E-
>jp 8100
FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01
FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01
FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF01FF00FF00FFFF
FFFFFE
EB0090202020202020202000024001000200020000F8EA003F0040008B000000
75573A00800029F84E16904E4F204E414D452020202046415431362020200000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000055AA
9D03
>dm 8800,89ff
8800  EB 00 90 20 20 20 20 20-20 20 20 00 02 40 01 00  ...        ..@..
8810  02 00 02 00 00 F8 EA 00-3F 00 40 00 8B 00 00 00  ........?.@.....
8820  75 57 3A 00 80 00 29 F8-4E 16 90 4E 4F 20 4E 41  uW:...).N..NO NA
8830  4D 45 20 20 20 20 46 41-54 31 36 20 20 20 00 00  ME    FAT16   ..
8840  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8850  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8860  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8870  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8880  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8890  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88A0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88B0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88C0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88D0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
88F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8900  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8910  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8920  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8930  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8940  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8950  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8960  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8970  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8980  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8990  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
89A0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
89B0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
89C0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
89D0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
89E0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
89F0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA  ..............Uェ
>/exit
0000 00C3 - 
リモート接続を終了しました
logfile closed at Mon Nov 07 21:28:53 2016

このセクタもほとんど00ですが、セクタbOとは逆に、前のほうにデータらしきものが見えます。
右のASCIIダンプではNO NAME、FAT16の文字が見えます。

本日は時間がなくなってしまいましたので、セクタ内容の解析は次回にすることにいたします。

SDカードインターフェースの製作[第12回]
2016.11.7upload

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