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