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