今回も読み込みコマンドです。プログラムを基に動作を追ってみます。

まずは、ダミーデータ(0xff)をCSの状態Hレベルで出して、ビット同期をとります。

cmd17のコマンドを出力します。ここでは読みだすブロックを0x2000としています。
コマンドレスポンス 0x00が帰ってくると リード準備OKです。

続いて、データブロックが受信されますが、データブロックの先頭レスポンス 0xfeをチェックします。
続いて 512バイトのデータを受信していきます。
ここでは、DJNZ命令で 初期値bレジスター=0x00を与えて 256バイトずつ 2回読みして 512バイト読み込みしています。

最後にCRC 2バイトが受信されますが読み捨てしています。本来はチェックすべきですが手抜きです^^;

ここで 受信データを完了したので、CSをLレベルでダミーデータ0xffを出力しています。

[asm] cmd17_out:
call dummy_data ;dummy data(0xff) out
ld hl,cmd17
call cmd_out ;cmd17 Issue
call r1_resp
cp 0x00 ;response is 0x00 read mode OK?
jp nz,init_err
cmd17_st:
call r1_resp ;read data start response?
cp 0xfe ;data start byte 0xfe?
jr nz, cmd17_st
ld b,0x00 ;read data size 256byte
ld hl,sd_buff ;read data buff address
cmd17_r:
call resp ;read data
ld (hl),a
inc hl
djnz cmd17_r

ld b,0x00 ;read data size 256byte
ld hl,sd_buff+0x100 ;read data buff address 257-512byte
cmd17_r2:
call resp
ld (hl),a ;read data
inc hl
djnz cmd17_r2

call resp ;crc Skipping read
call resp ;crc Skipping read
ld d,0xff ;dummy data 0xff(cs low)
call spi_8bit

[/asm] Cmd17コマンド
[asm] cmd17:
.db 0x51
.db 0x00
.db 0x00
.db 0x20
.db 0x00
.db 0xff
[/asm] バッファー設定
[asm] .org 0x3000
sd_buff:
.ds 512
[/asm]

受信したデータを256バイトごとにターミナルに出力します。
受信バッファはsd_buffに設定されていますのでHLレジにセットします。
ここでもDJNZ命令で 256バイトごとに 2回表示して 512バイトを表示させています。

16バイトごとに HLのアドレスを表示したのちに 1バイトごとに内容を16個表示させてます。
エイヤーのプログラムなので大目に見てください。改良点満載のプログラムです www

[asm] ld hl,sd_buff ;memory dump address

dump_hl512b: ;memory dump 512b
ld a,0x0d
call putchar

call hl_disp256 ;256bye dump
call putchar
call hl_disp256 ;256bye dump
call putchar
ret

hl_disp256:
push bc
ld b,0x00 ;dump data size 256bye
push hl
ld hl,dump_msg ;dump address msg output
call msgout
pop hl
ld a,h ;dump address HLreg
call hex_a_disp ;dump address output
ld a,l
call hex_a_disp
ld a," "
call putchar
call putchar
hl_disp256_loop:
ld a,(HL) ;dump addres data (HL)
inc HL
call hex_a_disp
ld a,b
cp 0x01 ;end dump size?
jr z,hl_disp256_loop1
ld a,b
and 0x0f
cp 0x01 ;0x?0-0x?f is 0x01(1line disp end?)
jr z,hl_disp256_cr
ld a," " ;space Insert
call putchar
jr hl_disp256_loop1
hl_disp256_cr:
ld a,0x0d
call putchar
ld a,h ;dump address HLreg
call hex_a_disp ;dump address output
ld a,l
call hex_a_disp
ld a," "
call putchar
call putchar
hl_disp256_loop1:

djnz hl_disp256_loop

ld a,0x0d
call putchar
pop bc
ret

dump_msg:
.str "addr +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F"
.db 0x0d
.db 0x00
[/asm]  
実際に0x2000ブロック目を512バイト読み込んだ表示内容は次のようになりました^^

[asm] addr +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
3000 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3010 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3020 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3030 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3040 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3050 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3060 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3070 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3080 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3090 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
30A0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
30B0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
30C0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
30D0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
30E0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
30F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF

addr +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +A +B +C +D +E +F
3100 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3110 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3120 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3130 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3140 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3150 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3160 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3170 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3180 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
3190 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
31A0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
31B0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
31C0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
31D0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
31E0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
31F0 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
[/asm]

すべて 0xffで埋め尽くされていました^^
次は 書き込みコマンドで このデータを上書きしたいと思います。

おすすめの記事