前回でハードが完成しましたので、今回からソフトの作成に取り掛かりたいと思います。
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バイト入出力プログラムを作成していきたいと思います。