(57)【要約】【課題】フラッシュメモリ消去単位ブロックに任意のデータ長を有する最新データを追加記憶させる。【解決手段】消去ブロック単位毎にデータ書き換えを行う際に、ブロックの先頭アドレスから最終ドレスまでアドレスを１ワード単位にずらしながら格納データを検索し（ステップＡ１〜Ａ４）、検索したデータが消去状態である全て論理レベルの“１”レベルであれば先頭アドレスから順次に最新データを書き込み（ステップＡ２，Ａ９）、検索したデータが非消去状態である場合は、当該アドレス値に予め定める数値を加算して求めたアドレス値が最終アドレス値よりも小さければ当該アドレスから最新データを書き込み（ステップＡ６，Ａ９）、加算して求めたアドレス値が最終アドレス値よりも大きければ当該ブロックのデータを消去して先頭アドレスから最新データを書き込む（ステップＡ６〜Ａ９）。【選択図】      図３
2004310268.tif 000002
【特許請求の範囲】
【請求項１】
フラッシュメモリの消去単位ブロックごとに小容量のデータ書き換えを複数回繰り返して最新データに書き換える際に、前記最新データから見てアドレス増加方向の領域またはアドレス減少方向の領域に、前記ブロックの最大アドレスを越えない範囲内で任意のデータ長を有する最新データおよびその検索用チェックコードを追加記憶させることを特徴とするフラッシュメモリの制御方法。
【請求項２】
フラッシュメモリの消去単位ブロックごとに小容量のデータ書き換えを複数回繰り返して最新データに書き換える際に、前記最新データの検索用チェックコードとして前記最新データのデータ長を書き込むとともに、検索用チェックコードは、書き込まれたユーザデータのアドレスに続けて、アドレス増加方向の領域、アドレス減少方向の領域またはユーザデータの一部として書き込み、最新データ読み出し時には検出した前記検索用チェックコードに基づき読み出すことを特徴とするフラッシュメモリの制御方法。
【請求項３】
フラッシュメモリの消去単位ブロックごとに小容量のデータ書き換えを複数回繰り返して最新データに書き換える際に、ユーザプログラムが指示する書き込み先ブロック番号、書き込みデータ先頭アドレスおよび書き込みデータ長に基づき、データ書き換え対象ブロックの格納データ値を更新することを特徴とするフラッシュメモリの制御方法。
【請求項４】
フラッシュメモリの消去単位ブロックごとに小容量のデータ書き換えを複数回繰り返しかつ書き換えた最新データを読み出す際に、ユーザプログラムが指示するブロック番号に基づき、データ検索用のチェックコードから最新データを検索し該当ブロックの格納データ値として読み出すことを特徴とするフラッシュメモリの制御方法。
【請求項５】
フラッシュメモリの消去単位ブロックごとに小容量のデータ書き換えを複数回繰り返しかつ書き換えた最新データを読み出す際に、前記ブロックのブロックサイズから前記最新データの検索用チェックコード値を減じた値を最大値とする可変データ長のユーザデータを格納し、かつその最新データを参照することを特徴とするフラッシュメモリの制御方法。
【請求項６】
予め定める消去ブロック単位毎にデータ書き換えを行う際に、前記ブロックの先頭アドレスから最終ドレスまでアドレスを１ワード単位にずらしながら格納データを検索し、検出したデータが消去状態である全て論理レベルの“１”レベルであれば先頭アドレスから順次に最新データを書き込み、検出したデータが“１”レベル以外のデータである場合は、当該アドレスに予め定める数値を加算して求めたアドレス値が最終アドレス値よりも小さければ当該アドレスから前記最新データを書き込み、加算して求めたアドレス値が最終アドレス値よりも大きければ当該ブロックのデータを消去して先頭アドレスから前記最新データを書き込むことを特徴とするフラッシュメモリの制御方法。
【請求項７】
予め定める消去ブロック単位毎にデータ書き換えを行う際に、前記ブロックの最終アドレスから先頭ドレスまでアドレスを１ワード単位にずらしながら格納データを検索し、検出したデータが全て論理レベルの“１”レベルであれば最終アドレスから先頭アドレスまで順次に前記最新データを書き込み、検出したデータが“１”レベル以外のデータを有する場合は、当該アドレスから予め定める数値を減算して求めたアドレス値が先頭アドレス値よりも大きければ当該アドレスから先頭アドレスまで順次に前記最新データを書き込み、アドレス値が先頭アドレス値よりも小さければ当該ブロックのデータを消去して最終アドレスから先頭アドレスまで前記最新データを書き込むことを特徴とするフラッシュメモリの制御方法。
【請求項８】
予め定める消去ブロック単位毎にデータ読み出しを行う際に、前記ブロックの最終アドレスから先頭ドレスまでアドレスを１ワード単位にずらしながら格納データを検索し、検出したデータが消去状態である全て論理レベルの“１”レベルであれば当該ブロックはブランク状態と判断し、検出したデータが“１”レベル以外のデータを有する場合は、当該アドレスから予め定める数値を減算して求めたアドレス値を先頭アドレスとし、その先頭アドレスから前記最新データを読み出すことを特徴とするフラッシュメモリの制御方法。
【請求項９】
予め定める消去ブロック単位毎にデータ読み出しを行う際に、前記ブロックの先頭アドレスから最終ドレスまでアドレスを１ワード単位にずらしながら格納データを検索し、検出したデータが全て論理レベルの“１”レベルであれば当該ブロックはブランク状態と判断し、検出したデータが“１”レベル以外のデータを有する場合は、当該アドレスに予め定める数値を加算して求めたアドレス値を先頭アドレスとして当該アドレスから前記最新データを読み出すことを特徴とするフラッシュメモリの制御方法。
【請求項１０】
ユーザプログラムを格納するＲＯＭと、データ格納用フラッシュメモリと、フラッシュメモリ制御手段と、前記フラッシュメモリ制御手段の制御の下に前記ユーザプログラムからコールされ前記フラッシュメモリにデータ書き込みを行うための書き込みインタフェース関数およびデータ書き込み処理関数並びに読み出し制御を行うための読み出しインタフェース関数およびデータ読み出し処理関数を有するフラッシュメモリ・セルフ・プログラミング・ライブラリと、前記ユーザプログラムに基づき前記フラッシュメモリから読み出したデータを参照しかつ前記フラッシュメモリ制御手段と協働して前記フラッシュメモリの制御を行うＣＰＵとを用いて、
前記ユーザユーザプログラムがそれぞれの前記インタフェース関数をユーザプログラムＲＯＭからコールすることによって前記フラッシュメモリ領域のデータ書き込み制御を行う際に、前記ユーザプログラムＲＯＭが前記書き込みインタフェース関数をコールするとともに、引数としてデータ書き込みを行うブロック番号、書き込みデータ先頭アドレスおよび書き込みデータ長を渡すインタフェース関数コール処理と、
書き込み処理が終了した時点で、ステータスデータを受け取るステータス受け取り処理と、
コールされた前記書き込みインタフェース関数が、前記データ書き込み処理関数をコールし、最新データ書き込み処理を行わせるとともに、引数として、前記最新データ書き込みを行うブロック番号、書き込みデータ先頭アドレスおよび書き込みデータ長を渡すデータ書き込み処理関数コール処理と、
書き込み処理が終了した時点で、前記データ書き込み処理関数からステータスデータを受け取るステータスデータ受け取り処理とを実行することを特徴とするフラッシュメモリの制御方法。
【請求項１１】
前記データ書き込み処理関数は、対象ブロックの前記最新データのアドレスを検索するためにアドレスポインタを前記ブロックの最終アドレスとして先頭アドレスの方向に向かって１ワードずつデータを読み出していくアドレス検索処理と、
読み出したアドレスが先頭アドレスでなければそのアドレスのデータを読み出す検索アドレスデータ読み出し処理と、
読み出したデータが“１”レベル以外のデータであれば当該アドレス値から数値４を減じる処理を先頭アドレスに達するまで順次繰り返して検索処理を終了する第１のデータ検索処理と、
読み出したデータが非消去状態の場合は、そのアドレス値に書き込みデータ長の値および数値４を加算するとともに加算結果が最終アドレス値を越える場合はブロック消去を実行した後、先頭アドレスをポイントする第２のデータ検索処理と、前記第１および前記第２のデータ検索処理によりデータ書き込み領域を特定した後、先頭アドレスから最終アドレス方向に順次に任意のデータ長のユーザデータを書き込み、その後のアドレスに検索用チェックコードとしてデータ長の書き込みを実行する請求項１０記載のフラッシュメモリの制御方法。
【請求項１２】
前記データ書き込み処理関数は、対象ブロックの前記最新データのアドレスを検索するためにアドレスポインタを前記ブロックの先頭アドレスとして最終アドレス方向に向かって１ワードずつデータを読み出すアドレス検索処理と、
読み出したアドレスが最終アドレスより小さければそのアドレスのデータを読み出す検索アドレスデータ読み出し処理と、
読み出したデータが消去状態であればアドレス値に数値４を加算する処理を最終アドレスに達するまで順次繰り返して検索処理を終了する第１のデータ検索処理と、
読み出したデータが非消去状態の場合は、そのアドレス値から書き込みデータ長の値および数値４を減算するとともに減算結果が先頭アドレス値より小さい場合はブロック消去を実行した後、最終アドレスをポイントする第２のデータ検索処理と、
前記第１および前記第２のデータ検索処理によりデータ書き込み領域を特定した後、最終アドレスから先頭アドレス方向に向かって順次データを書き込みを実行する請求項１０記載のフラッシュメモリの制御方法。
【請求項１３】
ユーザプログラムを格納するＲＯＭと、データ格納用フラッシュメモリと、フラッシュメモリ制御手段と、前記フラッシュメモリ制御手段の制御の下に前記ユーザプログラムからコールされ前記フラッシュメモリにデータ書き込みを行うための書き込みインタフェース関数およびデータ書き込み処理関数並びに読み出し制御を行うための読み出しインタフェース関数およびデータ読み出し処理関数を有するフラッシュメモリ・セルフ・プログラミング・ライブラリと、前記ユーザプログラムに基づき前記フラッシュメモリから読み出したデータを参照しかつ前記フラッシュメモリ制御手段と協働して前記フラッシュメモリの制御を行うＣＰＵとを用いて、
前記ユーザプログラムがそれぞれ対応する前記インタフェース関数を前記ユーザプログラムからコールすることによって前記フラッシュメモリ領域からの最新データの読み出し制御を行う際に、前記読み出しインタフェース関数をコールするとともに、引数として、前記最新データの読み出しを行うブロック番号を渡すインタフェース関数コール処理と、
読み出し処理が終了した時点で、読み出した前記最新データを受け取る読み出しデータ受取処理と、
コールされた前記読み出しインタフェース関数が、前記データ読み出し処理関数をコールし、前記最新データの読み出し処理を行わせるとともに、引数として、前記最新データの読み出しを行うブロック番号を渡すデータ読み出し処理関数コール処理と、
読み出し処理が終了した時点で、前記データ読み出し処理関数から読み出した前記最新データを受け取る読み出しデータ受取処理とを実行することを特徴とするフラッシュメモリの制御方法。
【請求項１４】
前記データ読み出し処理関数は、対象ブロックの前記最新データのアドレスを検索するためにアドレスポインタを前記ブロックの最終アドレスとして先頭アドレス方向に向かって１ワードずつデータを読み出すアドレス検索処理と、
読み出したアドレスが先頭アドレスより大きければそのアドレスのデータを読み出す検索アドレスデータ読み出し処理と、
読み出したデータが消去状態であればアドレス値から数値４を減じる処理を先頭アドレスに達するまで順次繰り返し、先頭アドレスに達すると当該ブロック内は全て消去状態でありブロックとしてはブランク状態と判断する第１のデータ検索処理と、
読み出したデータが非消去状態の場合は、そのアドレス値から読み出しデータ長の値を減算するとともに減算結果を先頭アドレス値として抽出し、そのアドレスから順次データを読み出す第２のデータ検索処理とを実行する請求項１３記載のフラッシュメモリの制御方法。
【請求項１５】
前記データ読み出し処理関数は、対象ブロックの前記最新データのアドレスを検索するためにアドレスポインタを前記ブロックの先頭アドレスとして最終アドレスに向かって１ワードずつデータを読み出すアドレス検索処理と、
読み出したアドレスが最終アドレスより小さければそのアドレスのデータを読み出す検索アドレスデータ読み出し処理と、
読み出したデータが消去状態であればアドレス値に数値４を加算する処理を最終アドレスに達するまで順次繰り返し、最終アドレスに達すると当該ブロック内は全て消去状態でありブロックとしてはブランク状態と判断する第１のデータ検索処理と、
読み出したデータが非消去状態の場合は、読み出したアドレス値から、読み出したデータ長の値を減算するとともに減算結果を先頭アドレス値として抽出し、抽出したアドレスから順次データを読み出す第２のデータ検索処理とを実行する請求項１３記載のフラッシュメモリの制御方法。
【請求項１６】
ＣＰＵおよびユーザプログラムの制御の下に、予め定める消去ブロック単位毎にデータ書き換えを行う際に、前記ブロックの先頭アドレスから最終ドレスまでアドレスを１ワード単位にずらしながら格納データを検索し、検出したデータが消去状態である全て論理レベルの“１”レベルであれば先頭アドレスから順次に最新データを書き込み、検出したデータが“１”レベル以外のデータを有する場合は、当該アドレスに予め定める数値を加算して求めたアドレス値が最終アドレス値よりも小さければ当該アドレスから前記最新データを書き込み、アドレス値が最終アドレス値よりも大きければ当該ブロックのデータを消去して先頭アドレスから前記最新データを書き込むことで、ブロックの書き込み回数を低減する書き込み回数制御機能を有することを特徴とするフラッシュメモリ内蔵の半導体装置。
【請求項１７】
予め定める消去ブロック単位毎にデータ書き換えを行う際に、前記ブロックの先頭アドレスから最終ドレスまでアドレスを１ワード単位にずらしながら格納データを検索する手段と、検索したデータが消去状態であるかまたはブロック消去を実行した後の状態で全て論理レベルの“１”レベルであれば先頭アドレスから順次に最新データを書き込む手段と、検索したデータが“１”レベル以外のデータを有する場合は、当該アドレスに予め定める数値を加算する演算手段と、加算して求めたアドレス値と最終アドレス値とを比較する手段と、比較した結果、加算して求めたアドレス値が最終アドレス値よりも小さければ当該アドレスから前記最新データを書き込み、加算して求めたアドレス値が最終アドレス値よりも大きければ当該ブロックのデータを消去する手段と、消去後に先頭アドレスから前記最新データを書き込む手段とを備えることを特徴とするフラッシュメモリ内蔵の半導体装置。
【請求項１８】
前記格納データを検索する手段は、最終アドレスから先頭ドレスまでアドレスを１ワード単位にずらしながら格納データを検索する手段であり、前記最新データを書き込む手段は、最終アドレスから先頭アドレス方向に順次に前記最新データを書き込む手段であり、前記演算手段は、当該アドレスから予め定める数値を減算する手段であり、前記消去する手段は、減算して求めたアドレス値が先頭アドレス値よりも小さければ当該ブロックのデータを消去する手段である請求項１７記載のフラッシュメモリ内蔵の半導体装置。
【請求項１９】
全体を制御するＣＰＵと、その制御プログラムおよびユーザプログラムをもつＲＯＭと、データ格納用のフラッシュメモリと、フラッシュメモリ制御手段と、前記フラッシュメモリから予め定めるブロック単位毎にデータ読み出しを行う際に、前記ブロックの最終アドレスから先頭アドレスまでアドレスを１ワード単位にずらしながら格納データを検索する手段と、検索したデータが消去状態である全て論理レベルの“１”レベルであれば当該ブロックはブランク状態であると判断する手段と、検索したデータが“１”レベル以外のデータを有する場合は、当該アドレスから予め定める数値を減算する手段と、減算で求めたアドレス値を先頭アドレスとしそのアドレスから最新データを読み出す手段とを備えたことを特徴とするフラッシュメモリ内蔵の半導体装置。
【請求項２０】
前記格納データを検索する手段は、ブロックの先頭アドレスから最終アドレスまでアドレスを１ワード単位にずらしながら格納データを検索する手段であり、前記減算手段は、検索したデータが非消去状態である“０”レベルのデータを有する場合に、当該アドレスから予め定める数値を減算する手段であり、前記最新データを読み出す手段は、減算で求めたアドレス値を先頭アドレスとしそのアドレスから最新データを読み出す手段である請求項１９記載のフラッシュメモリ内蔵の半導体装置。
【請求項２１】
ユーザプログラムを格納するＲＯＭと、データ格納用フラッシュメモリと、フラッシュメモリ制御手段と、前記フラッシュメモリ制御手段の制御の下に前記ユーザプログラムからコールされ前記フラッシュメモリにデータ書き込みを行うための書き込みインタフェース関数およびデータ書き込み処理関数並びに読み出し制御を行うための読み出しインタフェース関数およびデータ読み出し処理関数を有するフラッシュメモリ・セルフ・プログラミング・ライブラリと、前記ユーザプログラムに基づき前記フラッシュメモリから読み出したデータを参照しかつ前記フラッシュメモリ制御手段と協働して前記フラッシュメモリの制御を行うＣＰＵとを用いて、
ユーザがそれぞれの前記インタフェース関数をユーザプログラムからコールすることによって前記フラッシュメモリ領域のデータ書き込み制御を行う際に、ユーザが前記書き込みインタフェース関数をコールするとともに、引数としてデータ書き込みを行うブロック番号、書き込みデータ先頭アドレスおよび書き込みデータ長を渡すインタフェース関数コール処理と、
書き込み処理が終了した時点で、ステータスデータを受け取るステータス受け取り処理と、
コールされた前記書き込みインタフェース関数が、前記データ書き込み処理関数をコールし、データ書き込み処理を行わせるとともに、引数として、データ書き込みを行うブロック番号、書き込みデータ先頭アドレスおよび書き込みデータ長を渡すデータ書き込み処理関数コール処理と、
書き込み処理が終了した時点で、前記データ書き込み処理関数からステータスデータを受け取るステータスデータ受け取り処理とを、前記ＣＰＵに実行させるプログラム。
【請求項２２】
ユーザプログラムを格納するＲＯＭと、データ格納用フラッシュメモリと、フラッシュメモリ制御手段と、前記フラッシュメモリ制御手段の制御の下に前記ユーザプログラムからコールされ前記フラッシュメモリにデータ書き込みを行うための書き込みインタフェース関数およびデータ書き込み処理関数並びに読み出し制御を行うための読み出しインタフェース関数およびデータ読み出し処理関数を有するフラッシュメモリ・セルフ・プログラミング・ライブラリと、前記ユーザプログラムに基づき前記フラッシュメモリから読み出したデータを参照しかつ前記フラッシュメモリ制御手段と協働して前記フラッシュメモリの制御を行うＣＰＵとを用いて、
ユーザがそれぞれ対応する前記インタフェース関数をユーザプログラムからコールすることによって前記フラッシュメモリ領域からのデータ読み出し制御を行う際に、前記読み出しインタフェース関数をコールするとともに、引数として、データ読み出しを行うブロック番号を渡すインタフェース関数コール処理と、
読み出し処理が終了した時点で、読み出したデータを受け取る読み出しデータ受取処理と、
コールされた前記読み出しインタフェース関数が、前記データ読み出し処理関数をコールし、データ読み出し処理を行わせるとともに、引数として、データ読み出しを行うブロック番号を渡すデータ読み出し処理関数コール処理と、
読み出し処理が終了した時点で、前記データ読み出し処理関数から読み出したデータを受け取る読み出しデータ受取処理とを、前記ＣＰＵに実行させるプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明はフラッシュメモリ内蔵の半導体装置、フラッシュメモリの制御方法およびそのプログラムに係わり、特に書き込み回数を低減するフラッシュメモリ内蔵の半導体装置、フラッシュメモリの制御方法およびそのプログラムに関する。
【０００２】
【従来の技術】
近年、半導体素子の微細化技術の進展に伴い、その半導体素子で構成するＬＳＩも大規模化している。例えば、半導体メモリとしてダイナミック型ランダムアクセスメモリ（ＤＲＡＭ）やシンクロナス・ダイナミック・ランダムアクセス・メモリ（ＳＤＲＡＭ）も実用化されている。これらの揮発性メモリに対し不揮発性メモリの分野では、読み出し専用の半導体記憶装置としてリードオンリメモリ（ＲＯＭ）、電気的な書き換えが可能なＥＥＰＲＯＭ、フラッシュメモリがあり、これらのメモリも大容量化が進んでいる。
【０００３】
フラッシュメモリは、ＥＥＰＲＯＭとしてブロックごとのデータまたは全ビットのデータを一括消去することができるフラッシュ型ＥＥＰＲＯＭのことであるが、このフラッシュメモリにたいして書き込みや消去などを行なう場合は、書き込み命令や消去命令などの設定コマンドをフラッシュメモリに対して与え、フラッシュメモリは、このコマンドに従って動作を実行する。
【０００４】
また、フラッシュメモリはブロック単位の消去とバイト単位の書き込みが出来るメモリであるが、その初期状態は他のメモリと異なり全ブロックが論理レベルの“１”レベル状態になっており、この状態をフラッシュメモリの消去状態とする。
【０００５】
上述したように、フラッシュメモリでは消去状態はメモリ領域が“１”レベルであり、データが書き込まれた状態は“０”レベルである。そのため、“０”レベルを書き込むことは出来ても“１”レベルを書き込むことは出来無いことになり、このことをフラッシュメモリの非対称性と称している。
【０００６】
そのため、同じメモリ領域にデータを上書きする場合、既に書き込まれているデータを消去した後で上書きする必要がある。既に書き込まれたデータを消去する際にメモリ素子が劣化するため、フラッシュメモリには寿命があることが知られている。
【０００７】
また、消去を行うための回路の規模が大きいこと、消去動作には時間がかかること、メモリ素子の磨耗の問題によりフラッシュメモリの消去は、アドレス単位ではなく、ある一定のブロック単位で行われるのが一般的である。
【０００８】
上述した特徴をもつフラッシュメモリで、複数の頻繁に書き換えを行う小容量データを扱う場合には、１つのデータを書き換えるたびにブロック消去動作を行わなければならず、１回のデータ書き換え動作に際して、ブロックの消去時間分余計に時間がかかることになる。
【０００９】
また、頻繁に消去を行うことで、フラッシュメモリの寿命が短くなるという問題も生じる。
【００１０】
これらの従来フラッシュメモリの問題は、例えば特開平９−２９３０２７号公報に記載の不揮発性メモリの制御回路をフラッシュメモリに適用することによって、解決できる（特許文献１参照）。
【００１１】
上述したこの従来技術による不揮発性メモリの書き込みデータのビット構成を示した図８を参照すると、このフラッシュメモリは６ビットのユーザデータ、パリティビット、巡回認識用ビットを持つ領域から構成される。
【００１２】
巡回用ビットの使用例の動作説明用フローチャートを示した図９を参照すると、データの書き込みを行う際に、まず、アドレスポインタを１加算してデータを読みだす（処理ステップＣ１）。
【００１３】
巡回認識用ビットが直前のアドレスの巡回認識用ビットの反転値であったら、そのアドレスが次にデータを書き込むべきアドレスである。
【００１４】
アドレスポインタがブロック最終アドレスに達したか否か判断し（処理ステップＣ２）、最終アドレスを越えるとアドレスポインタをブロック先頭アドレスとし（処理ステップＣ３）、次に書き込む巡回認識用ビットは最新データの巡回認識用ビットの反転値とする（処理ステップＣ４）。
【００１５】
また、最終アドレスに達していない場合、次に書き込む巡回認識用ビットは最新データの巡回認識用ビットと同じ値とする（処理ステップＣ５）。
【００１６】
次に書き込むべき巡回認識用ビットの値が決定したら、現在のアドレスポインタの指し示すアドレスに、ユーザデータ、巡回認識用ビット、パリティビットから成る８ビットのデータを書き込む（処理ステップＣ６）。
【００１７】
次に書き込んだ８ビットのデータを読み出し、書き込んだデータと同一か否かを判断し（処理ステップＣ７）、同一でなければ処理ステップＣ１へ戻り同一になるまで繰り返し、同一なると処理を終了する。
【００１８】
【特許文献１】
特開平９−２９３０２７号公報（段落「００２４」、「００３９」、「００４３」、図４。）。
【００１９】
【発明が解決しようとする課題】
上述したように従来のフラッシュＲＯＭの制御は、フラッシュメモリの消去回数を抑えることができ、結果的にメモリの寿命を延ばすことが可能となった。
【００２０】
しかし、この従来の方法では、最新データが格納されているアドレスを検索する際に、あらかじめ決められた間隔（書き込み単位毎）で巡回認識用ビットを参照する必要があるため、ユーザデータは一定のデータ長しか扱うことができないという問題点があった。
【００２１】
本発明の目的は、上述した従来の欠点に鑑みなされたものであり、消去動作の回数を低減するとともに、最新データから見てアドレス増加方向の領域またはアドレス減少方向の領域に任意のデータ長を有する最新データを追加記憶させることが出来ること、当該ブロックの最新データの先頭アドレスを検索し、最新データを読み出すことが出来るフラッシュメモリ内蔵の半導体装置、フラッシュメモリの制御方法およびそのプログラムを提供することにある。
【００２２】
【課題を解決するための手段】
本発明のフラッシュメモリの制御方法は、フラッシュメモリの消去単位ブロックごとに小容量のデータ書き換えを複数回繰り返して最新データに書き換える際に、前記最新データから見てアドレス増加方向の領域またはアドレス減少方向の領域に、前記ブロックの最大アドレスを越えない範囲内で任意のデータ長を有する最新データおよびその検索用チェックコードを追加記憶させることを特徴とする。
【００２３】
本発明のフラッシュメモリの制御方法の他の特徴は、フラッシュメモリの消去単位ブロックごとに小容量のデータ書き換えを複数回繰り返して最新データに書き換える際に、前記最新データの検索用チェックコードとして前記最新データのデータ長を書き込むとともに、検索用チェックコードは、書き込まれたユーザデータのアドレスに続けて、アドレス増加方向の領域、アドレス減少方向の領域またはユーザデータの一部として書き込み、最新データ読み出し時には検出した前記検索用チェックコードに基づき読み出すことにある。
【００２４】
本発明のフラッシュメモリの制御方法のまた他の特徴は、フラッシュメモリの消去単位ブロックごとに小容量のデータ書き換えを複数回繰り返して最新データに書き換える際に、ユーザプログラムが指示する書き込み先ブロック番号、書き込みデータ先頭アドレスおよび書き込みデータ長に基づき、データ書き換え対象ブロックの格納データ値を更新することにある。
【００２５】
本発明のフラッシュメモリの制御方法のさらに他の特徴は、フラッシュメモリの消去単位ブロックごとに小容量のデータ書き換えを複数回繰り返しかつ書き換えた最新データを読み出す際に、ユーザプログラムが指示するブロック番号に基づき、データ検索用のチェックコードから最新データを検索し該当ブロックの格納データ値として読み出すことにある。
【００２６】
本発明のフラッシュメモリの制御方法のさらにまた他の特徴は、フラッシュメモリの消去単位ブロックごとに小容量のデータ書き換えを複数回繰り返しかつ書き換えた最新データを読み出す際に、前記ブロックのブロックサイズから前記最新データの検索用チェックコード値を減じた値を最大値とする可変データ長のユーザデータを格納し、かつその最新データを参照することにある。
【００２７】
本発明のフラッシュメモリの制御方法の他の特徴は、予め定める消去ブロック単位毎にデータ書き換えを行う際に、前記ブロックの先頭アドレスから最終ドレスまでアドレスを１ワード単位にずらしながら格納データを検索し、検出したデータが消去状態である全て論理レベルの“１”レベルであれば先頭アドレスから順次に最新データを書き込み、検出したデータが“１”レベル以外のデータである場合は、当該アドレスに予め定める数値を加算して求めたアドレス値が最終アドレス値よりも小さければ当該アドレスから前記最新データを書き込み、加算して求めたアドレス値が最終アドレス値よりも大きければ当該ブロックのデータを消去して先頭アドレスから前記最新データを書き込むことにある。
【００２８】
本発明のフラッシュメモリの制御方法のまた他の特徴は、予め定める消去ブロック単位毎にデータ書き換えを行う際に、前記ブロックの最終アドレスから先頭ドレスまでアドレスを１ワード単位にずらしながら格納データを検索し、検出したデータが全て論理レベルの“１”レベルであれば最終アドレスから先頭アドレスまで順次に前記最新データを書き込み、検出したデータが“１”レベル以外のデータを有する場合は、当該アドレスから予め定める数値を減算して求めたアドレス値が先頭アドレス値よりも大きければ当該アドレスから先頭アドレスまで順次に前記最新データを書き込み、アドレス値が先頭アドレス値よりも小さければ当該ブロックのデータを消去して最終アドレスから先頭アドレスまで前記最新データを書き込むことにある。
【００２９】
本発明のフラッシュメモリの制御方法のさらに他の特徴は、予め定める消去ブロック単位毎にデータ読み出しを行う際に、前記ブロックの最終アドレスから先頭ドレスまでアドレスを１ワード単位にずらしながら格納データを検索し、検出したデータが消去状態である全て論理レベルの“１”レベルであれば当該ブロックはブランク状態と判断し、検出したデータが“１”レベル以外のデータを有する場合は、当該アドレスから予め定める数値を減算して求めたアドレス値を先頭アドレスとし、その先頭アドレスから前記最新データを読み出すことにある。
【００３０】
本発明のフラッシュメモリの制御方法のさらにまた他の特徴は、予め定める消去ブロック単位毎にデータ読み出しを行う際に、前記ブロックの先頭アドレスから最終ドレスまでアドレスを１ワード単位にずらしながら格納データを検索し、検出したデータが全て論理レベルの“１”レベルであれば当該ブロックはブランク状態と判断し、検出したデータが“１”レベル以外のデータを有する場合は、当該アドレスに予め定める数値を加算して求めたアドレス値を先頭アドレスとして当該アドレスから前記最新データを読み出すことにある。
【００３１】
本発明のフラッシュメモリの制御方法の他の特徴は、ユーザプログラムを格納するＲＯＭと、データ格納用フラッシュメモリと、フラッシュメモリ制御手段と、前記フラッシュメモリ制御手段の制御の下に前記ユーザプログラムからコールされ前記フラッシュメモリにデータ書き込みを行うための書き込みインタフェース関数およびデータ書き込み処理関数並びに読み出し制御を行うための読み出しインタフェース関数およびデータ読み出し処理関数を有するフラッシュメモリ・セルフ・プログラミング・ライブラリと、前記ユーザプログラムに基づき前記フラッシュメモリから読み出したデータを参照しかつ前記フラッシュメモリ制御手段と協働して前記フラッシュメモリの制御を行うＣＰＵとを用いて、
前記ユーザユーザプログラムがそれぞれの前記インタフェース関数をユーザプログラムＲＯＭからコールすることによって前記フラッシュメモリ領域のデータ書き込み制御を行う際に、前記ユーザプログラムＲＯＭが前記書き込みインタフェース関数をコールするとともに、引数としてデータ書き込みを行うブロック番号、書き込みデータ先頭アドレスおよび書き込みデータ長を渡すインタフェース関数コール処理と、
書き込み処理が終了した時点で、ステータスデータを受け取るステータス受け取り処理と、
コールされた前記書き込みインタフェース関数が、前記データ書き込み処理関数をコールし、最新データ書き込み処理を行わせるとともに、引数として、前記最新データ書き込みを行うブロック番号、書き込みデータ先頭アドレスおよび書き込みデータ長を渡すデータ書き込み処理関数コール処理と、
書き込み処理が終了した時点で、前記データ書き込み処理関数からステータスデータを受け取るステータスデータ受け取り処理とを実行することにある。
【００３２】
また、前記データ書き込み処理関数は、対象ブロックの前記最新データのアドレスを検索するためにアドレスポインタを前記ブロックの最終アドレスとして先頭アドレスの方向に向かって１ワードずつデータを読み出していくアドレス検索処理と、
読み出したアドレスが先頭アドレスでなければそのアドレスのデータを読み出す検索アドレスデータ読み出し処理と、
読み出したデータが“１”レベル以外のデータであれば当該アドレス値から数値４を減じる処理を先頭アドレスに達するまで順次繰り返して検索処理を終了する第１のデータ検索処理と、
読み出したデータが非消去状態の場合は、そのアドレス値に書き込みデータ長の値および数値４を加算するとともに加算結果が最終アドレス値を越える場合はブロック消去を実行した後、先頭アドレスをポイントする第２のデータ検索処理と、前記第１および前記第２のデータ検索処理によりデータ書き込み領域を特定した後、先頭アドレスから最終アドレス方向に順次に任意のデータ長のユーザデータを書き込み、その後のアドレスに検索用チェックコードとしてデータ長の書き込みを実行することができる。
【００３３】
さらに、前記データ書き込み処理関数は、対象ブロックの前記最新データのアドレスを検索するためにアドレスポインタを前記ブロックの先頭アドレスとして最終アドレス方向に向かって１ワードずつデータを読み出すアドレス検索処理と、
読み出したアドレスが最終アドレスより小さければそのアドレスのデータを読み出す検索アドレスデータ読み出し処理と、
読み出したデータが消去状態であればアドレス値に数値４を加算する処理を最終アドレスに達するまで順次繰り返して検索処理を終了する第１のデータ検索処理と、
読み出したデータが非消去状態の場合は、そのアドレス値から書き込みデータ長の値および数値４を減算するとともに減算結果が先頭アドレス値より小さい場合はブロック消去を実行した後、最終アドレスをポイントする第２のデータ検索処理と、
前記第１および前記第２のデータ検索処理によりデータ書き込み領域を特定した後、最終アドレスから先頭アドレス方向に向かって順次データを書き込みを実行することにある。
【００３４】
本発明のフラッシュメモリの制御方法のまた他の特徴は、ユーザプログラムを格納するＲＯＭと、データ格納用フラッシュメモリと、フラッシュメモリ制御手段と、前記フラッシュメモリ制御手段の制御の下に前記ユーザプログラムからコールされ前記フラッシュメモリにデータ書き込みを行うための書き込みインタフェース関数およびデータ書き込み処理関数並びに読み出し制御を行うための読み出しインタフェース関数およびデータ読み出し処理関数を有するフラッシュメモリ・セルフ・プログラミング・ライブラリと、前記ユーザプログラムに基づき前記フラッシュメモリから読み出したデータを参照しかつ前記フラッシュメモリ制御手段と協働して前記フラッシュメモリの制御を行うＣＰＵとを用いて、
前記ユーザプログラムがそれぞれ対応する前記インタフェース関数を前記ユーザプログラムからコールすることによって前記フラッシュメモリ領域からの最新データの読み出し制御を行う際に、前記読み出しインタフェース関数をコールするとともに、引数として、前記最新データの読み出しを行うブロック番号を渡すインタフェース関数コール処理と、
読み出し処理が終了した時点で、読み出した前記最新データを受け取る読み出しデータ受取処理と、
コールされた前記読み出しインタフェース関数が、前記データ読み出し処理関数をコールし、前記最新データの読み出し処理を行わせるとともに、引数として、前記最新データの読み出しを行うブロック番号を渡すデータ読み出し処理関数コール処理と、
読み出し処理が終了した時点で、前記データ読み出し処理関数から読み出した前記最新データを受け取る読み出しデータ受取処理とを実行することにある。
【００３５】
また、前記データ読み出し処理関数は、対象ブロックの前記最新データのアドレスを検索するためにアドレスポインタを前記ブロックの最終アドレスとして先頭アドレス方向に向かって１ワードずつデータを読み出すアドレス検索処理と、読み出したアドレスが先頭アドレスより大きければそのアドレスのデータを読み出す検索アドレスデータ読み出し処理と、
読み出したデータが消去状態であればアドレス値から数値４を減じる処理を先頭アドレスに達するまで順次繰り返し、先頭アドレスに達すると当該ブロック内は全て消去状態でありブロックとしてはブランク状態と判断する第１のデータ検索処理と、
読み出したデータが非消去状態の場合は、そのアドレス値から読み出しデータ長の値を減算するとともに減算結果を先頭アドレス値として抽出し、そのアドレスから順次データを読み出す第２のデータ検索処理とを実行することができる。
【００３６】
さらに、前記データ読み出し処理関数は、対象ブロックの前記最新データのアドレスを検索するためにアドレスポインタを前記ブロックの先頭アドレスとして最終アドレスに向かって１ワードずつデータを読み出すアドレス検索処理と、
読み出したアドレスが最終アドレスより小さければそのアドレスのデータを読み出す検索アドレスデータ読み出し処理と、
読み出したデータが消去状態であればアドレス値に数値４を加算する処理を最終アドレスに達するまで順次繰り返し、最終アドレスに達すると当該ブロック内は全て消去状態でありブロックとしてはブランク状態と判断する第１のデータ検索処理と、
読み出したデータが非消去状態の場合は、読み出したアドレス値から、読み出したデータ長の値を減算するとともに減算結果を先頭アドレス値として抽出し、抽出したアドレスから順次データを読み出す第２のデータ検索処理とを実行することにある。
【００３７】
本発明のフラッシュメモリの制御回路の特徴は、ＣＰＵおよびユーザプログラムの制御の下に、予め定める消去ブロック単位毎にデータ書き換えを行う際に、前記ブロックの先頭アドレスから最終ドレスまでアドレスを１ワード単位にずらしながら格納データを検索し、検出したデータが消去状態である全て論理レベルの“１”レベルであれば先頭アドレスから順次に最新データを書き込み、検出したデータが“１”レベル以外のデータを有する場合は、当該アドレスに予め定める数値を加算して求めたアドレス値が最終アドレス値よりも小さければ当該アドレスから前記最新データを書き込み、アドレス値が最終アドレス値よりも大きければ当該ブロックのデータを消去して先頭アドレスから前記最新データを書き込むことで、ブロックの書き込み回数を低減する書き込み回数制御機能を有することを特徴とする。
【００３８】
本発明のフラッシュメモリの制御回路の他の特徴は、予め定める消去ブロック単位毎にデータ書き換えを行う際に、前記ブロックの先頭アドレスから最終ドレスまでアドレスを１ワード単位にずらしながら格納データを検索する手段と、検索したデータが消去状態であるかまたはブロック消去を実行した後の状態で全て論理レベルの“１”レベルであれば先頭アドレスから順次に最新データを書き込む手段と、検索したデータが“１”レベル以外のデータを有する場合は、当該アドレスに予め定める数値を加算する演算手段と、加算して求めたアドレス値と最終アドレス値とを比較する手段と、比較した結果、加算して求めたアドレス値が最終アドレス値よりも小さければ当該アドレスから前記最新データを書き込み、加算して求めたアドレス値が最終アドレス値よりも大きければ当該ブロックのデータを消去する手段と、消去後に先頭アドレスから前記最新データを書き込む手段とを備えることにある。
【００３９】
また、前記格納データを検索する手段は、最終アドレスから先頭ドレスまでアドレスを１ワード単位にずらしながら格納データを検索する手段であり、前記最新データを書き込む手段は、最終アドレスから先頭アドレス方向に順次に前記最新データを書き込む手段であり、前記演算手段は、当該アドレスから予め定める数値を減算する手段であり、前記消去する手段は、減算して求めたアドレス値が先頭アドレス値よりも小さければ当該ブロックのデータを消去する手段である。
【００４０】
本発明のフラッシュメモリの制御回路のまた他の特徴は、全体を制御するＣＰＵと、その制御プログラムおよびユーザプログラムをもつＲＯＭと、データ格納用のフラッシュメモリと、フラッシュメモリ制御手段と、前記フラッシュメモリから予め定めるブロック単位毎にデータ読み出しを行う際に、前記ブロックの最終アドレスから先頭アドレスまでアドレスを１ワード単位にずらしながら格納データを検索する手段と、検索したデータが消去状態である全て論理レベルの“１”レベルであれば当該ブロックはブランク状態であると判断する手段と、検索したデータが“１”レベル以外のデータを有する場合は、当該アドレスから予め定める数値を減算する手段と、減算で求めたアドレス値を先頭アドレスとしそのアドレスから最新データを読み出す手段とを備えたことにある。
【００４１】
また、前記格納データを検索する手段は、ブロックの先頭アドレスから最終アドレスまでアドレスを１ワード単位にずらしながら格納データを検索する手段であり、前記減算手段は、検索したデータが非消去状態である“０”レベルのデータを有する場合に、当該アドレスから予め定める数値を減算する手段であり、前記最新データを読み出す手段は、減算で求めたアドレス値を先頭アドレスとしそのアドレスから最新データを読み出す手段である。
【００４２】
【発明の実施の形態】
まず、本発明の概要を述べると、本発明によるフラッシュメモリ内蔵の半導体装置およびフラッシュメモリの制御方法は、消去動作に要する時間の削減に対して、ブロック毎に小容量データ書き換えを頻繁に行うシステムにおいてデータの書き換えを行う際に、ブロック内の領域を最終アドレスから先頭アドレスに向かって検索し、ブロック内が消去状態の時と書き込みデータがブロック領域を越えない時とブロック領域を越える場合はブロック消去を実行した時とのそれぞれの時に、最新データをブロック内の先頭アドレスから最終アドレス方向に向かって書き込みを実行する。
【００４３】
一方、ブロック内の領域を先頭アドレスから最終アドレスに向かって検索し、ブロック内が消去状態の時と書き込みデータがブロック領域を越えない時とブロック領域を越える場合はブロック消去を実行した時とのそれぞれの時に、最新データをブロック内の最終アドレスから先頭アドレス方向に向かって書き込みを実行する。
【００４４】
また、検索用チェックコードを、ユーザデータと共に書き込むことによって、該当ブロックの最新データの先頭アドレスを検索し、最新データを読みだすことができる、という工夫を行っている。なお、ここでは１パラメータを格納する領域、およびフラッシュメモリの消去単位をブロックと称する。
【００４５】
本発明のフラッシュメモリ内蔵の半導体装置およびフラッシュメモリの制御方法の、第１の実施の形態で制御されるメモリブロック領域におけるデータ配置領域を示した図１を参照すると、ブロック先頭アドレスからブロック最終アドレスの方向、つまりアドレスが増加する方向に先ずユーザデータ１が書き込まれ、その後に検索用のチェックコードとしてユーザデータ１のデータ長が書き込まれている。
【００４６】
そのユーザデータ１のチェックコードの次にユーザデータ２が書き込まれ、その後にチェックコードとしてユーザデータ２のデータ長が書き込まれている。その後の領域は、ここではブランク（１６進数のＦＦｈ）領域になっている。
【００４７】
一方、本発明の第１の実施の形態が適用される半導体装置は、その関数関係の概要のソフトウェアモジュール構成を示した図２を参照すると、ユーザプログラムを格納するＲＯＭ１０と、データ格納用のフラッシュメモリ１１と、後述するＣＰＵ１４からの読み出し、書き込みを指示するコマンドやアドレスデータ等に応じて、制御信号をフラッシュメモリに供給し、書き込み読み出しを制御するフラッシュメモリ制御回路１２と、フラッシュメモリ制御回路１２の制御の下にユーザプログラムからコールされフラッシュメモリ１１にデータ書き込みを行うための書き込みインタフェース関数Ｄ１およびデータ書き込み処理関数Ｄ３並びに読み出し制御を行うための読み出しインタフェース関数Ｄ２およびデータ読み出し処理関数Ｄ１４を有するフラッシュメモリ・セルフ・プログラミング・ライブラリ１３と、ユーザプログラムに基づきフラッシュメモリ１１から読み出したデータを参照しかつフラッシュメモリ制御回路１２と協働してフラッシュメモリ１１の制御を行うＣＰＵ１４とを備える。
【００４８】
すなわち、フラッシュメモリ・セルフ・プログラミング・ライブラリ１３に含まれる書き込みインタフェース関数Ｄ１、読み出しインタフェース関数Ｄ２、データ書き込み処理関数Ｄ３、データ読み出し処理関数Ｄ４からなる関数とユーザプログラムとの相互関係は、ユーザプログラムＲＯＭ１０のユーザプログラムが、ＣＰＵ１４およびフラッシュメモリ制御回路１２の制御の下に、各インタフェース関数Ｄ１，Ｄ２をユーザプログラムＲＯＭ１０からコールすることによって、フラッシュメモリ領域のデータ制御を行う。
【００４９】
なお、以下の説明および請求項において、検索する手段はアドレスポインタに対応し、演算手段および比較手段はＣＰＵに対応し、最新データを書き込む手段および消去する手段はフラッシュメモリ制御回路に対応するものとする。
【００５０】
次に、インタフェース関数の構成を以下に示す。
（１）書き込みインタフェース関数は、該当ブロックに次のデータを書き込む処理である。
【００５１】
引数１：ブロック番号
引数２：書き込みデータ先頭アドレス
引数３：書き込みデータ長
戻り値：ステータスデータ（正常終了、パラメータエラー、書き込みエラー消去エラー）
（２）読み出しインタフェース関数は、該当ブロックの最新データを検索し読み出す処理である。
【００５２】
引数１：ブロック番号
引数２：読み出しデータバイト数    戻り値：読み出しデータ
なお、関数の引数の順番は、この通りでなくてもよい。
【００５３】
フラッシュメモリの初期状態はブランク状態（ＡＬＬ−ＦＦｈ）とする。前述した図１に示すように、最新データは、ブロック先頭アドレスからブロック最終アドレスへ向けて書き込まれ、その直後にデータ検索用のチェックコードを書き込む。
【００５４】
データの書き込みおよび読み出し単位は１ワード（４バイト：ＸＸＸＸＸＸＸＸｈ、「Ｘ」１個は４ビット）とする。最後に書かれたユーザデータが、そのブロックのパラメータ値となる。
【００５５】
図２を参照すると、ユーザプログラムがデータの書き込みを行う場合、書き込みインタフェース関数Ｄ１を引数Ｄ５でコールする。この時の引数Ｄ５として、ユーザプログラムはデータ書き込みを行うブロック番号、書き込みデータ先頭アドレス、書き込みデータ長を書き込みインタフェース関数に渡す。
【００５６】
また、書き込み処理が終了した時点で、ユーザプログラムは書き込みインタフェース関数Ｄ１からステータスデータを受け取る（Ｄ７）。書き込みインタフェース関数Ｄ１は自身がコールされると、データ書き込み処理関数Ｄ３をコールし、データ書き込みの処理を行わせる。
【００５７】
この時の引数Ｄ６として、データ書き込みを行うブロック番号、書き込みデータ先頭アドレスおよび書き込みデータ長を、書き込みインタフェース関数Ｄ１はデータ書き込み処理関数Ｄ３に渡す。
【００５８】
また、書き込み処理が終了した時点で、ステータスデータＤ８をデータ書き込み処理関数Ｄ３から受け取る。データ書き込みの詳細な動作は後述する。
【００５９】
同様に、データの読み出しを行う場合、ユーザプログラムは読み出しインタフェース関数Ｄ２をコールする。この時引数Ｄ１１として、データ読み出しを行うブロック番号を読み出しインタフェース関数に渡す。
【００６０】
また、読み出し処理が終了した時点で、ユーザプログラムは読み出しインタフェース関数Ｄ２から読み出しデータＤ９を受け取る。読み出しインタフェース関数Ｄ２は自身がコールされると、データ読み出し処理関数Ｄ４をコールし、データ読み出し処理を行わせる。この時引数Ｄ１２として、読み出しインタフェース関数Ｄ２はデータ読み出しを行うブロック番号をデータ読み出し処理関数Ｄ４に渡す。
【００６１】
また、読み出し処理が終了した時点で、読み出しインタフェース関数Ｄ２は読み出しデータＤ１０を受け取る。データ読み出しの詳細な動作は後述する。
【００６２】
次に、データ書き込みのさらに詳細な動作を説明する。第１の実施形態のデータ書き込み処理関数のフローチャートを示した図３を参照すると、まず、引数として与えられたブロック番号からブロック先頭アドレス、最終アドレスを生成する。続いてそのブロックの最新データのアドレスを検索するために、アドレスポインタをブロック最終アドレスとして先頭アドレスに向かって１ワードずつデータを読み出すアドレス検索処理を実行する（処理ステップＡ１）。
【００６３】
次に、読み出したアドレスが先頭アドレスでなければそのアドレスのデータを読み出す検索アドレスデータ読み出し処理を実行する。すなわち１ワードずつデータを読みだしていく（処理ステップＡ２，Ａ３）。
【００６４】
この時、読み出したデータが消去状態の“ＦＦＦＦＦＦＦＦｈ”であれば（処理ステップＡ４）、アドレスポインタを“４”減算する処理を先頭アドレスに達するまで順次繰り返して検索処理を終了する第１のデータ検索処理を実行する（処理ステップＡ５）。
【００６５】
アドレスポインタがブロック先頭アドレスに達した場合（処理ステップＡ２）、そのブロックは消去状態であるため、ブロック先頭アドレスから、任意のデータ長のユーザデータを書き込む。
【００６６】
また、検索用のチェックコードとして、書き込んだデータのデータ長をユーザデータの次のアドレスに書き込む（処理ステップＡ９）。
【００６７】
もし、読み出したデータが“ＦＦＦＦＦＦＦＦｈ”以外の値であれば（処理ステップＡ４）、そのデータがチェックコードであるので、検索を終了する（アドレスポインタ＝チェックコードが格納されているアドレスの状態）。
【００６８】
次に、データを書き込む際にブロック最終アドレスを越えるかどうかの判定を行い（処理ステップＡ６）、越えるようであれば、ブロック消去をして（処理ステップＡ７）、アドレスポインタをブロック先頭アドレスとする（処理ステップＡ８）。
【００６９】
処理ステップＡ６における「ＡＤＲＳ＋書き込みデータ長＋４＋４」は、この判定の直前でチェックコードを検出しているので、アドレスポインタ（ＡＤＲＳ）は、ブランク領域から「−４」のアドレス（チェックコードが格納されているアドレス）を指し示している。そこで、次に行う書き込み動作のためにブランク領域を指し示す必要があるので「＋４」している。
【００７０】
つまり、「ＡＤＲＳ（チェックコードが格納されているアドレス）＋４（ブランク領域の先頭を指すための加算）」はブロックの最終アドレス方向に書き込みを開始するアドレスであり、「書き込みデータ長＋４（チェックコードのデータ長）」は書き込むデータのデータ長である。
【００７１】
上術した処理によりデータを書き込むべきアドレスを特定できたので、現在のアドレスポインタの位置から、任意のデータ長のユーザデータを書き込む（処理ステップＡ９）。
【００７２】
また、検索用のチェックコードとして、書き込んだデータのデータ長をユーザデータの次のアドレスに書き込む（処理ステップＡ９）。
【００７３】
尚、上述の説明では、検索用のチェックコードはユーザデータとは独立したデータとして区別し、ユーザデータの次のアドレスに書き込んでいるが、データの一部として書き込むことでもよい。その場合は、その部分がチェックコードであることが予め判別できるようにしておく。
【００７４】
次に、図２を併せて参照しながら、データ読み出し処理の詳細な動作を説明する。
【００７５】
最新データを読み出す場合には、書き込み時と同様に、引数として与えられたブロック番号からブロック先頭アドレス、最終アドレスを生成する。
【００７６】
生成したブロック先頭アドレス、最終アドレスに基づき、アドレスポインタをブロック最終アドレスとし（処理ステップＢ１）、１ワードずつデータを読み出していく（処理ステップＢ３）。
【００７７】
この時、読み出したデータが“ＦＦＦＦＦＦＦＦｈ”であれば（処理ステップＢ４）、アドレスポインタを「４」減算する（処理ステップＢ５）。アドレスポインタがブロック先頭アドレスに達したら（処理ステップＢ２）、そのブロックは消去状態であり、ブロックとしてはブランク状態と判断するデータ検索処理を実行する（請求項における第１の検索処理に対応）。
【００７８】
もし、読み出したデータが“ＦＦＦＦＦＦＦＦｈ”以外の値が書き込まれた非消去状態、すなわち書き込み状態であれば（処理ステップＢ４）、そのデータがチェックコード（最新データのデータ長）であるので、アドレスポインタの値からデータ長を減算した値を、最新データ先頭アドレスとして抽出する（処理ステップＢ６）。
【００７９】
次に、抽出したアドレスのデータを読み出し（処理ステップＢ７）、データ読み出し処理関数Ｄ４の戻り値とする（処理ステップＢ６およびＢ７が請求項における第２の検索処理に対応）。
【００８０】
次に具体例を用いて、本実施の形態の動作を説明する。
【００８１】
データ読み出し処理関数のフローチャートを示した図４を参照すると、例えば、書き込み対象ブロック番号は“２”、ブロック２の先頭アドレスは“ＦＦＦＦ２０００ｈ”、ブロック２の最終アドレスは“ＦＦＦＦ２ＦＦＦｈ”、書き込みデータが格納されている先頭アドレスを“００００００００ｈ”、書き込みデータ長を“１０ｈ”とする。
【００８２】
図２を併せて参照すると、ユーザプログラムは書き込みインタフェース関数Ｄ１をコールし、ブロック番号“２”、書き込みデータ先頭アドレス“００００００００ｈ”、書き込みデータ長“１０ｈ”を引数Ｄ５として渡す。
【００８３】
書き込みインタフェース関数Ｄ１は自身がコールされると、データ書き込み処理関数Ｄ３をコールし、ブロック番号、書き込みデータ先頭アドレスおよび書き込みデータ長を引数Ｄ６として渡し、データ書き込み処理を行わせる。
【００８４】
データ書き込み処理関数Ｄ３がコールされると、まずブロック番号“２”から、ブロック先頭アドレス“ＦＦＦＦ２０００ｈ”と、ブロック最終アドレス“ＦＦＦＦ２ＦＦＦｈ”を生成する。この時、データの読み出し単位は１ワード（４バイト）単位であるから、アドレスポインタ“ＡＤＲＳ”を、ブロック最終アドレス“ＦＦＦＦ２ＦＦＦｈ”から４バイトを減じたアドレス“ＦＦＦＦ２ＦＦＣｈ”とする（処理ステップＡ１）。
【００８５】
次に、アドレスポインタ“ＡＤＲＳ”の指す“ＦＦＦＦ２ＦＦＣｈ”のデータを読み出す（処理ステップＡ３）。読み出したデータが、消去状態を示す“ＦＦＦＦＦＦＦＦｈ”だったなら（処理ステップＡ４）、アドレスポインタ“ＡＤＲＳ”の“ＦＦＦＦ２ＦＦＣｈ”から「４」減算し（処理ステップＡ５）、“ＦＦＦＦ２ＦＦ８ｈ”となる。
【００８６】
次に、アドレスポインタ“ＡＤＲＳ”の指す“ＦＦＦＦ２ＦＦ８ｈ”をブロック先頭アドレス“ＦＦＦＦ２０００ｈ”と比較し（処理ステップＡ２）、先頭アドレスよりも値が大きいため、再びアドレスポインタ“ＡＤＲＳ”の指す“ＦＦＦＦ２ＦＦ８ｈ”のデータを読み出す（処理ステップＡ３）。
【００８７】
読み出したデータが消去状態の“ＦＦＦＦＦＦＦＦｈ”以外の値、例えば“００００００２０ｈ”である場合（処理ステップＡ４）、そのデータがチェックコードである。
【００８８】
次に、データを書き込む際に、書き込むメモリ領域がブロック最終アドレスを越えるかどうかの判定を行う（処理ステップＡ６）。
【００８９】
消去状態であるアドレス“ＦＦＦＦ２ＦＦＣｈ”に、書き込みデータ長“１０ｈ”と、チェックコード長“０４ｈ”を加えた値“ＦＦＦＦ３０１０ｈ”は、ブロック最終アドレス“ＦＦＦＦ２ＦＦＦ”を越えているため（処理ステップＡ６）、このブロックにはユーザデータを追加記禄できない。
【００９０】
そこで、ブロック消去を行い（処理ステップＡ７）、アドレスポインタ“ＡＤＲＳ”の指す値をブロック先頭アドレス“ＦＦＦＦ２０００ｈ”とする（処理ステップＡ８）。
【００９１】
上述した処理を実行した結果、データを書き込むべきアドレスを特定できたので、アドレス“００００００００ｈ”から“００００００１０ｈ”に格納されているユーザデータを“ＦＦＦＦ２０００ｈ”から書き込み、続けてユーザデータのデータ長“１０ｈ”を書き込み（処理ステップＡ９）、ステータスを返す（Ｄ８）。
【００９２】
処理ステップＡ２において、アドレスポインタ“ＡＤＲＳ”が“ＦＦＦＦ２０００ｈ”となった場合、そのブロックは消去済みであるため、ブロック先頭アドレス“ＦＦＦＦ２０００ｈ”からユーザデータを書き込み、続けてユーザデータのデータ長“１０ｈ”を書き込み（処理ステップＡ９）、ステータスＤ８を返す。
【００９３】
処理ステップＡ６において、アドレスポインタ“ＡＤＲＳ”が“ＦＦＦＦ２０２０ｈ”だった場合、消去状態であるアドレス“ＦＦＦＦ２０２４ｈ”に書き込みデータ長と、チェックコード長を加えた値は“ＦＦＦＦ２０３８ｈ”となり、ブロック最終アドレス“ＦＦＦＦ２ＦＦＦｈ”に満たないため、そのブロックにはユーザデータの追加記録を行うことができる。
【００９４】
この時、消去状態であるアドレス“ＦＦＦＦ２０２４ｈ”からユーザデータを書き込み、続けてユーザデータのデータ長“１０ｈ”を書き込み処理ステップＡ９）、ステータスＤ８を返す。
【００９５】
また、書き込みインタフェース関数Ｄ１からユーザプログラムへステータスＤ７を返す。
【００９６】
同様に、データ読み出しの動作を具体例を用いて説明する。
【００９７】
例えば、データ読み出し対象ブロック番号は“３”、ブロック３の先頭アドレスは“ＦＦＦＦ３０００ｈ”、ブロック３の最終アドレスは“ＦＦＦＦ３ＦＦＦｈ”とする。
【００９８】
図４に示すように、ユーザは読み出しインタフェース関数Ｄ２をコールし、ブロック番号“３”を引数Ｄ１１として渡す。
【００９９】
読み出しインタフェース関数Ｄ２は自身がコールされると、データ読み出し処理関数Ｄ４をコールし、ブロック番号を引数Ｄ１２として渡し、データ読み出し処理を行わせる。
【０１００】
データ読み出し処理関数Ｄ４がコールされると、まずブロック番号“３”から、ブロック先頭アドレス“ＦＦＦＦ３０００ｈ”と、ブロック最終アドレス“ＦＦＦＦ３ＦＦＦｈ”を生成する。この時、データの読み出し単位は１ワード（４バイト）単位であるから、アドレスポインタ“ＡＤＲＳ”の指すアドレス値を“ＦＦＦＦ３ＦＦＣｈ”とする（処理ステップＢ１）。
【０１０１】
次に、アドレスポインタ“ＡＤＲＳ”の指すアドレス“ＦＦＦＦ３ＦＦＣｈ”のデータを読みだす（処理ステップＢ３）。読み出したデータが、“ＦＦＦＦＦＦＦＦｈ”だったなら（処理ステップＢ４）、アドレスポインタ“ＡＤＲＳ”を「４」減算し（処理ステップＢ５）、次のアドレスは“ＦＦＦＦ３ＦＦ８ｈ”となる。
【０１０２】
次に、アドレスポインタ“ＡＤＲＳ”の指すアドレス“ＦＦＦＦ３ＦＦ８ｈ”をブロック先頭アドレス“ＦＦＦＦ３０００ｈ”と比較し（処理ステップＢ２）、先頭アドレスよりも値が大きいため、再びアドレスポインタ“ＡＤＲＳ”の指すアドレス“ＦＦＦＦ３ＦＦ８ｈ”のデータを読み出す（処理ステップＢ３）。
【０１０３】
読み出したデータが消去状態“ＦＦＦＦＦＦＦＦｈ”以外、例えば“００００００３０ｈ”だったなら（処理ステップＢ４）、そのデータがチェックコードであり、アドレス“ＦＦＦＦ３ＦＦ８ｈ”に格納されているデータのデータ長であることを示している。
【０１０４】
よって、現在のアドレスポインタ“ＡＤＲＳ”の値である“ＦＦＦＦ３ＦＦ８ｈ”からデータ長“３０ｈ”を減算した値“ＦＦＦＦ３ＦＣ８ｈ”が最新データの先頭アドレスとなる（処理ステップＢ６）。
【０１０５】
抽出したアドレス“ＦＦＦＦ３ＦＣ８ｈ”からデータ長“３０ｈ”分のデータを読み出し、読み出しインタフェース関数Ｄ２へステータスＤ１０として返す。
【０１０６】
また、読み出しインタフェース関数Ｄ２からユーザプログラムへ、読み出しデータＤ９を返す。
【０１０７】
処理ステップＢ２において、アドレスポインタ“ＡＤＲＳ”の指すアドレス値が“ＦＦＦＦ３０００ｈ”となった場合は、そのブロックは消去状態であるため、データは存在しない。
【０１０８】
上述した本発明のフラッシュメモリ内蔵の半導体装置およびフラッシュメモリの制御方法の第１の実施の形態によれば、消去回数を抑えることによってフラッシュメモリの寿命を延ばすことができるだけでなく、最大で“（ブロックサイズ）−（チェックコード）”までの可変データ長のユーザデータを格納でき、かつその最新データを参照することができるようになり、従来技術では一定のデータ長のユーザデータしか扱うことができなかった問題点を解決した。
【０１０９】
次に、本発明の第２の実施の形態を説明する。
【０１１０】
第２の実施の形態におけるメモリ領域の配置を示した図５を参照すると、ブロック最終アドレスからブロック先頭アドレスの方向、つまりアドレスが減少する方向に先ずユーザデータ１が書き込まれ、その前のアドレスにチェックコードとしてユーザデータ１のデータ長が書き込まれている。
【０１１１】
そのユーザデータ１のチェックコードの次にユーザデータ２が書き込まれ、その上のアドレスにチェックコードとしてユーザデータ２のデータ長が書き込まれている。さらにその上の領域は、ブロック先頭アドレスまで、ここではブランク（１６進数のＦＦｈ）領域になっている。
【０１１２】
なお、ここでも前述したように検索用のチェックコードはユーザデータとは独立したデータとして区別し、ユーザデータの次のアドレスに書き込んでいるが、データの一部として書き込むことでもよい。その場合は、その部分がチェックコードであることが予め判別できるようにしておく。
【０１１３】
一方、本発明の第２の実施の形態が適用されるシステムは、その関数関係の概要は前述した図２の構成と同様である。
【０１１４】
すなわち、書き込みインタフェース関数Ｄ１、読み出しインタフェース関数Ｄ２、データ書き込み処理関数Ｄ３、データ読み出し処理関数Ｄ４から成り、ユーザプログラムは、ＣＰＵ１４の制御の下に、各インタフェース関数Ｄ１〜Ｄ４をユーザプログラムＲＯＭ１０に格納されたユーザプログラムからコールすることによって、フラッシュメモリ領域のデータ制御を行う。
【０１１５】
ここでもフラッシュメモリ１１の初期状態はブランク状態（ＡＬＬ−ＦＦｈ）とする。
【０１１６】
図５において、データはブロック最終アドレスからブロック先頭アドレスへ向けて書き込まれ、そのデータの直後にデータ検索用のチェックコードが書き込まれる。データの書き込みおよび読み出し単位は１ワード（４バイト）とする。最後に書かれたユーザデータが、そのブロックのパラメータ値となる。
【０１１７】
前述した図２を参照すると、ユーザプログラムはデータの書き込みを行う場合、書き込みインタフェース関数Ｄ１をコールする。
【０１１８】
この時引数Ｄ５として、データ書き込みを行うブロック番号、書き込みデータ先頭アドレスおよび書き込みデータ長を書き込みインタフェース関数Ｄ１に渡す。
【０１１９】
また、書き込み処理が終了した時点で、書き込みインタフェース関数Ｄ１からステータスデータを受け取る。書き込みインタフェース関数Ｄ１は自身がコールされると、データ書き込み処理関数Ｄ３をコールし、データ書き込みの処理を行わせる。データ書き込みの詳細な動作は後述する。
【０１２０】
同様に、データの読み出しを行う場合、読み出しインタフェース関数Ｄ２をコールする。この時引数Ｄ９として、データ読み出しを行うブロック番号を読み出しインタフェース関数Ｄ２に渡す。
【０１２１】
また、読み出し処理が終了した時点で、読み出しインタフェース関数Ｄ２から読み出したデータを受け取る。読み出しインタフェース関数Ｄ２は自身がコールされると、データ読み出し処理関数をコールＤ４し、データ読み出し処理を行わせる。データ読み出しの詳細な動作は後述する。
【０１２２】
まず第２の実施の形態におけるデータ書き込みの詳細な動作を説明する。
【０１２３】
第２の実施の形態におけるデータ書き込み処理関数のフローチャートを示した図６を参照すると、まず、引数として与えられたブロック番号からブロック先頭アドレス、最終アドレスを生成する。
【０１２４】
その生成されたブロックの最新データのアドレスを検索するために、アドレスポインタ“ＡＤＲＳ”をブロック先頭アドレスとし（処理ステップＡ１１）、１ワードずつデータを読み出していく（処理ステップＡ１３）。
【０１２５】
この時、読み出したデータが“ＦＦＦＦＦＦＦＦｈ”であれば（処理ステップＡ１４）、アドレスポインタ“ＡＤＲＳ”を「４」加算する（処理ステップＡ１５）。アドレスポインタ“ＡＤＲＳ”がブロック最終アドレスに達した場合（処理ステップＡ１２）、そのブロックは消去状態であるため、ブロック最終アドレスから、任意のデータ長のユーザデータを書き込む。
【０１２６】
また、検索用チェックコードとして、書き込んだデータのデータ長をユーザデータの次（先頭アドレス方向）のアドレスに書き込む（処理ステップＡ１９）。
【０１２７】
もし、読み出したデータが消去状態の“ＦＦＦＦＦＦＦＦｈ”以外の値であれば（処理ステップＡ１４）、そのデータがチェックコードであるので、検索を終了する。すなわち、アドレスポインタ＝チェックコードが格納されているアドレスの状態である。
【０１２８】
次に、データを書き込む際にその書き込むデータがブロック先頭アドレスを越えるかどうかの判定を行い（処理ステップＡ１６）、越えるようであれば、ブロック消去をして（処理ステップＡ１７）、アドレスポインタ“ＡＤＲＳ”をブロック最終アドレスとする（処理ステップＡ１８）。
【０１２９】
処理ステップＡ１６における「ＡＤＲＳ−書き込みデータ長−４−４」は、この判定の直前でチェックコードを検出しているので、アドレスポインタ（ＡＤＲＳ）は、ブランク領域から「＋４」のアドレス（チェックコードが格納されているアドレス）を指し示している。そこで、次に行う書き込み動作のためにブランク領域を指し示す必要があるので「−４」している。
【０１３０】
つまり、「ＡＤＲＳ（チェックコードが格納されているアドレス）−４（ブランク領域の先頭を指すための減算）」はブロックの先頭アドレス方向に書き込みを開始するアドレスであり、「書き込みデータ長−４（チェックコードのデータ長）」は書き込むデータのデータ長である。
【０１３１】
上述のフローによりデータを書き込むべきアドレスを特定できたので、現在のアドレスポインタ“ＡＤＲＳ”の位置から、任意のデータ長のユーザデータを書き込む。
【０１３２】
また、検索用チェックコードとして、書き込んだデータのデータ長をユーザデータの次のアドレス（ここでは先頭アドレス方向に減少したアドレス）に書き込み（処理ステップＡ１９）、データ書き込みの動作を終了する。
【０１３３】
次にデータ読み出しの動作を詳細に説明する。
【０１３４】
第２の実施の形態におけるデータ読み出し処理関数のフローチャートを示した図７を参照すると、最新データを読み出す場合には、書き込み時と同様に、まず引数として与えられたブロック番号からブロック先頭アドレス、最終アドレスを生成する。
【０１３５】
アドレスポインタ“ＡＤＲＳ”をブロック先頭アドレスとし（処理ステップＢ１１）、１ワードずつデータを読み出していく（処理ステップＢ１３）。
【０１３６】
この時、読み出したデータが“ＦＦＦＦＦＦＦＦｈ”であれば（処理ステップＢ１４）、アドレスポインタ“ＡＤＲＳ”を「４」加算する（処理ステップＢ１５）。
【０１３７】
アドレスポインタ“ＡＤＲＳ”がブロック最終アドレスに達したら（処理ステップＢ１２）、そのブロックは消去状態である。もし、読み出したデータが“ＦＦＦＦＦＦＦＦｈ”以外の値であれば（処理ステップＢ１４）、そのデータがチェックコード（最新データのデータ長）であるので、アドレスポインタ“ＡＤＲＳ”にデータ長を加算した値を、最新データ先頭アドレスとして抽出する（処理ステップＢ１６）。
【０１３８】
次に、抽出したアドレスのデータを読み出し（処理ステップＢ１７）、関数の戻り値とする。
【０１３９】
上述した書き込みおよび読み出し動作を、具体例を用いながら説明する。
【０１４０】
例えば、書き込み対象ブロック番号は“２”、ブロック２の先頭アドレスは“ＦＦＦＦ２０００ｈ”、ブロック２の最終アドレスは“ＦＦＦＦ２ＦＦＦｈ”、書き込みデータが格納されている先頭アドレスを“００００００００ｈ”、書き込みデータ長を“１０ｈ”とする。
【０１４１】
ここでも図２に示すように、ユーザプログラムはユーザプログラムＲＯＭ１０からフラッシュメモリ・セルフ・プログラミング・ライブラリ１３に含まれる書き込みインタフェース関数Ｄ１をコールし、ブロック番号“２”、書き込みデータ先頭アドレス“００００００００ｈ”および書き込みデータ長“１０ｈ”を引数Ｄ５として渡す。
【０１４２】
書き込みインタフェース関数Ｄ１は自身がコールされると、データ書き込み処理関数Ｄ３をコールし、ブロック番号、書き込みデータ先頭アドレスおよび書き込みデータ長を引数Ｄ６として渡し、データ書き込み処理を行わせる。
【０１４３】
データ書き込み処理関数がコールされると、まずブロック番号“２”から、ブロック先頭アドレス“ＦＦＦＦ２０００ｈ”と、ブロック最終アドレス“ＦＦＦＦ２ＦＦＦｈ”とを生成する。この時、アドレスポインタ“ＡＤＲＳ”を“ＦＦＦＦ２０００ｈ”とする（処理ステップＡ１１）。
【０１４４】
次に、アドレスポインタ“ＡＤＲＳ”の指示する“ＦＦＦＦ２０００ｈ”のデータを読み出す（処理ステップＡ１３）。読み出したデータが、“ＦＦＦＦＦＦＦＦｈ”だったなら（処理ステップＡ１４）、アドレスポインタ“ＡＤＲＳ”の指す“ＦＦＦＦ２０００ｈ”を「４」加算し（処理ステップＡ１５）、“ＦＦＦＦ２００４ｈ”となる。
【０１４５】
この時、データ読み出し単位は１ワード（４バイト）であるから、アドレスポインタ“ＡＤＲＳ”の“ＦＦＦＦ２０００ｈ”をブロック最終アドレス“ＦＦＦＦ２ＦＦＣｈ”と比較し（処理ステップＡ１２）、最終アドレスよりも値が小さいため、再びアドレスポインタ“ＡＤＲＳ”のデータを読み出す（処理ステップＡ１３）。
【０１４６】
読み出したデータが消去状態の“ＦＦＦＦＦＦＦＦｈ”以外、例えば“００００００２０ｈ”だったなら（処理ステップＡ１４）、そのデータがチェックコードである。
【０１４７】
次に、最終アドレスから先頭アドレス方向へ順次にデータを書き込んで行ったとき際に、ブロック先頭アドレスを越えるかどうかの判定を行う（処理ステップＡ１６）。
【０１４８】
消去状態であるアドレス“ＦＦＦＦ２０００ｈ”から、書き込みデータ長“１０ｈ”およびチェックコード長“０４ｈ”を減算した値“ＦＦＦＦ１ＦＥＣｈ”は、ブロック先頭アドレス“ＦＦＦＦ２０００”を越えているため（処理ステップＡ１６）、このブロックにはユーザデータを追加記録できない。
【０１４９】
そこで、ブロック消去を行い（処理ステップＡ１７）、アドレスポインタ“ＡＤＲＳ”をブロック最終アドレス“ＦＦＦＦ２ＦＦＣｈ”とする（処理ステップＡ１８）。
【０１５０】
データを書き込むべきアドレスを特定できたので、“００００００００ｈ”から“００００００１０ｈ”に格納されているユーザデータを“ＦＦＦＦ２ＦＦＣｈ”から書き込み、続けて先頭アドレス方向の次のアドレスにユーザデータのデータ長“１０ｈ”を書き込み（処理ステップＡ１９）、ステータスＤ８を返す。
【０１５１】
処理ステップＡ１２において、アドレスポインタ“ＡＤＲＳ”が“ＦＦＦＦ２ＦＦＣｈ”となった場合、そのブロックは消去済みであるため、ブロック最終アドレス“ＦＦＦＦ２ＦＦＣｈ”からユーザデータを書き込み、続けてユーザデータのデータ長“１０ｈ”を書き込み（処理ステップＡ１９）、ステータスＤ８を返す。
【０１５２】
処理ステップＡ１６において、アドレスポインタ“ＡＤＲＳ”が“ＦＦＦＦ２ＦＣ４ｈ”だった場合、消去状態であるアドレス“ＦＦＦＦ２ＦＣ０ｈ”から書き込みデータ長およびチェックコード長を減算した値は“ＦＦＦＦ２ＦＡＣｈ”となり、ブロック先頭アドレス“ＦＦＦＦ２０００ｈ”に達しないため、そのブロックにはユーザデータの追加記録を行うことができる。
【０１５３】
この時、消去状態であるアドレス“ＦＦＦＦ２ＦＣ０ｈ”からユーザデータを書き込み、続けてユーザデータのデータ長“１０ｈ”を書き込み（処理ステップＡ１９）、ステータスＤ８を返す。また、書き込みインタフェース関数Ｄ１からユーザへステータスＤ７を返す。
【０１５４】
次に、図７を参照しながら同様に、データ読み出しの動作を具体例を用いて説明する。
【０１５５】
例えば、データ読み出し対象ブロック番号は“３”、ブロック３の先頭アドレスは“ＦＦＦＦ３０００ｈ”、ブロック３の最終アドレスは“ＦＦＦＦ３ＦＦＦｈ”とする。
【０１５６】
ユーザはフラッシュメモリ・セルフ・プログラミング・ライブラリ１２に含まれる読み出しインタフェース関数Ｄ２をユーザプログラムＲＯＭ１３からコールし、ブロック番号“３”を引数Ｄ１１として渡す。
【０１５７】
読み出しインタフェース関数Ｄ２は自身がコールされると、データ読み出し処理関数Ｄ４をコールし、ブロック番号を引数Ｄ１２として渡し、データ読み出し処理を行わせる。
【０１５８】
ユーザプログラムＲＯＭ１３からデータ読み出し処理関数Ｄ４がコールされると、まずブロック番号“３”から、ブロック先頭アドレス“ＦＦＦＦ３０００ｈ”と、ブロック最終アドレス“ＦＦＦＦ３ＦＦＦｈ”を生成する。
【０１５９】
アドレスポインタ“ＡＤＲＳ”の指すアドレスを“ＦＦＦＦ３０００ｈ”とする（処理ステップＢ１１）。次に、アドレスポインタ“ＡＤＲＳ”の指す“ＦＦＦＦ３０００ｈ”のデータを読み出す（処理ステップＢ１３）。
【０１６０】
読み出したデータが、“ＦＦＦＦＦＦＦＦｈ”だったなら（処理ステップＢ１４）、アドレスポインタ“ＡＤＲＳ”を「４」加算し（処理ステップＢ１５）、“ＦＦＦＦ３００４ｈ”となる。
【０１６１】
データの読み出し単位は１ワード（４バイト）単位であるから、“ＦＦＦＦ３ＦＦＣｈ”をブロック最終アドレスとして、アドレスポインタ“ＡＤＲＳ”の指すアドレス“ＦＦＦＦ３００４ｈ”と比較し（処理ステップＢ１２）、最終アドレスよりも値が小さいため、再びアドレスポインタ“ＡＤＲＳ”の指す“ＦＦＦＦ３００４ｈ”のデータを読み出す（処理ステップＢ１３）。
【０１６２】
読み出したデータが消去状態の“ＦＦＦＦＦＦＦＦｈ”以外、例えば“００００００３０ｈ”だったなら（処理ステップＢ１４）、そのデータがチェックコードであり、格納されているデータのデータ長である。
【０１６３】
よって、現在のアドレスポインタ“ＡＤＲＳ”の値である“ＦＦＦＦ３００４ｈ”にデータ長“３０ｈ”を加算した値“ＦＦＦＦ３０３４ｈ”が最新データの先頭アドレスとなる（処理ステップＢ１６）。
【０１６４】
抽出したアドレス“ＦＦＦＦ３０３４ｈ”からデータ長分のデータを読み出し、読み出しインタフェース関数Ｄ２へステータスＤ１０を返す。
【０１６５】
また、読み出しインタフェース関数Ｄ２からユーザプログラム１２へ、読み出しデータＤ９を返す。
【０１６６】
処理ステップＢ１２において、アドレスポインタ“ＡＤＲＳ”が“ＦＦＦＦ３ＦＦＣｈ”となった場合は、そのブロックは消去状態であるため、データは存在しない。
【０１６７】
上述した第２の実施の形態においても、消去回数を抑えることによってフラッシュメモリの寿命を延ばすことができるだけでなく、最大（ブロックサイズ−チェックコード）までの可変データ長のユーザデータを格納でき、かつその最新データを参照することができるようになり従来技術では一定のデータ長のユーザデータしか扱うことができなかった問題点を解決する。
【０１６８】
【発明の効果】
上述したように、本発明のフラッシュメモリ内蔵の半導体装置（制御回路）、フラッシュメモリの制御方法およびそのプログラムは、消去回数を抑えることによってフラッシュメモリの寿命を延ばすことができるだけでなく、最大“（ブロックサイズ）−（チェックコード）”までの可変データ長のユーザデータを格納でき、かつその最新データを参照することができるという効果が有る。
【図面の簡単な説明】
【図１】本発明の第１の実施の形態第１の実施の形態で制御されるメモリブロック領域におけるデータ配置領域を示した図である。
【図２】関数関係の概要のソフトウェアモジュール構成を示した図である。
【図３】本発明の第１の実施形態のデータ書き込み処理関数のフローチャートである。
【図４】本発明の第１の実施の形態のデータ読み出し処理関数のフローチャートである。
【図５】第２の実施の形態におけるメモリ領域の配置を示した図である。
【図６】第２の実施の形態におけるデータ書き込み処理関数のフローチャートである。
【図７】第２の実施の形態におけるデータ読み出し処理関数のフローチャートである。
【図８】従来技術による不揮発性メモリの書き込みデータのビット構成を示した図である。
【図９】従来の巡回用ビットの使用例の動作説明用フローチャートである。
【符号の説明】
１０    フラッシュメモリ
１１    ＣＰＵ
１２    フラッシュメモリ・セルフ・プログラミング・ライブラリ
１３    ユーザプログラムＲＯＭ
１４    フラッシュメモリ制御回路
Ｄ１    書き込みインタフェース関数
Ｄ２    読み出しインタフェース関数
Ｄ３    データ書き込み処理関数
Ｄ４    データ読み出し処理関数
Ｄ５，Ｄ６，Ｄ１１，Ｄ１２    引数
Ｄ９，Ｄ１０    読み出しデータ
【図１】
2004310268.tif 000003
【図２】
2004310268.tif 000004
【図３】
2004310268.tif 000005
【図４】
2004310268.tif 000006
【図５】
2004310268.tif 000007
【図６】
2004310268.tif 000008
【図７】
2004310268.tif 000009
【図８】
2004310268.tif 000010
【図９】
2004310268.tif 000011