090626

|



SD/MMCカード + H8/3052、今日も激ハマり。これはH8のSCIを使ってSD/MMCが要
求するクロックを発生させるのが難しいからなのだ。その原因はSCIが受信でク
ロックを発生しないから。

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
>>