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

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

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

[第20回]


●セクタWRITEプログラム

今回は前回実行しましたセクタWRITEプログラムの説明です。
アドレス815Fまでは[第12回]のセクタREADプログラムと同じです。
セクタREADプログラムではその後ろがセクタREADになっていましたが、今回のプログラムでは、そこがセクタWRITEになっています。

2016/11/23  21:8  sdcdif3b.txt
END=8213
              ;;; 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 CDC081     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 CDC081     CALL SOUT
811E 0604       LD B,04
8120 C5       START02:PUSH BC
8121 1600       LD D,00
8123 CDC081     CALL SOUT
8126 C1         POP BC
8127 05         DEC B
8128 C22081     JP NZ,START02
812B 1695       LD D,95
812D CDC081     CALL SOUT
8130 CDDA81   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 CDF781     CALL COUT
814A CDDA81   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,WTEST
8158 FE01       CP 01
815A C24A81     JP NZ,START09
815D C33F81     JP START07
              ;write test
8160 0E58     WTEST:LD C,58;index=18(24d)
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 CDF781     CALL COUT
              ;test
8177 CDDA81   WTEST2: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 B7         OR A
8182 C27781     JP NZ,WTEST2
8185 CD1B10     CALL CRLF
              ;
8188 16FE       LD D,FE;token
818A CDC081     CALL SOUT
              ;
              ;data block write
818D 0610       LD B,10;=16 16x32=512
818F 210088     LD HL,$8800;*********** test
8192 0E20     WTEST3:LD C,20;=32byte
8194 C5       WTEST4:PUSH BC
8195 56         LD D,(HL)
8196 CDC081     CALL SOUT
8199 23         INC HL
819A C1         POP BC
819B 0D         DEC C
819C C29481     JP NZ,WTEST4
819F 05         DEC B
81A0 C29281     JP NZ,WTEST3
81A3 16FF       LD D,FF
81A5 CDC081     CALL SOUT;crc(2bytes) write
81A8 CDC081     CALL SOUT
              ;
              ;for test
81AB CDDA81   LOOP:CALL SIN
81AE 63         LD H,E
81AF 7B         LD A,E
81B0 F5         PUSH AF
81B1 CD4B10     CALL HXDP2
81B4 F1         POP AF
81B5 FEFF       CP FF
81B7 C2AB81     JP NZ,LOOP
              ;
81BA CD1B10   END:CALL CRLF
81BD C33310     JP REENT
              ;
              ; D:out data
81C0 0608     SOUT:LD B,08
81C2 7A       SOUT2:LD A,D
81C3 2F         CPL
81C4 D381       OUT (81),A;data out
81C6 3E01       LD A,01
81C8 D383       OUT (83),A;pc0=1 out ~I_
81CA 7A         LD A,D
81CB 17         RLA
81CC 57         LD D,A
81CD 3E00       LD A,00
81CF D383       OUT (83),A;pc0=0 out _I~
81D1 05         DEC B
81D2 C2C281     JP NZ,SOUT2
81D5 3E01       LD A,01
81D7 D383       OUT (83),A;pc0=1 out ~I_
81D9 C9         RET
              ; E:in data
81DA 0608     SIN:LD B,08
81DC 3E01     SIN2:LD A,01
81DE D383       OUT (83),A;pc0=1 out ~I_
81E0 00         NOP
81E1 00         NOP
81E2 00         NOP
81E3 3E00       LD A,00
81E5 D383       OUT (83),A;pc0=0 out _I~
81E7 DB80       IN A,(80)
81E9 2F         CPL
81EA 1F         RRA
81EB 7B         LD A,E
81EC 17         RLA
81ED 5F         LD E,A;data in
81EE 05         DEC B
81EF C2DC81     JP NZ,SIN2
81F2 3E01       LD A,01
81F4 D383       OUT (83),A;pc0=1 out ~I_
81F6 C9         RET
              ; CMD out
              ;C cmd
              ;D,E,H,L argument
81F7 D5       COUT:PUSH DE
81F8 51         LD D,C
81F9 CDC081     CALL SOUT;cmd out
81FC D1         POP DE
81FD D5         PUSH DE
81FE CDC081     CALL SOUT;D out
8201 53         LD D,E
8202 CDC081     CALL SOUT;E out
8205 54         LD D,H
8206 CDC081     CALL SOUT;H out
8209 55         LD D,L
820A CDC081     CALL SOUT;L out
820D 16FF       LD D,FF
820F CDC081     CALL SOUT;crc(dummy)+stop bit out
8212 D1         POP DE
8213 C9         RET
              ;
              ;END
COUT         =81F7  CRLF         =101B  END          =81BA  
HXDP2        =104B  LOOP         =81AB  REENT        =1033  
SCTN_H       =8103  SCTN_L       =8105  SCTN_M       =8104  
SIN          =81DA  SIN2         =81DC  SOUT         =81C0  
SOUT2        =81C2  START0       =8106  START01      =810C  
START02      =8120  START03      =8130  START07      =813F  
START09      =814A  WTEST        =8160  WTEST2       =8177  
WTEST3       =8192  WTEST4       =8194  

セクタWRITEプログラム(WTEST)もセクタREADプログラム(RTEST)とほとんど同じです。
READコマンドを送る(LD C,51)代わりにWRITEコマンドを送る(LD C,58)ところが異なっているところと、アドレス8177以降のコマンド送出後の動作が異なっています。
WRITEコマンドではコマンド送出後は00が送られてくるまで読み続けます。
00を確認したらデータの先頭を示すトークン(FE)を送ります。
続いて512バイトのセクタデータを送り、最後にCRCを2バイト送ります。
SPIモードではCRCはチェックされませんからダミーデータとしてFFFFを送ります。
データ送出後PCカードは内部処理が完了するまでの間ビジーマークとして00を送出します。
内部処理が完了すると以後は連続してFFが送出されるので、FFが返ってくるまで読み続けます。
FFを確認したら処理を終了します。

以上で2GBまでのSDカードに対してREAD、WRITEするための簡単なテストプログラムが出来上がりました。
あとはこのプログラムを踏み台にして、システムに組み込むための作業をすることになりますが、現在プリント基板を準備中ですので、その作業は基板ができてきてから取り掛かりたいと思います。
CRTIFのほうも途中で止まっていますので、そちらのほうも再開しなければなりません。

その前に。
2GBを越えるSDカードのアクセスについても整理しておきたいと思います。
せっかくテストをしても、時間が経つとどんどん忘れていってしまいます。
次回から大急ぎでFAT32について簡単にまとめたいと思います。

それが済んだら…。
ああ。
とにかく一杯書かなければいけないこと、やらなければいけないことを抱え込んでいます。
何が始まるか。
乞う。ご期待。

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

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