Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page

MMCドライバでのエラーについて

RL78/G14にMMCドライバを組込みSDカードの処理を作成しておりますが、

デバイス初期化処理(R_SPI_MMC_Init_Device())でエラーが返ってきており困っております。

 

エラー値はMMC_ERR_OTHERです。

処理を追っていくとSPIでMMCへCRCコマンド(MMC_CMD59)のONを送信、その後の受診処理も抜けたものの、

受信バッファの中身の特定のbit(0x80)が立たないという事でMMCからの?レスポンスがなかったと判断されている様です。

SPIの送受信(R_SIO_Tx_Data/R_SIO_Rx_Data)はエラー返却されていないのでSPI通信自体は通過していると思っていますが、

何か考えられる原因はありませんでしょうか?

 

作成にあたり以下を参考にしております。

■RL78 ファミリ オープンソースFAT ファイルシステムM3S-TFAT-Tiny: 導入ガイド

https://www.renesas.com/jp/ja/software/D3017500.html

 

■RL78 ファミリ オープンソースFATファイルシステム M3S-TFAT-Tinyへの SPI モードMMC/SD メモリカード・ドライバ・ソフトウェアの組み込み例

www.renesas.com/.../D3012228.html

  • > 何か考えられる原因はありませんでしょうか?

    ・SDカードが刺さっていない
    ・SDカード故障
    ・結線間違い
    ・実機が動作しておらずシミュレータで実行した
    ・狐に化かされた
    ・狸に 〃
    ・貉に 〃

    ありがちなのはこの辺ですね。
  • miesuqe、こんにちは。NoMaYです。(以前、RTOSに関する質問にリプライしたことがあります。)

    MMCには詳しくない(というより全然分からないというレベル)ですが、オシロで通信データを観測すると特定のbit(0x80)というのは立っているでしょうか? また、通信データ自体立っていなかったとしたら、通信プロトコル上どのような意味になるでしょうか?それが、通信プロトコル上問題無い筈である場合、ドライバのバグということになる筈ですので、この後このスレッドへのレスが無ければ、ルネサス社の問い合わせ窓口にコンタクトされてはどうでしょうか?

    もしくは、上に書いたことについて調べた結果を投稿されると、何か思い当たることがある人のレスが付く可能性が高まると思います。

    #一般論で、すみません、、、

  • miesuqeさん

    こんにちはシェルティと申します。

    主にRXマイコンのネットワーク・セキュリティ周りのミドルウェアおよび、
    デバイスドライバ群(FIT)の開発を担当しております。
    RL78のソフト開発も一部担当しております。
    今回使っていただいているFATとMMCドライバも私が開発しました。
    #といっても引継ぎ品です、という防衛線をいちおう張らせてください。

    まずは、確実に動作する環境を一式そろえるのが良いかと思います。

    この件ですが、MMCドライバという名称の通りMMCコマンドしか対応しておりません。
    この結果、MMCコマンドに対応したSDカード、つまり2GB以下のSDカードしか認識できません。
    さらに2GB以下でもMMCコマンド対応がないものもあるようです。
    MMCカードか、2GBのSDカード(2GBのうちMMCコマンド対応品)を見つけていただくのが
    手っ取り早く動作確認する方法です。

    それから、ボードはRL78/G14による音声再生の初手動作確認においては以下がおすすめです。
    www.marutsu.co.jp/.../

    以下サンプルがそのまま動きます。
    www.renesas.com/.../D3017501.html

    あと、従来はSDカードの仕様が公開されていなかったので上記のような苦肉の策を採ったのですが、
    昨今、SD Simplified SpecificationというのがSD Associationから公開されまして、方針を変えました。
    SD Simplified Specificationに従ったソフト・情報であればルネサスから公開可能という判断しております。
    まずは、SDHI(SD Host Controller)を載せているRX65N等の製品用にSDHI制御用のSDカードドライバを公開しました。
    つぎに、SPI制御用のSDカードドライバの公開も目指して計画を進めています。
    実はRL78用のSPI制御用のSDカードドライバの準備を進めております。

    ウェブの公開はまだ先ですが、動作確認ができるサンプルコードは近々問い合わせベースでの配布用に
    準備しようと思っています。
    もしRX用、またはRL78用のSDカードドライバを試される場合は弊社サポートにお問合せください。
    ベストエフォートでサンプルコードを準備して提供します。

    以上です
  • In reply to シェルティ:

    miesuqeさん

    こんにちはシェルティと申します。

    すみません、書き忘れました。
    SD Simplified Specificationは試作検討用に使うことはできますが、
    商用の量産製品に適用するならば従来通りSD Associationから有償ライセンスを受ける必要があります。
    量産を目指す場合は、はやめにSD Associationにご相談ください。

    以上です
  • miesuqeさん、おはようございます。NAKAといいます。

    去年、SDカードのデバイスドライバを作ってみました。
    NAKAオリジナルなので参考になるのかわかりませんが良かったら見てみてください。
    但し、SDSC(2Gまで)専用も作りましたが、SDHC(32Gまで?)専用です。
    本当は全て対応が良いと思うのですが、SCとHCではCMD17の読み出しでもSCは絶対アドレス、HCはブロック番号といちいち違うので、SC(2Gまで)はこれからそんなに使わないだろうと思いHC専用としました。

    但し!! 今は、関数使ってるだけで、ほとんどMMCコマンドも忘れちゃいました.........汗)

     

    まずSPIの設定は大丈夫でしょうか?

    みたいに直接SDカードにつなぐ場合は、

    SIR00 = 0x0003;       //
     SMR00 = 0x0020;       //初期値(シングル転送) 連続転送はダメだった。
     SCR00 = 0xC007;       //送受信設定、クロック位相(type1)=0xC007、NON、MSB、8bit
                           //クロック位相(type3)=0xE007
     SDR00 = 0x3E00;       //ボーレート分周(1/?)
                           //187500bps=0x3E00?@?@?x??!
                           //3000000bps=0x0200
              
     SO0 |= 0x0100;       //シリアル・クロック出力値が“1”
     SO0 &= ~0x0001;       //シリアル・データ出力値が“0”
     SOE0 |= 0x0001;       //シリアル通信動作による出力許可

    のようになると思います。

    そして、初期設定は

    /*******************************************************************************
    // 関数名 : init_MicroSDHC(void)
    // 動作 : SDカードの初期化(SDHC)
    // 引数 : 戻り値: 最後のCMD1のリターン値
    //    0x00:正常終了        
    //    0x01:初期化中のまま終了      
    //    0xFF:ビジーのまま終了
    // 作成 : NAKA  17.05.29
    // ****************************************************************************/
    unsigned char init_MicroSDHC(void)
    {
     unsigned short i;
     unsigned short j;
     unsigned char error_code,res,f_res;
     unsigned char f_NG;
     
     __DI();         //割り込み 禁止☆070801

     error_code = 0xFF;
     f_NG = 0;
     CSI00_CS = 1;       //終了
     //(2)80クロックのダミークロック
     for(i=0; i<10; i++)
     {
      WriteSPI0(0xFF);  //80クロック送信(値は0xFF)
     }
     //(3)CSをLにしてCMD0(CRC付き)を発行
     CSI00_CS = 0;       //開始
        WriteSPI0(0x40);   //CMD0:リセット命令 SPIモードへ移行
        WriteSPI0(0x00);    //引数1
        WriteSPI0(0x00);    //引数2
        WriteSPI0(0x00);    //引数3
        WriteSPI0(0x00);    //引数4
        WriteSPI0(0x95);    //CRC7
     //(4)データラインにレスポンス(x01)
     //while(ReadSPI0()!=0x01);  //0x01待ち *要タイムアウト設定
     while(ReadSPI0()!=0x01)   //0x01待ち *要タイムアウト設定
     {
      j++;
      if(j >=6500)    //タイムアウト
      {
       j = 0;
       f_NG = 1;
       break;
      }
     }

     if(f_NG == 0)
     {
     //(5)CMD1を発行。レスポンス(0x01) *SDHCタイプのカードの場合はCMD8を発行。レスポンスが0x01か0x00ならSDHCの可能性あり、以下の処理が異なるので注意
     //(6)レスポンスが0x00になるまでCMD1を発行。初期化完了。
     f_res = 1;
     do{
      CSI00_CS = 1;   //同期を取る(以下3行)
      WriteSPI0(0xFF);
      CSI00_CS = 0;
      WriteSPI0(0x48);  //CMD8:初期化&状況確認(レスポンス0x01は初期化中、0x00は終了)
      WriteSPI0(0x00);   //引数1
         WriteSPI0(0x00);   //引数2
         WriteSPI0(0x01);   //引数3
         WriteSPI0(0xAA);   //引数4
         WriteSPI0(0x87);   //CRC7(実際にはSPIモードなので無視される)
      for(i=0; i<1000; i++) //レスポンスチェック(通常は数回でコマンドレスポンスが返る)
      {
       res = ReadSPI0();
       if (res != 0xFF) break; //レスポンス評価、ビジー(0xFF)検出ならリトライ
      }
      if(res == 0x01){f_res = 0;}
      if(res == 0x05){f_res = 0;}
     }while(f_res);  //*要タイムアウト設定

     do{
      CSI00_CS = 1;   //同期を取る(以下3行)
      WriteSPI0(0xFF);
      CSI00_CS = 0;   //【10】
      WriteSPI0(0x7A);  //CMD58:初期化&状況確認
      WriteSPI0(0x00);   //引数1
         WriteSPI0(0x00);   //引数2
         WriteSPI0(0x00);   //引数3
         WriteSPI0(0x00);   //引数4
         WriteSPI0(0xFD);   //CRC7(実際にはSPIモードなので無視される)
      for(i=0; i<1000; i++) //レスポンスチェック(通常は数回でコマンドレスポンスが返る)
      {
       res = ReadSPI0();
       if (res != 0xFF) break; //レスポンス評価、ビジー(0xFF)検出ならリトライ
      }
     }while(res != 0x01);  //*要タイムアウト設定

     res = ReadSPI0();    //res = 0x00?
     res = ReadSPI0();    //res = 0xFF?
     res = ReadSPI0();    //res = 0x80?
     res = ReadSPI0();    //res = 0x00?

     f_res = 1;
     do{
      CSI00_CS = 1;   //同期を取る(以下3行)
      WriteSPI0(0xFF);
      CSI00_CS = 0;   //【13】
      WriteSPI0(0x77);  //CMD55:初期化&状況確認
      WriteSPI0(0x00);   //引数1
         WriteSPI0(0x00);   //引数2
         WriteSPI0(0x00);   //引数3
         WriteSPI0(0x00);   //引数4
         WriteSPI0(0x65);   //CRC7(実際にはSPIモードなので無視される)
      for(i=0; i<1000; i++) //レスポンスチェック(通常は数回でコマンドレスポンスが返る)
      {
       res = ReadSPI0();
       if (res == 0x01) break; //レスポンス評価、ビジー(0xFF)検出ならリトライ
      }

      res = ReadSPI0();  //ダミーREADこれが必要!
      res = ReadSPI0();  //ダミーREADこれが必要!

      WriteSPI0(0x69);  //CMD41:初期化&状況確認
      WriteSPI0(0x40);   //引数1
         WriteSPI0(0xFF);   //引数2
         WriteSPI0(0x80);   //引数3
         WriteSPI0(0x00);   //引数4
         WriteSPI0(0x17);   //CRC7(実際にはSPIモードなので無視される)
      for(i=0; i<1000; i++) //レスポンスチェック(通常は数回でコマンドレスポンスが返る)
      {
       res = ReadSPI0();
       if(res == 0x00){f_res = 0;}
       if(res != 0xFF) break;
      }
     }while(f_res);  //*要タイムアウト設定


     do{
      CSI00_CS = 1;   //同期を取る(以下3行)
      WriteSPI0(0xFF);
      CSI00_CS = 0;   //【10】
      WriteSPI0(0x7A);  //CMD58:初期化&状況確認
      WriteSPI0(0x00);   //引数1
         WriteSPI0(0x00);   //引数2
         WriteSPI0(0x00);   //引数3
         WriteSPI0(0x00);   //引数4
         WriteSPI0(0xFD);   //CRC7(実際にはSPIモードなので無視される)
      for(i=0; i<1000; i++){ //レスポンスチェック(通常は数回でコマンドレスポンスが返る)
       res = ReadSPI0();
       if (res != 0xFF) break; //レスポンス評価、ビジー(0xFF)検出ならリトライ
      }
     }while(res != 0x00);  //*要タイムアウト設定

     res = ReadSPI0();    //res = 0xC0?
     res = ReadSPI0();    //res = 0xFF?
     res = ReadSPI0();    //res = 0x80?
     res = ReadSPI0();    //res = 0x00?

        //(8)通信速度再設定         ボーレート変更!!
     ST0 |= 0x0001;    //ch0を停止
     SOE0 &= ~0x0001;   //シリアル通信動作による出力禁止
     SDR00 = 0x0200;    //ボーレート分周(1/?)
            //153600bps=0xCE00
            //312500bps=0x6400
            //2500000bps=0x0600
            //★5000000bps=0x0200
     SOE0 |= 0x0001;    //シリアル通信動作による出力許可
     SS0 |= 0x0001;    //ch0を開始

     }
     else
     {
      res = 0xFF;
     }

        error_code = res;
     
     __EI();      //割り込み 許可☆070801
     
        return error_code;
    }

    みたいに作りました。

    WriteSPI0は

    /************************************************/
    /* SPI1の送信バッファに1バイト書き込み  */
    /************************************************/
    void WriteSPI0(unsigned char data_out)
    {
     SIO00 = data_out;
     CSIIF00 = 0;
     while(!CSIIF00)          //送信完了状態になるまで待つ
     {
      __nop();
     }
    }

    ReadSPI0は、

    /************************************************/
    /* SPI1 1バイト受信          */
    /************************************************/
    unsigned char ReadSPI0(void)
    {
     SIO00 = 0xFF;
     CSIIF00 = 0; 
     while(!CSIIF00)         //送信完了状態になるまで待つ
     {
      __nop();
     }
     
     return SIO00;
    }

    とSPIで1バイト読み書きしているだけです。

    もし参考になれば、比べてみてください!!

     

  • In reply to シェルティ:

    ご返答ありがとうございます。

    >まずは、確実に動作する環境を一式そろえるのが良いかと思います。

    ・「MMC/SD メモリカード・ドライバ・ソフトウェア」※
    型番:RTM0RL7800DMSD0S00RPJ


    これについて確認させて頂きたいのですが、最初に記載したもの以外で上記購入品を使用しています。
    このドライバと先に記述しました「SPI モードMMC/SD メモリカード・ドライバ・ソフトウェアの組み込み例」を用いて確認を行っております。この組み合わせは合っておりますでしょうか?

    本件とは別となりますが以前RX62N上で動作するRXファミリ向けのドライバを購入。これにも今回のRLの場合と同じくドライバ組込み例と合わせて環境を作成しそちらは問題なくSDカードのR/Wが出来ております。
    RX62上で動作しているSDカード(8GB)をRLにも挿してみましたが動作は変わらずNGでした。

    RX/RLの違いはあれど類似のドライバ製品を使用して、RXで動作しているカードを使用していてRLのみ失敗している。
    となればあとはこちらの基盤の回路的問題、もしくはソースのレジスタ初期設定の問題等も疑ってかかるべきなのかと思ってきましたがRXとRLで異なる点、注意すべき点等はありますでしょうか?

    >SDカードドライバ/SD Association

    我々はSD協会の会員となっておりSD AssociationとHALAに対して毎年ライセンス料を支払っております。
    それとは別に別途他のライセンスが必要となるものなのでしょうか?
  • In reply to miesuqe:

    miesuqeさん

    こんにちは、シェルティです。

    なるほど、すでにSDカードドライバご購入済みということですね。
    SDカードドライバは順次ウェブに無償公開していく計画になっています。
    サポートは継続して本フォーラムや技術問い合わせ窓口で行わせていただきます。

    今回の件ですが、RL78用にSDカードドライバを組み込んだソフトウェア一式を
    先に紹介させていただいたボードで動作可能な状態にしてお渡ししたいと思います。
    www.marutsu.co.jp/.../
    今週いっぱい作業予定です。9/7に返信いたします。

    > このドライバと先に記述しました「SPI モードMMC/SD メモリカード・ドライバ・ソフトウェアの組み込み例」を用いて確認を行っております。
    > この組み合わせは合っておりますでしょうか?

    はい、問題ないです。

    > RX/RLの違いはあれど類似のドライバ製品を使用して、RXで動作しているカードを使用していてRLのみ失敗している。
    > となればあとはこちらの基盤の回路的問題、もしくはソースのレジスタ初期設定の問題等も疑ってかかるべきなのかと
    > 思ってきましたがRXとRLで異なる点、注意すべき点等はありますでしょうか?

    特にないはずです。
    こちらも担当者の見解を聞きつつ、注意点があればこちらに書き込みます。

    > 我々はSD協会の会員となっておりSD AssociationとHALAに対して毎年ライセンス料を支払っております。
    > それとは別に別途他のライセンスが必要となるものなのでしょうか?

    いえ、不要です。

    以上です
  • In reply to miesuqe:

    目前の問題に対して、シェルティさんのアドバイスされた

    > MMCカードか、2GBのSDカード(2GBのうちMMCコマンド対応品)を見つけていただくのが
    > 手っ取り早く動作確認する方法です。
    >
    > それから、ボードはRL78/G14による音声再生の初手動作確認においては以下がおすすめです。
    > www.marutsu.co.jp/.../
    >
    > 以下サンプルがそのまま動きます。
    > www.renesas.com/.../D3017501.html

    がホント手っ取り早い方法と思いますがなんか呑気な印象ですね。
  • In reply to シェルティ:

    この件と直接関係ある話でもないのですが、MTK-RL78G14 等のサンプルプログラムでソケット挿した SD カードの諸元が確認できるものがあれば便利かなと思いました。
    SD カード周りの簡単な動作確認や MMC 互換のカードを探したりするのに使えれば有用な場面も少なくない気がします。
  • In reply to シェルティ:

    miesuqeさん

    こんにちは、シェルティです。

    本件、RL78の以下ボードで動作するように調整したコードと、
    最新のSDカードドライバを組み込んだデモを作りました。
    www.marutsu.co.jp/.../

    9/7に提供可能になる見込みですが、まだSimplified Specificationに対応したコードになっていないため、
    SD協会員以外に配布できないので、この掲示板にダウンロードURLをはるわけにいかず、
    お手数ですが「RL78 SPIモードSDカードドライバの件」といった件名で
    弊社サポートに問い合わせいただけますか?(シェルティに問い合わせが流れ着きます)
    個別提供させていただきます。

    以上です
  • In reply to fujita nozomu:

    fujita nozomuさん

    こんにちは、シェルティです。

    ご提案ありがとうございます。これは有用ですね。
    SDカード周りのソリューションがまたホットになってきた感じなので
    こういった気の利いたサンプルソフトも準備していきたいと思います。

    以上です
  • In reply to シェルティ:

    シェルティ様
    皆様

    お世話になっております。

    すぐに反応出来ておらず申し訳ありません。
    ひとまずサポートサイトより指定の件名で質問依頼を行いました。

    対応速度が遅いのは承知ですが、シェルティ様が用意して頂いているものを先ずは試してみたいと思います。組込み後またご連絡をさせて頂きます。
  • In reply to miesuqe:

    シェルティ様
    ご意見を頂きました皆様

    お世話になっております。お疲れ様です。

    本件なのですが、こちらが作成したソースに問題があり嵌っていた様です。
    その部分を修正したところ、既述のR_SPI_MMC_Init_Device()はOKで返却され、RXで実績のあるSDカードへのRead&Writeも成功/作成ファイルの確認が出来ました。

    原因は何点かあったのですが、主には以下の二つでした。どちらもSPIに起因するものです。
    ①MMCドライバへのポートの設定誤りとCSの設定漏れ
    ②CSI00の割り込み
    自動生成で作成しR_CSI00_Start()をそのまま使用しておりました。
    このままだとCSI00の割り込みが有効となってしまい、IF1HがクリアされてR_SIO_xx_Data系の処理がタイムアウトになっておりました。CSI00割り込みを無効にしました。

    基本的な箇所での問題でお騒がせしてしまい、すみませんでした。

Top Page [◀◀]  2   3   4   5   6   7   8   9   ... [▶▶Last Page