SPI マルチI/O バスコントローラ(SPIBSC)のTENDが立たない

USB 経由シリアルFlashROM 書き込みサンプルプログラムのコードを利用しています。

ローディング時の初期化コードでTEND=0になったまま1になりません。

copy_to_atcm()でフラッシュROMからメモリへコピーしますが、このあとからTEND=0のまま

main関数に到達します。その後のフラッシュ制御が一切できない状況になっています。

原因が分かりませんので、考えられる対策を教えていただければ幸いです。

loader_init2.c

void loader_init2(void)
{
/* Check the reset source */
reset_check();

/* Set CPU clock and LOCO clock */
cpg_init();

/* Initialize the bus settings */
bus_init(); .....spibsc_init()が呼ばれる

/* Copy the application program from external NOR memory to ATCM */
copy_to_atcm();

:
:

Parents
  • copy_to_atcm()でフラッシュROMからメモリへコピーします

    コピーはできているということで

    main関数に到達します。

    であれば

    spibsc_init()を実行すれば解決しませんか

  • copy_to_atcm()の後でspibsc_init()を呼んだりしてみました。

    デバッカ上でレジスタ表示して見ていますが、一時はTEND=1になります。

    しかし、フラッシュのプロテクション解除をするタイミングでには、

    TEND=0になっていて、TEND=1待ちで無限ループしています。

    もし、このあたりのデバッグ方法、注意点などありましたらご教授ください。

  • フラッシュのプロテクション解除をするタイミングでには、

    TEND=0になっていて、TEND=1待ちで無限ループしています。

    邪道かもしれませんが、

    ロードした後にそのポートのSPIBSCを使用しなければ

    ポート自体を無効にしてしまうということはできないのでしょうか

    ポートが初期化時のレベルになっていないとか、SPIBSCにデータが残っているとかいうことはありませんか

    TENDの発出は有効になっていますか、

    TEND=1待ちで無限ループ

    初期化後はTEND=0で正常ではありませんか、TEND=1まで待つ必要がありますか?

    ...

    デバッカ上でレジスタ表示

    デバッガを使用せずに動作を確認してみてはどうですか

Reply
  • フラッシュのプロテクション解除をするタイミングでには、

    TEND=0になっていて、TEND=1待ちで無限ループしています。

    邪道かもしれませんが、

    ロードした後にそのポートのSPIBSCを使用しなければ

    ポート自体を無効にしてしまうということはできないのでしょうか

    ポートが初期化時のレベルになっていないとか、SPIBSCにデータが残っているとかいうことはありませんか

    TENDの発出は有効になっていますか、

    TEND=1待ちで無限ループ

    初期化後はTEND=0で正常ではありませんか、TEND=1まで待つ必要がありますか?

    ...

    デバッカ上でレジスタ表示

    デバッガを使用せずに動作を確認してみてはどうですか

Children
  • 自己解決しました。

    SPIマルチI/Oバスコントローラのモードには、共通コントロールレジスタ(CMNCR)のb31に、
    0:外部アドレス空間リードモード、1:SPI動作モードの設定があります。
    ローダーでフラッシュからACTM領域へファームをコピーするときは、外部アドレス空間リードモードで行わなければなりません。

    しかし、そのままのモードでは問題のSPIBSCのTEND=1(転送済)にならないことが判明しました。
    そこで、フラッシュ制御する上位からの要求をトリガとして、SPIBSCの初期化を行った後で、SPI動作モードに設定すればTEND=1との状態となり、その後のフラッシュ制御(プロテクション、イレース、書き込み、読み込み)は可能になりました。