前回でディスク容量を増やしましたが、ここで新しいSDCARD(8GByte)を使用すると、pipコマンド(ファイルコピー)でハングアップする現象が出ました。

いろいろと原因を探ると、writeコマンドを発行しているときに無限ループになっていることが判明しました。

いろいろと対応を探ると、write:ルーチンの中でcmd25コマンドを発行する前に、同期のために 8ビットのダミーデータ(call dummy_data)を実行していましたが、これが影響してるようでした。

下記に、当確部分のcall dummy_dataをコメントアウトして、実行したら改善しました。完全とはいい難いとは思いますが^^;

write:
;	ld	a,"W"
;	call	putchar
 
	call	get_sector
 
spi_write1:
        ld      a,(r7)
        bit     6,a
        jp      z,write_SD_ver2
        ld      a,h                   ;SDHC
        ld      (cmd25+03),a
        ld      a,l
        ld      (cmd25+04),a
        jr      spi_write2
write_SD_ver2:                        ;Ver2
        ld      a,h
        ld      (cmd25+02),a
        ld      a,l
        ld      (cmd25+03),a    


spi_write2:
;        call    dummy_data		;;Write error avoidance (comment out)
        ld      hl,cmd25
        call    cmd_out
        call    r1_resp
        cp      0x00
        jp      nz,cmd25_err

また、直接の原因ではないと思いますが、SPIクロックCKをできるだけ50パーセントデューティーになるようにNOP命令を付加しました。(読み書き速度は落ちますが^^;)

spi_8bit:                       ;outdata Dreg,inputdata Ereg
        push    bc
        ld      c,0x00
        ld      b,0x08        
loopspi:
        xor     a
        rlc     d
        rra
        res     S_CLK,a         ;CLK    L
        out    (PIOAD),a
        nop			;Added to make the duty 50%
        nop			;Added to make the duty 50%
        nop			;Added to make the duty 50%
        nop			;Added to make the duty 50%
        nop			;Added to make the duty 50%
        nop			;Added to make the duty 50%
	nop
        nop
        nop
	nop
        nop
        nop
        set     S_CLK,a         ;CLK    H
        out    (PIOAD),a
        in     a,(PIOAD)
        rrca
        rl      e
        djnz    loopspi
        xor     a
	set	S_DI,a		;DI  H
        out    (PIOAD),a
        pop     bc
        ret

以上2点については、前回のTMPZ84C015のDISK拡張容量のBIOSについては、対応済みです。

おすすめの記事