前回でハードが完成しましたので、今回からソフトの作成に取り掛かりたいと思います。

SD-CARDとの通信手順はELMさんのプログを参考にさせていただきました。
貴重な情報ありがとうございます。

まず最初に信号線を定義します^^
ハードでアドレスマップした情報をもとに定数を決めます。
inputポートは 0x84
outputポートも 0x84
inputポートの 7bit目に SD-CARDのDOを接続
outputポートの 5bit目に SD-CARDのCLKを接続
  同じく      6bit目に SD-CARDのCSを接続
  同じく      7bit目に SD-CARDのDIを接続

INPUTP  .equ    0x84
OUTPUTP .equ    0x84

;OUTPUT-PORT
S_DI    .equ    7               ;0b10000000  D7
S_CS    .equ    6               ;0b01000000  D6
S_CLK   .equ    5               ;0b00100000  D5

;INPUT-PORT
DO      .equ    7               ;0b10000000  D7

最初は CSをHレベルのまま、データ0xffを80個出力します。
ここでは、CS及びDIをHレベルのままし、クロックを80パルス出力しています。

xor     a
set     S_CS,a          ;CS="H"
set     S_DI,a          ;DI="H"
out0    (OUTPUTP),a
ld      b,80            ;80 clok output
call    loopspii

クロックパルス出力部分です。
NOP命令で、クロック幅を4μS(L=2μS、H=2μS)250KHzに調整しています。
クロックは、L=2μS→H=2μSとしています。

loopspii:
res     S_CLK,a         ;CLK    L
out0    (OUTPUTP),a
nop
nop
nop
nop
nop
nop
nop
nop

set     S_CLK,a         ;CLK    H
out0    (OUTPUTP),a
nop
nop
nop
nop
nop
djnz    loopspii
ret

続いて、ソフトウェアリセットをかけます。
ソフトウェアリセットのコマンドはCMD0で6バイト構成です。
CMD0命令は5バイトで1バイトのCRCが連結されています。
CRCの計算はCMD0命令により変化しますがCMD0は固定されていますからCRCは決め打ちできます。
実際のCMD0の命令コードは
0x40,0x00,0x00,0x00,0x00,0x95 で0x95がCRCとなります。

cmd0:                           ;;48bit(6byte) Fixed length
.db     0x40            ;;command index
.db     0x00            ;;argument
.db     0x00            ;;argument
.db     0x00            ;;argument
.db     0x00            ;;argument
.db     0x95            ;;CRC

CMD0コマンドを発行するとレスポンスとして、R1(0x01)が帰ってきます。
R1はすぐに返事があるとは限らないので、データ0xffを何度か出力して返事を確認します。
コマンド及びレスポンスを確認する際は、CSはLレベル(CD-CARDを選択した状態)にする必要があります。

xor     a
out     (OUTPUTP),a     ;CS="L" DI="L" CLK="L"
cmd0_out:
ld      hl,cmd0
call    cmd_out
call    r1_resp
cp      0x01
jr      nz,init_err

次はSD-CARDと通信する1bit入出力プログラムとこれをもとに1バイト入出力プログラムを作成していきたいと思います。

おすすめの記事