2016.12.7
前へ
次へ
ホームページトップへ戻る

マイコン独立大作戦
SDカードインターフェースの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
WindowsパソコンにUSB接続して使う現行方式はそれなりに便利ではありますが、ときとしてWindows
のしがらみから開放されて、小さいながらも独立した一個のパソコンとして機能したいと思うこともあります。
独立大作戦の作戦その1はCRTインターフェースボードの製作です。
作戦その2はキーボードインターフェースです。
そして作戦その3は、SDカードインターフェースです。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第27回]


●CMD9

前回のCMD55とACMD41のペアの実行によってレスポンスが00になれば初期化は完了していますから、以後は直ちにデータのREAD、WRITEにかかってもよいのですが、CMD58と同様に、プログラムやインターフェース回路が正しく機能していることを確認するために、ここではCMD9を実行することにします。
CMD9はCSDレジスタ(Card−Specific Data register)の内容を知るためのコマンドです。
CSDレジスタを読むことでSDカード、SDHCカードのスペックを知ることができます。

CMD9のフォーマットは次の通りです。

49 00 00 00 00 FF

引数はありませんから00にします。
チェックサムは計算されませんからFFにしておきます。

CSDレジスタは128ビット(16バイト)です。
CMD9の応答はデータREADと同じ形式で行なわれます。
CMD9を送るとそれに対するレスポンスR1が返ってきます。
R1が00になるまで待ちます(入力を続けます)。
00が送られてきたあとはトークン(FE)が送られてくるのを待ちます。
FEを受信したあとにCSDレジスタの値(16バイト)が送られてきます。
最後にデータ部のCRCとして2バイト(CRC16)が送られてきます。
これは読み捨てればよいでしょう。

実行例は今まで何回かお見せしていますが、今回プログラムのCMD9部分を少し直しましたので、あらためて実行したログを下に示します。

logfile nd80zlog\12051625.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
ndwr2h.bin loaded,from E23F to E535
>/ld sdcdif5v.bin,8100
loading SDCDIF5V.BIN ...0235(565)bytes loaded,from 8100 to 8334
>jp 8100
CMD0
FF01
CMD8
FF01000001AA
CMD58
FF0100FF8000
CMD55
FF01
ACMD41
FF01
CMD55
FF01
ACMD41
FF00
CMD58
FF00C0FF8000
CMD9
FF00FFFE
400E00325B5900003B537F800A4000211278

40から21までの16バイトがCSDレジスタの値です(その後ろの1278はCRCです)。
CSDレジスタの値はV2(SDHCカード)とV1(スタンダードSDカード)とで異なっています。
下は「Physical Layer Simplified Specification」からの引用です。


[出典]SD Card Association:Physical Layer Simplified Specification Version 2.00

この表と照合するために、上のログの値をバイトとビットで表示してみました。

40       0E       00       32       5B       59       00       00 
01000000 00001110 00000000 00110010 01011011 01011001 00000000 00 00 0000
                                                                 >                                                                  
3B       53       7F       80       0A       40       00       21
00111011 01010011 01111111 10000000 00001010 01000000 00000000 00100001

CSDの表はバイトごとに区切られていないので照合しにくいのですが、定数を目安にすると照合しやすくなります。
SDHCカードでは先頭の2ビットが01になります。
4バイト目は最高データ転送速度で32は25MHz、5Aは50MHzです。
ログの値は32ですから、このカードは25MHz対応ということになりますが、SPIモードではこの値は保証されません。


[出典]SD Card Association:Physical Layer Simplified Specification Version 2.00

Class0というのはレガシィな全てのカードが扱う速度というだけで、具体的な値は示されていません。
ぶっちゃけ、SPIモードについては保証は一切しないので、こけないスピードで読み書きしなさいよ、つうことのようです。
まあどんなにがんばってみたって25MHzなんて恐ろしいパフォーマンスはとてもとても出せそうにありませんから、保証してくれなくとも大丈夫でありましょう。

さて、そのあとも定数値が続くのですが、ここで有用な値はC_SIZE(device size)[69:48]です。
22ビットですが上位2ビットは00なので実質20ビットです。
上のバイト、ビットで示した値では区切りがわかりにくいので、先頭部分の00のところにスペースを入れて、その下に>をつけて示しました。
このカードでは03B53という値になっています。
この値からカード容量を算出するには下の計算式を使います。


[出典]SD Card Association:Physical Layer Simplified Specification Version 2.00

3B53Hは15187ですから、15188×512KB=7776256KBということで、このカードが8GBであることを示しています。

●2GBのSDカードのCSDレジスタ

[第24回]ではスタンダードのSDカード(2GB)をSDHCカード用のプログラムで初期化してみました。
ことのついでですのでスタンダードのSDカード(Ver.1)のCSDレジスタも解析してみることにします。
こちらも新しいプログラムで読み出してみます。

>jp 8100
CMD0
FF01
CMD8
FF01000001AA
CMD58
FF0100FF8000
CMD55
FF01
ACMD41
FF01
CMD55
FF01
ACMD41
FF00
CMD58
FF0080FF8000
CMD9
FF00FFFE
002F00325B5A83BD6DB7FFBF1680009DAEB2

00から9Dまでの16バイトがCSDレジスタの値です(その後ろのAEB2はCRCです)。
上で書きましたようにCSDレジスタの値はV2(SDHCカード)とV1(スタンダードSDカード)とで異なっています。
下は「Physical Layer Simplified Specification」からの引用です。

[出典]SD Card Association:Physical Layer Simplified Specification Version 2.00

この表と照合するために、Ver.2と同じように、上のログの値をバイトとビットで表示してみました。

00       2F       00       32       5B       5A       83       BD 
00000000 00101111 00000000 00110010 01011011 01011010 100000 11 10111101
                                                            >
6D       B7       FF       BF       16       80       00       9D
01 101101 10110111 11111111 10111111 00010110 10000000 00000000 10011101
  <

SDHCカードでは先頭の2ビットが00になります。
4バイト目の最高データ転送速度はさきほどのSDHCカードと同じ32ですから25MHzです。

SDHCカードのC_SIZEは22ビットでしたがV1では12ビットしかありません([73:62]です)。
区切りがわかりにくいので、>と<でその範囲を示しました。
このカードではEF5という値になっています。
この値からカード容量を算出する計算式もSDHCカードとは異なっています。


[出典]SD Card Association:Physical Layer Simplified Specification Version 2.00

C_SIZE_MULTは[49:47]ですから、下位から数えて7バイト目のビット1、ビット0と6バイト目のビット7になります。
111(=7)です。
ですからMULT=2=512になります。
C_SIZEはEF5ですから10進数に直すと3829です。
BLOCK_NR=(3829+1)×512=1960960
READ_BLOCK_LENはAですから10です。
BLOCK_LEN=210=1024
なのでこのカードの容量は1960960KBということで2GBであることがわかります。

SDカードインターフェースの製作[第27回]
2016.12.7upload

前へ
次へ
ホームページトップへ戻る