SD/MMCカード + H8/3052、今日も激ハマり。これはH8のSCIを使ってSD/MMCが要
求するクロックを発生させるのが難しいからなのだ。その原因はSCIが受信でク
ロックを発生しないから。
MMCカードが、ここから送信しますよ。というところで、ダミーの送信をかけて SCIにクロックを発生させないといけない。SD/MMCカードはこのクロックでデータを 送ってくる。
昨日のsci0_getcだと、セクタをリードしようとすると8byteごとに0xf,0x4とゴ ミが定期的に入る。オシロで見てもSD/MMCカードから、定期的にゴミが来る。 この原因はきちっとクロックが入ってなかったからのようだ。受信バイト毎に ダミーライトでクロックを供給することでなんとかなった。
あと、昨日はSD/MMCのDoutをH8のRXD0に直結していた。ちょっとGNDが浮くのが 気になってはいたのだけど、これを74VHC125経由にすると完全に浮いてしまっ てデータがとれない。これはAKI-H8/3052ボードのRXD0がADM3202につながって いるから。このピンを上げてやればきっちりGNDに落ちる。

なんとか最初のセクタがきちんと読めるのを確認しました。
MMCカードが、ここから送信しますよ。というところで、ダミーの送信をかけて SCIにクロックを発生させないといけない。SD/MMCカードはこのクロックでデータを 送ってくる。
昨日のsci0_getcだと、セクタをリードしようとすると8byteごとに0xf,0x4とゴ ミが定期的に入る。オシロで見てもSD/MMCカードから、定期的にゴミが来る。 この原因はきちっとクロックが入ってなかったからのようだ。受信バイト毎に ダミーライトでクロックを供給することでなんとかなった。
int8_t
sci0_getc3 ()
{
uint8_t c;
uint8_t r;
//受信用のクロックを発生させるために送信もイネーブル。
*SCI0_SCR |= (SCR_TE | SCR_RE);
do
{
r = *SCI0_SSR;
//これから受信するのに、受信バッファに何か入っていたらそれはゴミなので
//捨てます。
if (r & SSR_RDRF)
{
iprintf ("drain receive buffer.\n");
*SCI0_SSR &= ~SSR_RDRF;
}
}
while ((r & SSR_TDRE) == 0);
//ここでダミーライトしてクロックを発生させます。MMCカードはこのクロック
//に乗せてデータを送ってくる。(ことを期待している)
*SCI0_TDR = 0xff;
*SCI0_SSR &= ~SSR_TDRE;
//送られてくるのを待ちます。以下は普通の受信。
while (((c = *SCI0_SSR) & (SSR_RDRF | SSR_ERR_BITS)) == 0)
;
if (c & SSR_ERR_BITS)
{
*SCI0_SSR &= ~(SSR_RDRF | SSR_ERR_BITS);
iprintf ("error\n");
return 0;
}
c = *SCI0_RDR;
*SCI0_SSR &= ~SSR_RDRF;
*SCI0_SCR &= ~(SCR_TE | SCR_RE);
// SD/MMCはMSB側からの送信、H8のSCIはLSB側からの受信なのでここで逆転。
return bit_inverse (c);
}
これじゃほとんど調歩同期と変わらないけれど...
あと、昨日はSD/MMCのDoutをH8のRXD0に直結していた。ちょっとGNDが浮くのが 気になってはいたのだけど、これを74VHC125経由にすると完全に浮いてしまっ てデータがとれない。これはAKI-H8/3052ボードのRXD0がADM3202につながって いるから。このピンを上げてやればきっちりGNDに落ちる。

なんとか最初のセクタがきちんと読めるのを確認しました。
stack_start: 0xbfffc ROM data: 0x58d0-0x5ed0 RAM data: 0xbf000-0xbf600 1536byte bss: 0xbf600-0xbfdd0 2000byte NMI return address|CCR: 8000016e delay_div=40 calibrated. delay_div=40 delay_div=40 calibrated. delay_div=40 H8/3052 ud01 Monitor Build Jun 24 2009 20:13:11 [ VIRTUAL VECTOR TABLE *OFF* ] OFF: overlay module, ON: standalone module. >> l ~>Local file name? a.mot 308 lines transferred in 0 seconds ! Read 6823 byte. success Start address: 0x80000 data: 0xfe100-0xfe16c 108byte bss: 0xfe16c-0xfe36c 512byte MCU mode: 1 Overlay mode. >> >> mmc_reset response = 1 >> mmc_init response = 1 response = 1 response = 1 response = 1 response = 1 response = 0 >> cid response = 0 datastart 1()50(P)41(A)53(S)30(0)36(6)34(4)42(B)41(A)45(E)59(Y)9a()97()0()45(E)d3(S)>> ocr response = 0 ocr = 80 ocr = ff ocr = 80 ocr = 0 >> csd response = 0 datastart 0 5d 1 32 13 59 83 c9 f6 d9 cf ff 16 40 0 e7 >> read response = 0 r=ff datastart 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 8 0 6 7 60 e4 27 0 0 0 d9 e4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 55 aa crc0=ffffffc1, crc1=fffffffa >>
