マイコン独立大作戦
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
前へ
次へ
ホームページトップへ戻る