SDカードを自作回路で利用するスレ

このエントリーをはてなブックマークに追加
504774ワット発電中さん:2009/06/30(火) 01:01:42 ID:rbXZMj8B
>>502 >>503
ご親切にありがとうございます。
明日、クロックや信号を直に生成してポートから送ることを試してみたいと思います。
ちなみにMPLAB SIMでは、通信完了を待つ
while(PIR1bits.SSPIF == 0);で割り込みが来ずに、
無限ループになってしまいます。割り込みは全て有効にしてるはずなんだが・・・。
もしかしたらこの辺の設定がおかしい?続きはまた明日報告します。
505502:2009/06/30(火) 01:27:48 ID:eu/kVUW9
>>504
昔のソースからエッセンスだけ抜き取った
素人なのでセオリーに則しているかは知らないけど動作は確認してる
CSだけ書き換えて試してくれ

#define SPI_INTERRUPT_FLAG PIR1bits.SSPIF
#define SPI_CS LATCbits.LATC0
void mySPIInit(void)
{
OpenSPI(SPI_FOSC_4, MODE_00, SMPEND);
}
void mySPIWrite(unsigned char data)
{
unsigned char tmp;
tmp = SPIBUF;
SPI_INTERRUPT_FLAG = 0;
SPIBUF = data; // write byte to SSP1BUF register
while( !SPI_INTERRUPT_FLAG ); // wait until bus cycle complete
tmp = SPIBUF; // Clear the SPIBUF
}
unsigned char mySPIRead(void)
{
unsigned char tmp;
tmp = SPIBUF;
SPI_INTERRUPT_FLAG = 0;
SPIBUF = 0xFF;
while(!SPI_INTERRUPT_FLAG);
return SPIBUF;
}
void MMCReset(void) //SPIモードへの移行
{
unsigned char ret;
SPI_CS = HIGH;
for(ret=0;ret<10;ret++)mySPIWrite(0xff);//ダミーの80クロック
SPI_CS = LOW;
mySPIWrite(0x40);
mySPIWrite(0x00);
mySPIWrite(0x00);
mySPIWrite(0x00);
mySPIWrite(0x00);
mySPIWrite(0x95);
while((ret=mySPIRead())!=0x01);
do{
SPI_CS = HIGH;
mySPIWrite(0xff);
SPI_CS = LOW;
ret=MMCcommand(1,0);
}while(ret != 0x00);
SPI_CS = HIGH;
}
506774ワット発電中さん:2009/06/30(火) 02:49:35 ID:sWKwyVog
そこまで甘やかさなくても良いんじゃねぇの?
507natu:2009/06/30(火) 09:53:02 ID:d1hCoZqr
>>504
ADCON1でポートをデジタルI/Oにするか、MMC_SELECTをLATB2で
アクセスすれば動作しませんか?
508774ワット発電中さん:2009/06/30(火) 10:26:05 ID:QKZyXf13
>>501
ソース main2.txt 見ました。ってことは、CMD0 に00が返る??
なにか、別の原因じゃないの?
カードがまともに動いてない気がする。
CMD0には、普通、すぐに01が返るはずなんだが。
http://cid-ae570375f2baefb8.skydrive.live.com/self.aspx/.Public/SPI%7C_CMD0%7C_res.jpg
黄色:CLK、桃:コマンド、緑:CS、水:返答。
2回目で01が返ってる。時間で33μ秒(2GBのSD)
カードの電源を制御する回路入れたほうがいいんじゃない?
電源OFF−−>時間待ち(0Vになるのを確認する)
ーー>電源ON−−>時間待ち。
確実に電源OFFするには、カードに接続してるピンは全て
Lowか、フロートする必要あるけど。それと、プルアップも
その電源につなぐ。
509774ワット発電中さん:2009/06/30(火) 17:09:03 ID:sVNUzLP/
>>504
フラグ監視で待つんだから割り込みは有効にしちゃ駄目だよ
割り込み有効にしたらありもしない割り込みベクタに飛んで戻ってこなくなるんじゃないか
510774ワット発電中さん:2009/07/01(水) 01:02:48 ID:+ZxN4J0n
毎晩お世話になっております。>>501 >>504などでうまく行かない者です。
いろいろありがとうございます。レスいただいたことは全て試していますが、
未だ状況はかわりません。
いまのところ原因はPICの設定にあるとにらんでいます。
というのも、ついさっき解ったことに、SDカードを一切接続せず、
DINをVccに接続してもSSPBUFには0x00が受信されていることがわかりました。
511774ワット発電中さん:2009/07/01(水) 01:03:52 ID:+ZxN4J0n
訂正:
DINはDOUTの間違いです、DOUTに何もつながず、
プルアップ抵抗を介してVccをつながれております。
512774ワット発電中さん:2009/07/01(水) 01:53:21 ID:GkMq1bNf
プルアップなのに0x00だと?
513774ワット発電中さん:2009/07/01(水) 02:20:34 ID:GkMq1bNf
Port初期化で ADCON1かANSEL設定忘れてない?
それから 出力bit操作は
PORTBbits.RBx じゃなく
LATBbits.LATBx にすると吉
514774ワット発電中さん:2009/07/01(水) 17:13:43 ID:E0QkZ6mN
テスター当ててみたら
515774ワット発電中さん:2009/07/02(木) 08:10:22 ID:X2yQSg7H
>レスいただいたことは全て試していますが、
自分の頭で考えるということはまったくやらず,言われたことをただ
やってみましたってだけじゃあなぁ.

http://www.picfun.com/picbookA.html
おとなしくこのあたりでも買ってきてコピペして動かしてみることから
はじめたほうがいいんじゃね?
516774ワット発電中さん:2009/07/02(木) 10:11:53 ID:ScfpYnpw
>>510, 511
SDカードを接続する以前の問題じゃねえの。
SDカード接続せず、DINとDOを接続して、
自己ループで送信データが受信できるか試したほうが・・・
517774ワット発電中さん:2009/07/02(木) 23:11:53 ID:LhbNQ8lL
こんばんは、SDカード読み書きがうまく行かず、連日お世話になっている者です。
SPI通信さえ行えないと騒いでいた件は、単なるプログラムミスでした。
>>501のソースで デバッグ用に入れた WriteEEPROM(0,response,1); は
正しくは &response で、デバッグ上の単純ミスでしたorz
再びSDカードを接続してみたところ、はじめはまた意味不明なコードが返ってくることがあったのですが、
配線を動かしているうちにいつの間にかデータ読み書きがうまくできるようになりました!!嬉しいです。
うまく行かなかったのはどうもノイズや電圧の揺らぎが影響していた可能性が大きいです。
いずれにせよみなさんのおかげです、本当にありがとうございます!!

しかし、まだ問題があります。(続く)
518774ワット発電中さん:2009/07/02(木) 23:23:23 ID:8vnMGo6q
>>// レスポンスをPICのEEPROMに書き込み。
>>// (この関数は長い間使っているため信頼性は高いです)
>>
>>WriteEEPROM(0,response,1);
519774ワット発電中さん:2009/07/02(木) 23:32:29 ID:LhbNQ8lL
>>517に続き、残る問題なのですが、
0x00100000に読み書きしたつもりが、なぜか0x000E0E00を読み書きします。
どんなアドレスに書いたとしても0x1F200(269セクタ)前にズレてしまいます。
セクタ読み込みツールは複数のソフトで確認していますが、
どれでも読み込み結果は同じでした。これはSDカードの仕様の何か!?
520774ワット発電中さん:2009/07/02(木) 23:43:18 ID:LhbNQ8lL
0x00000000に書き込み、さらにそれを読み込んだところ、正常に処理が行え、
さらにSDカードのフォーマットを求められるようになりました。
つまり領域はあるということですね。

あまりくわしいことは解らないのですが、
ツールでは論理ドライブ名を指定して読み込むので、
物理ドライブとしてのセクターを頭から読んでいないようです。
249セクタはMBRなんだと思います。なんとなく解決しました。
521774ワット発電中さん:2009/07/02(木) 23:55:14 ID:mq27eYiS
>>519,520
0x1F200 って、リザーブセクタですよ。0xF9はありますね。
容量によって違いますが、MBR を読んだらその値も
書かれているはず。
http://nobumasa-web.hp.infoseek.co.jp/boot/boot.html
ここに詳しい解説あります。
522774ワット発電中さん:2009/07/03(金) 00:01:29 ID:njR6VBrL
ググれよ
ここ質問スレじゃないし
523774ワット発電中さん:2009/07/03(金) 03:54:22 ID:OvHCvblS
俺様のデバッグに付き合えって態度だもんな
524774ワット発電中さん:2009/07/03(金) 23:58:03 ID:6jKhpymG
何だかんだ言って、みんな楽しんでるくせに(はぁと
525774ワット発電中さん:2009/07/04(土) 01:28:04 ID:uFt2Bksc
気色悪い
526774ワット発電中さん:2009/07/04(土) 06:27:50 ID:yj4xCHRd
CMD16のブロックサイズは、実際どれぐらいまで小さくできるでしょうか?
1〜32バイトぐらいになりますか?
これはSDカードに依存するんでしょうか?
527774ワット発電中さん:2009/07/04(土) 07:20:26 ID:oV82IMWn
>>520
Disk Probe とか \\.\PHYSICALDRIVE とかで
調べてみれば?
528774ワット発電中さん:2009/07/04(土) 10:13:14 ID:JKRqk1gI
>>526
仕様ではカード依存。
Partial Writeがサポートされていれば1バイトでもOKらしい。
529774ワット発電中さん:2009/07/04(土) 16:01:29 ID:yj4xCHRd
ありがとうございました
16バイト単位ぐらいで読み書きできればマイコンストレージにちょうどいいので
実験してみます
530774ワット発電中さん:2009/07/04(土) 18:01:01 ID:cvUW60++
マイコンストレージならそんなに容量要らないと思うから各ブロックの頭数バイトずつだけ使ってあとはダミーデータで埋めておくのも手だな。
531774ワット発電中さん:2009/07/04(土) 18:12:01 ID:eMouTJbK
読み出しはともかく、書き込みは512が下限なのがほとんど。
532774ワット発電中さん:2009/07/05(日) 01:50:27 ID:Ds0zDVi5
なるほど
512バイト単位で先頭nバイトだけ使って、
以降は読み(書き)捨てるという方式も考慮すべきですね
ちょっともったいないですが2Gのカードで512バイト中、
32バイトしか使わないとしても、
2000000000 / 512 * 32 = 125000000で約120MB使えるから十分ですね
533774ワット発電中さん:2009/07/07(火) 04:02:39 ID:sxfcZ1mj
SunDisk MicroSD2GでCMD16で32バイトにして試してみました。
読み込みは上手くいきましたが、書き込みはどうやっても成功しませんでした。
素直に512固定で組んだ方が良さそうです。残念。
534774ワット発電中さん:2009/07/07(火) 06:33:43 ID:YZbui31u
「Partial WriteがサポートされていればOK」だから、CSDレジスタのWRITE_BL_PARTIALが
1かどうかだけ調べればいいよ。
535774ワット発電中さん:2009/07/07(火) 23:55:14 ID:sxfcZ1mj
>>533をCMD9でCSD読んでみました(128bit=16byte)
00 26 00 32 5f 5a 83 ae fe fb cf ff 92 80 40 df
後ろから見ていき、
df 11011111=> 1101111 1 (CRC7 1b)
40 01000000 => 0 1 0 0 00 00 (FileFormatGrp copy PermWriteProt TempWriteProt FileFormat RSV2)
80 10000000 => 10 0 00000 (WRITE_BL_LEN_L WRITE_BL_PARTIAL RSV5)
92 10010010 => 1 00 100 10 (WP_GRP_ENA RSV2 R2W_FACTOR WRITE_BL_LEN_H)
この解釈で合ってますでしょうか?
このデータからすると
WRITE_BL_LENが 1001(=9)ではなく1010(=10)なので、1024Byteということかな?
WRITE_BL_PARTIALは0でした。
536774ワット発電中さん:2009/07/08(水) 00:12:34 ID:y3F/lYmC
同様に6バイト目5a(0101 1010) 83(1 0 0 0 00 11)から 、
READ_BL_LEN は 1010(=10) 1024Byte、
READ_BL_PARTIALは1でした。
読み込みだけが成功するのに納得できました。
537774ワット発電中さん:2009/07/11(土) 02:54:10 ID:QnQtfrF0
SDHCは、アドレスの指定法がx512のパラグラフになった、
という以外は以前のSDとそれ程変わりないと考えて良いでしょうか?
538774ワット発電中さん:2009/07/11(土) 12:14:14 ID:M3BdOjVb
SDHCでは、CMD0 ---> CMD1 では初期化できないので
CMD0 CMD8 CMD58 ACMD41 .... で初期化してるなら
セクタ指定以外は同じ
SPIモードでの話しだけど。

539774ワット発電中さん:2009/08/07(金) 19:21:09 ID:xsk1d2JG
ATmega88のSPIで、SDの読み書きをやってみたんですが、
水晶20MHzだと、SPR1=0 SPR0=0 SPI2X=0 のfosc/4で
5Mbps(610KB/sec)が限界でした。
SDとのSPIはこの辺りが限界と考えるべきしょうか?
それとも高クロックのMCUではもっといくのでしょうか。
540774ワット発電中さん:2009/08/16(日) 16:22:25 ID:7N1LcDfv
答えは君の書き込みの中にある
541774ワット発電中さん:2009/08/16(日) 22:26:30 ID:YUMXoj0S
>>540
この件ですが、SI,CLK,CSに送る3.3Vを抵抗分圧で作ってましたが、
抵抗値が高すぎるのが原因だったみたいです。
低く抑えたらmega88でのSPI最大クロックの10MHzで通信できました。
542774ワット発電中さん:2009/08/18(火) 18:24:59 ID:C/PoZNge
どれだけ書き込むかわからないので、先にeraseコマンド送って
消しておいてから、マルチブロックライトしようとしてますが、この作戦で
書き込み待ち(10msくらいが限界)を避けられますか?
543774ワット発電中さん:2009/08/18(火) 20:34:10 ID:11SwTHN+
やってみれば?
544774ワット発電中さん:2009/08/18(火) 20:56:34 ID:wbhxqMxK
そうそう
545774ワット発電中さん:2009/08/21(金) 12:29:50 ID:uzOoWu4q
SDカードを自作するスレ と勝手に読み間違えて危うく突っ込みそうになった俺 orz
546774ワット発電中さん:2009/08/24(月) 07:07:58 ID:i08iBEt+
〜えっさ、ほっさ、えっさ、ほっさ、おれたちゃ兄弟、どこきる兄弟♪
547774ワット発電中さん:2009/09/19(土) 18:34:32 ID:vA93wYOx
カメラからの映像を、
SDカードに記録してくれるICって無いかな?
548774ワット発電中さん:2009/09/19(土) 19:16:28 ID:hka0vg5/
>>547
ユニットならいくらでもあるけどなぁ。
549774ワット発電中さん:2010/02/02(火) 05:17:08 ID:GL17eXOl
SDカードのバージョン(ver.1or2)とファイルシステム(FAT16or32)の確認方法を教えてもらえませんか
550774ワット発電中さん:2010/02/02(火) 22:54:49 ID:JjYJ8598
551774ワット発電中さん:2010/02/05(金) 19:35:18 ID:fz8fGzJ9
ありがとうございます
552774ワット発電中さん:2010/08/27(金) 20:49:40 ID:uCgRKQKr
読み出しサイズを512から128にするのはうまく行ったけど、
64にしようとしたらうまくいかない

そんなことってある?
553774ワット発電中さん
552の原因が判った
ブロックサイズを変えると、その境界をまたいで読み出しができなかった

512バイト単位の物理ブロックの境界なら判るけど、
論理的な読み出し単位の境界で、なんでそんな制約が?