お世話になっております。GAです。現在、RX660を使用した基板に対して、E2 Liteを経由したRenesas flash Programerでの書き込みを行おうとしております。その際に、以下のようなエラーログが出て、上手く書き込みが出来ません。
[ログ本文]接続デバイス : RX Groupツールに接続します。使用ツール : E2 emulator Lite (2FS045144B), インタフェース : 2 wire UARTツール電圧 : OFFエミュレータのファームウェアバージョン(更新前) : 3.03.00.005エミュレータのファームウェアバージョン(更新後) : 3.04.00.000ターゲットデバイスに接続します。メインクロック : 16.000000MHzターゲットデバイスを設定します。ターゲットデバイスを設定します。通信速度 : 1,000,000 bpsSignature: Device: RX Group Device Code: (省略)選択されたブロックを消去します。 [User Boot Area 1] 0xFF7F8000 - 0xFF7FFFFF サイズ : 32 Kツールから切断します。エラー(E100000E): デバイスでプロテクションエラーが発生しました。 (Command: 50, Response: DA)操作は失敗しました。[ログ終了]
同じE2Liteを使用して、CS+上でのデバッグを行った際には、問題なくデバッグが出来ております。デバイス側の設定として、特別プロテクションに関わる設定を行っていないのですが、初期設定として、プロテクションをかけるような設定となっているのでしょうか。(それか、回路的にプロテクションかける方法があるのでしょうか)拙い質問で申し訳ございませんが、何卒お知恵をお借り出来ますと幸いです。
Flash Programmerの設定とCS+の設定がどうなっているかわかりませんが、電源供給のオプション、どちらかが有効でどちらかが無効なんじゃないかな?
[追記]申し訳ございません、1点記載忘れていたことがございました。Renesas flash Programerを用いて、以下のことは出来ました。・ブロック情報を読み出す・フラッシュオプションを読み出す・ブランクチェック
動きを見ている限り、書き込みやイレースのコマンドが上手く出来ていないようです。何かご存じのことがあれば、お教えいただけますと幸いです。以上です。宜しくお願い致します。
Shoji Yamamoto様
ご確認ありがとうございます。電源供給オプション、確認させていただきましたが、どちらも供給しない設定で統一されておりました。RFPとCS+のそれぞれの設定をスクリーンショットで撮影しましたので、送付させていただきます。ご確認いただけますと幸いです。CS+RFP
以上です。宜しくお願い致します。
チップ出荷時はプロテクションは掛かっていません。プロテクションを掛ける方法はあります。
ターゲットデバイス-メモリ情報の読み出し
(適当に保存するファイル名を指定)
エリアの選択→Config Area1
上記で読み出すと、
S0110000437265617465642062792052465033S31500120040FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA8S31500120050FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF98S31500120060FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF88S31500120070FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF78S70500000000FA
4行ぐらいのmotファイルになりますが、全て0xFFになっていますでしょうか。
IDE=1で、WRPRやSEPRが0になっていれば、消去時にプロテクションエラーになるはずですが、CS+でダウンロードができるのであれば、プロテクションの問題じゃない気がします。
問題の切り分け方法ですが、
(1)コードフラッシュ、ユーザブート、データフラッシュのどの領域の消去が出来るかどうかを確認する
ブロック設定でユーザブート領域のチェックを外して、コードフラッシュやデータフラッシュのみにチェックを入れて消去を行いエラーになるかを見る。(消去のみにチェック、消去オプションも、ブロック消去とチップ消去等を変えて挙動を確認する)
(2)ロックビットの確認
ブロック情報の読み出しで、Lockbitにチェックが入っているかを見る(ユーザブートの消去でエラーになっているのであれば、Lockbitは関係無いはずですが)。
消去エラーが出ているのは、ユーザブート領域の様ですので、CS+でのダウンロードに問題がなければ、コードフラッシュ領域に対しての消去、書き込みは問題無いのかもしれません。
(ユーザブート領域のチェックを外して消去・書き込みを行う事でとりあえず使用する事はできるかも?)
tf様
ご回答ありがとうございます。また、順を追った説明、とても助かります。
>4行ぐらいのmotファイルになりますが、全て0xFFになっていますでしょうか。→こちらに関しては、読み出すことが出来ませんでした。エラー内容は書き込みの際と同じ、 「デバイスでプロテクションエラーが発生しました。 」でした。 後ほど、CS+上でレジスタを確認してみます。
>(1)コードフラッシュ、ユーザブート、データフラッシュのどの領域の消去が出来るかどうかを確認する→こちら、確認したところ、全ての領域のブロック選択消去、全ブロック消去の両方にて、 「デバイスでプロテクションエラーが発生しました。」というエラーとなりました。
>(2)ロックビットの確認→こちら結果を撮影致しましたので、貼付致します。 確認したところ、Lockbitの設定はされていないようです。
また、1点お伝えし忘れていたのですが、現在、基板単体の確認ではなく、装置に組み込んだ状態になります。(装置自体が他社製品で、詳しい情報がお伝え出来ない、というか私も知らなかったりしますが…)今後並行して、基板単体にしたときに書き込みが出来るかは試してみようと考えております。
>現在、基板単体の確認ではなく、装置に組み込んだ状態になります。
ブートモード接続ができていますので、装置に組み込まれている事は関係ありませんし、基板単体にしても(チップを別なボードに張り替えても)挙動は変わらないでしょう。
コードフラッシュやデータフラッシュ単体でも消去出来ないのであれば、SEPR=0に設定されているのではないかと思うのですが。(実際に試してみたい所ではありますが、SEPRは(IDE=1で)一度0に設定すると元には戻せないので…)OCDEは未設定(1)なので、デバッガによる接続やコードフラッシュの書き換えは行えるのだと思います。
(装置に組み込んだ人が、書き換え出来ない様にプロテクト設定を行ったのでしょうかね?ユーザに出荷時のデータを読み取らせないためだったらデバッガ接続禁止も、もしくはID設定を行うと思いますので、デバッガ接続は許すけどシリアルプログラマは使わせない微妙な設定ですね。)
(デバッガでオプション設定メモリは覗けると思いますので、答え合わせは簡単です。)
ご返信がかなり遅れてしまい、申し訳ございません。現状、私自身の環境の変化や別の作業が立て込んでおり、頂いた内容の確認に取り掛かれていない状態です。せっかくご助言頂いたにも関わらず、こちらの都合で確認が取れず、大変申し訳ございません。上記の内容、確認出来次第、再度ご連絡させていただきます。
以前はお世話になっておりました。GAです。
上記の件、以前とは別の基板(フラッシュプログラマにて書き込みが出来ないことは確認済み)ですが、確認出来ました。デバッガー上で、プロテクト設定をアドレスから直接読む(OFSM.SPCC.LONGで変数に書き込む)という形で、読み出した所、0x1FFFFFFFという値が読み出せ、SEPR(イレースコマンドプロテクト)、WRPR(プログラムコマンドプロテクト)、RDPR(リードコマンドプロテクト)の三つが0=禁止になっておりました。
先ほど、ソースを確認したところ、vecttbl.c内の#pragma address __SPCCreg = 0x00120040const uint32_t __SPCCreg = BSP_PRV_SPCC_VALUE;という記述を発見し、BSP_PRV_SPCC_VALUEが0x1FFFFFFFとなっていることを確認しました。これが、原因であると考えております。
以前、ご返信いただいた際に、>(実際に試してみたい所ではありますが、SEPRは(IDE=1で)一度0に設定すると元には戻せないので…)とおっしゃっておられましたが、これは、上記の設定がフラッシュプログラマ等の、書き込みツールでのみ反映され、一度プロテクトをかけてしまうと、それらからの書き込みを受け付けなくなるので、元には戻せない、という認識で間違いないでしょうか。また、例えば、チップを出荷状態に戻す等のプロテクトを外す方法をご存じでしたらお教えいただけますと幸いです。
SPCC(0012_0040H)の値が、0x1FFFFFFFに設定された場合、消去が出来なくなります。
>上記の設定がフラッシュプログラマ等の、書き込みツールでのみ反映され、
ビルドした結果のmotファイル内の値が上記値であれば、「どの様な手段であれ」、そのmotファイルをチップに書き込むと、ブートモード(シリアルプログラミング)での消去は出来なくなります。デバッガ接続は別(SPCCのb17で制御)です。
>チップを出荷状態に戻す
私の知る限りではできません。(裏技で何か方法はあるのかも知れませんが…)
なお、SPCCの
b31 RDPRb30 WRPRb29 SEPR これは0にすると戻せない
を全て0に設定する、しかも戻せる、というパターンも存在します。b24のIDE=0とする場合です。
シリアルプログラミングで、接続時にIDコードを設定する方法があり、その場合
b31=b30=b29=0, b24=0
に設定しますが、この場合、IDが一致すると消去等が可能です。
(IDコードの先頭を0x45以外の値に設定すれば)IDコードを知らない人は、消去や書き換えが出来なくなります。
(もしかしたらですが、IDコードプロテクトを有効にしたくて、RDPR=WRPR=SEPR=0に設定したが、IDE=0に設定するのが漏れてしまい、シリアルプログラミングが出来ない状態になってしまったのかもしれません。別途シリアルプログラミングを禁止する設定(SPE=0)もあるので、シリアルプログラミング自体を禁止したい場合はそちらを設定するはず。)
(IDコード領域、0012_0050h~(OSIS)に、0xFF以外の値が設定されていないでしょうか。設定されている場合、そのデータの設計者はシリアルプログラミング時にIDコード認証をさせたかったのだと思います。)
>私の知る限りではできません。(裏技で何か方法はあるのかも知れませんが…)
できました。
実際に手を動かして挙動を確認するというのが私の信条なのですが、元に戻せなくなるとジャンクボードを生み出す事になってしまうので、実際に試す事は躊躇していました。
手元に、RX26Tのジャンクボードがあったので、SEPR=WRPR=RDPR=0にした状態から色々やってみたのですが、RX26TはRFPの操作だけで、出荷時状態に戻せました。で、本命のRX660でも試したのですが、RFPでごにょごにょやる限りでは上手く行きませんでした。(またジャンクボードを生み出してしまったと思いました。)
RX660では、デバッガ接続でFACIコマンドのコードを実行する必要があります。
やることは、
(1)SPCCのb31-b24を0x1eに変更する(2)OSISのb7-b0を0x45に変更する
です。
/********************************************************************************************************************** * DISCLAIMER * This software is supplied by Renesas Electronics Corporation and is only intended for use with Renesas products. No * other uses are authorized. This software is owned by Renesas Electronics Corporation and is protected under all * applicable laws, including copyright laws. * THIS SOFTWARE IS PROVIDED "AS IS" AND RENESAS MAKES NO WARRANTIES REGARDING * THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. TO THE MAXIMUM * EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES * SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY REASON RELATED TO * THIS SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * Renesas reserves the right, without notice, to make changes to this software and to discontinue the availability of * this software. By using this software, you agree to the additional terms and conditions found by accessing the * following link: * http://www.renesas.com/disclaimer * * Copyright (C) 2020 Renesas Electronics Corporation. All rights reserved. *********************************************************************************************************************/ /***********************************************************************/ /* */ /* FILE :Main.c or Main.cpp */ /* DATE :Tue, Oct 31, 2006 */ /* DESCRIPTION :Main Program */ /* CPU TYPE : */ /* */ /* NOTE:THIS IS A TYPICAL EXAMPLE. */ /* */ /***********************************************************************/ //#include "typedefine.h" #include "r_smc_entry.h" #ifdef __cplusplus //#include <ios> // Remove the comment when you use ios //_SINT ios_base::Init::init_cnt; // Remove the comment when you use ios #endif #define FACI (*(volatile unsigned char *)0x7e0000) #define FACI2 (*(volatile unsigned short *)0x7e0000) #pragma section P PRAMPRG void config_write(void) { unsigned char wdata[16]; int i; for(i=0; i<16; i++) wdata[i] = 0xff; wdata[3] = 0x1e; FLASH.FWEPROR.BYTE = 0x01; FLASH.FENTRYR.WORD = 0xAA80; FLASH.FSADDR.LONG = 0x00000040; FACI = 0x40; FACI = 0x08; for(i=0; i<8; i++) { while (FLASH.FSTATR.BIT.DBFULL != 0) { __nop(); } FACI2 = (unsigned short)wdata[i*2] | (((unsigned short)wdata[i*2+1]) << 8); } FACI = 0xD0; while (FLASH.FSTATR.BIT.FRDY != 1) { __nop(); } FLASH.FSADDR.LONG = 0x00000050; for(i=0; i<16; i++) wdata[i] = 0xff; wdata[0] = 0x45; FACI = 0x40; FACI = 0x08; for(i=0; i<8; i++) { while (FLASH.FSTATR.BIT.DBFULL != 0) { __nop(); } FACI2 = (unsigned short)wdata[i*2] | (((unsigned short)wdata[i*2+1]) << 8); } FACI = 0xD0; while (FLASH.FSTATR.BIT.FRDY != 1) { __nop(); } FLASH.FENTRYR.WORD = 0xAA00; FLASH.FWEPROR.BYTE = 0x02; while(1) { __nop(); } } #pragma section void main(void); #ifdef __cplusplus extern "C" { void abort(void); } #endif void main(void) { unsigned long ram_addr = 0x4000; unsigned long rom_addr = 0xfff04000; unsigned long size = 0x200; //CC-RXのリンカ設定でROMからRAMにマッピングする設定に「PRAMPRG=RRAMPRG」を追加 unsigned long i; for (i=0; i<size; i++) { (*(volatile unsigned char *)ram_addr++) = (*(volatile unsigned char *)rom_addr++); } config_write(); } #ifdef __cplusplus void abort(void) { } #endif
添付の様なコードをデバッガでロードして実行すればOKです。
(添付ファイルは、以前GAさまとフラッシュROMの消去・書き込みを試したコードをベースにしているので、RAM実行のコードとなっていますが、今回のコンフィグメモリの書き込みはBGOで行けると思いますので、多分ROM実行でも問題無いと思います。)
(私が試した限りでは、SEPR=WRPR=RDPR=0だと、bit 0を1に変更する事が出来ませんでしたが、1を0にする事は出来ました。)
(1)の操作で、
・最初の状態SPCC=0x1f....:イレース不可の状態↓・SPCCのb24=0に書き換える:IDコードが設定された状態(IDを知っていれば消せる)
となります。
上記書き換え後、普通にRFPで当該チップに接続してください。
認証コードを聞かれるので、そのままOKを押してください。
認証コードが違うと怒られますが、そのままOKを合計3回押してください。
(3回目のエラーの前に、一瞬間が空くはずです。エラーは3回出してください。)
この状態で、チップはブランク状態(消去プロテクトなし)となります。
もし、デバッガ接続の時に、IDコードを聞かれる状態になっており、入力して接続しているのであれば、(2)のところとRFPに全消去させるところの手順が変わります。デバッガ接続時に、IDを聞かれない状態(もしくは、チップのOSISのb7-b0=0xFF)であれば、上記手順でOKです。