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();
: :
hana said:copy_to_atcm()でフラッシュROMからメモリへコピーします
コピーはできているということで
hana said:main関数に到達します。
であれば
spibsc_init()を実行すれば解決しませんか
copy_to_atcm()の後でspibsc_init()を呼んだりしてみました。
デバッカ上でレジスタ表示して見ていますが、一時はTEND=1になります。
しかし、フラッシュのプロテクション解除をするタイミングでには、
TEND=0になっていて、TEND=1待ちで無限ループしています。
もし、このあたりのデバッグ方法、注意点などありましたらご教授ください。
hana said:フラッシュのプロテクション解除をするタイミングでには、 TEND=0になっていて、TEND=1待ちで無限ループしています。
フラッシュのプロテクション解除をするタイミングでには、
邪道かもしれませんが、
ロードした後にそのポートのSPIBSCを使用しなければ
ポート自体を無効にしてしまうということはできないのでしょうか
ポートが初期化時のレベルになっていないとか、SPIBSCにデータが残っているとかいうことはありませんか
TENDの発出は有効になっていますか、
hana said:TEND=1待ちで無限ループ
初期化後はTEND=0で正常ではありませんか、TEND=1まで待つ必要がありますか?
...
hana said:デバッカ上でレジスタ表示
デバッガを使用せずに動作を確認してみてはどうですか
自己解決しました。
SPIマルチI/Oバスコントローラのモードには、共通コントロールレジスタ(CMNCR)のb31に、0:外部アドレス空間リードモード、1:SPI動作モードの設定があります。ローダーでフラッシュからACTM領域へファームをコピーするときは、外部アドレス空間リードモードで行わなければなりません。
しかし、そのままのモードでは問題のSPIBSCのTEND=1(転送済)にならないことが判明しました。 そこで、フラッシュ制御する上位からの要求をトリガとして、SPIBSCの初期化を行った後で、SPI動作モードに設定すればTEND=1との状態となり、その後のフラッシュ制御(プロテクション、イレース、書き込み、読み込み)は可能になりました。