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