25.6. 並列プログラミング
本項はATmega8U2/16U2/32U2のプログラム用フラッシュ メモリ、データ用EEPROM、メモリの施錠ビット、ヒューズ ビットの並列プログラミングと照合 の方法を記述します。特記事項を除いて、パルス幅は最低250nsと仮定されます。
25.6.1. 信号名
この項でATmega8U2/16U2/32U2のいくつかのピンは並列プログラミング 中の機能を表す信号名で参照されます。図25-1.と表25-9.をご覧くださ い。後続の表で示されないピンはピン名によって参照されます。
XA0とXA1ピンはXTAL1ピンが正パルスを与えられる時に実行される動作 を決めます。このビット符号化は表25-12.で示されます。
WRまたはOEパルス送出時、設定された指令が決める動作が実行され ます。各種指令は表25-13.で示されます。
図25-1. 並列プログラミング構成図
RESET PD1 PD2 PD3 PD4 PD5 PD6
XTAL1 GND +12V
RDY/BSY OE WR BS1 XA0 XA1
PB7~0 VCC
DATA +5V
PD7
162
ATmega8U2/16U2/32U2
25.7. 並列プログラミング手順
25.7.1. 並列プログラミング動作への移行
次に示す方法がデバイスを並列プログラミング動作にします。
① VCCとGND間に4.5~5.5Vを印加します。
② RESETをLow(0)にし、XTAL1を少なくとも6回、交互に(High/Low)切り替えます。
③ 161頁の表25-11.で一覧されるProg_enableピンを全てLow(0)に設定し、最低100ns待ちます。
④ RESETに11.5~12.5Vを印加します。+12VがRESETに印加されてしまった後100ns以内のProg_enableピンのどんな動きも、デバイス のプログラミング動作への移行を失敗させます。
⑤ 新規指令送出前に少なくとも50μs間待ちます。
25.7.2. 効率的なプログラミングへの考慮
設定した指令とアドレスはプログラミング中、維持されます。効率的なプログラミングを行うために次を考慮すべきです。
■ 複数のメモリ領域を読み書きする時に指令設定は一度だけ必要です。
■ チップ消去後のフラッシュ メモリと(EESAVEヒューズがプログラム(0)されている場合を除き)EEPROM全体の内容は$FFなので、値が$FFの データ書き込みを飛ばします。
■ アドレス上位バイトはフラッシュ メモリで新規256語(ワード)枠、EEPROMで新規256バイト枠の読み書き前に一度だけ必要です。この考慮は 識票バイト読み出しにも適用されます。
25.7.3. チップ消去
チップ消去はフラッシュ メモリ、EEPROM(注1)、施錠ビットを消去します。施錠ビットはプログラム メモリが完全に消去されてしまうまでリセット(消去) されません。ヒューズ ビットは変更されません。チップ消去はフラッシュ メモリやEEPROMが再書き込みされる前に実行されなければなりませ ん。
注1: EESAVEヒューズがプログラム(0)されていると、EEPROMはチップ消去中、保護されます。
「チップ消去」指令設定
① XA1をHigh(1)、XA0をLow(0)に設定します。これは指令設定を許可します。
② BS1をLow(0)に設定します。
③ DATAを$80(1000 0000)に設定します。これはチップ消去指令です。
④ XTAL1に正パルスを与えます。これはチップ消去指令を設定します。
⑤ WRに負パルスを与えます。これはチップ消去を開始します。RDY/BSYがLow(0)になります。
⑥ 次の指令を設定する前にRDY/BSYがHigh(1)になるまで待ちます。
(訳注) 原書に於いて、フラッシュ メモリ プログラミング時のアドレス指定が拡張アドレスまで指定するようになっています。然しながらプログラミング 時のアドレス指定は語(ワード)単位で行うため、64K語(128Kバイト)までの場合は16ビット幅以内なので、基本的に拡張アドレス指定 は必要ない筈です。これは128K語(256Kバイト)用のデバイス記述を複写し、修正を忘れたものと思われます。けれども、将来の 展開を予想し、64K語(128Kバイト)を越えるデバイス用の回路を採用したため、拡張アドレスの明示的な指定が必要になった、と 考えることもできます。
本書では原則的に原書に従いますが、独自追加部分は拡張アドレス指定なし、として記述しました。
25.7.4. フラッシュ メモリ書き込み (図25-3.タイミングを参照)
フラッシュ メモリはページで構成されます(160頁の表25-7.参照)。フラッシュ メモリへ書く時にプログラム データはページ緩衝部にラッチされます。こ れは同時に書かれることをプログラム データの1ページに許します。次の手順は完全なフラッシュ メモリの書き込み方法を記述します。
A. 「フラッシュ メモリ書き込み」指令設定
① XA1をHigh(1)、XA0をLow(0)に設定します。これは指令設定を許可します。
② BS1をLow(0)に設定します。
③ DATAを$10(0001 0000)に設定します。これはフラッシュ メモリ書き込み指令です。
④ XTAL1に正パルスを与えます。これはフラッシュ メモリ書き込み指令を設定します。
B. アドレス下位バイト (アドレス ビット7~0) 設定
① XA1をLow(0)、XA0をLow(0)に設定します。これはアドレス設定を許可します。
② BS2をLow(0)、BS1をLow(0)に設定します。これは下位アドレス(バイト)を選択します。
③ DATAにアドレス下位バイト($00~$FF)を設定します。
④ XTAL1に正パルスを与えます。これはアドレス下位バイトを設定します。
C. データ下位バイト設定
① XA1をLow(0)、XA0をHigh(1)に設定します。これはデータ設定を許可します。
② DATAにデータ下位バイト($00~$FF)を設定します。
③ XTAL1に正パルスを与えます。これはデータ下位バイトを設定します。
D. データ上位バイト設定
① BS1をHigh(1)に設定します。これは上位バイトを選択します。
② XA1をLow(0)、XA0をHigh(1)に設定します。これはデータ設定を許可します。
③ DATAにデータ上位バイト($00~$FF)を設定します。
④ XTAL1に正パルスを与えます。これはデータ上位バイトを設定します。
E. 語(ワード)データをページ一時緩衝部に設定
① BS1をHigh(1)にします。これは上位バイトを選択します。
② PAGELに正パルスを与えます。これは語データをページ一時緩衝部にラッチ(設定)します。
F. 緩衝部全体が満たされるか、または(必要な)全てのデータが緩衝部内に設定されるまで、B~Eを繰り返し
アドレス内の下位ビットがページ内の語(ワード)位置を指示する一方、上位ビットがフラッシュ メモリ内のページをアドレス指定します。これは次頁 の図25-2.で図示されます。ページ内の語アドレスに8ビット未満が必要とされる場合(ページ容量<256)、アドレス下位バイトの最上位(側)ビット がページ書き込み実行時のページ アドレスに使用されることに注意してください。
G. アドレス上位バイト (アドレス ビット15~8) 設定
① XA1をLow(0)、XA0をLow(0)に設定します。これはアドレス設定を許可します。
② BS2をLow(0)、BS1をHigh(1)に設定します。これは上位アドレス(バイト)を選択します。
③ DATAにアドレス上位バイト($00~$0F/$1F/$3F)を設定します。
④ XTAL1に正パルスを与えます。これはアドレス上位バイトを設定します。
H. アドレス上位拡張バイト (アドレス ビット23~16) 設定
① XA1をLow(0)、XA0をLow(0)に設定します。これはアドレス設定を許可します。
② BS2をHigh(1)、BS1をLow(0)に設定します。これは上位拡張アドレス(バイト)を選択します。
③ DATAにアドレス上位バイト($00)を設定します。
④ XTAL1に正パルスを与えます。これはアドレス上位拡張バイトを設定します。
I. ページ書き込み
① BS1をLow(0)に設定します。
② WRに負パルスを与えます。これはデータのページ全体の書き込みを開始します。RDY/BSYがLow(0)になります。
③ RDY/BSYがHigh(1)になるまで待ちます。
J. フラッシュ メモリ全部が書かれるか、または(必要な)全データが書かれてしまうまで、B~Iを繰り返し K. ページ書き込み終了
① XA1をHigh(1)、XA0をLow(0)に設定します。これは指令設定を許可します。
② DATAを$00(0000 0000)にします。これは無操作指令です。
③ XTAL1に正パルスを与えます。これは無操作指令を設定し、内部書き込み信号がリセットされます。
164
ATmega8U2/16U2/32U2
図25-2. ページで構成されたフラッシュ メモリのアドレス指定 PCMSB
PCPAGE PCWORD PAGEMSB プログラム カウンタ
ページ 命令語(ワード)
プログラム メモリ ページ
フラッシュ メモリ内のページ アドレス ページ内の語(ワード)アドレス
PCWORD (PAGEMSB~0)
$00
$01
$02
PAGEEND
~
注: PCPAGEとPCWORDは160頁の表25-7.で一覧されます。
図25-3. フラッシュ メモリ書き込みタイミング
$10 アドレス下位 データ下位 アドレス上位
DATA XA1 XA0 BS1
XTAL1 WR RDY/BSY RESET OE
データ上位 H
LH LH LH LH LH LH LH 12VL
L BS2
PAGEL
H LH L
xx xx
A B C F D E G H
注: xx値は無関係です。A~Iは前記プログラミングを参照してください。
拡張アドレス I
25.7.5. EEPROM書き込み
EEPROMはページで構成されます(160頁の表25-8.参照)。EEPROMを書く時にデータはページ緩衝部にラッチされます。これは同時に書 かれることをデータの1ページに許します。データ用EEPROMメモリの書き込み方法は次の通りです。(指令、アドレス、データ設定の詳細につ いては163頁の「フラッシュ メモリの書き込み」を参照。図25-4.タイミング参照。)
1. EEPROM書き込み指令$11(0001 0001)を設定します。 (「フラッシュ メモリ書き込み」のAを参照) 2. アドレス上位バイト($00~$01/$01/$03)を設定します。 (「フラッシュ メモリ書き込み」のGを参照) 3. アドレス下位バイト($00~$FF)を設定します。 (「フラッシュ メモリ書き込み」のBを参照)
4. データ バイト($00~$FF)を設定します。 (「フラッシュ メモリ書き込み」のCを参照)
5. データをラッチします(PAGELに正パルスを与えます)。 (「フラッシュ メモリ書き込み」のEを参照) L. 緩衝部全体が満たされるまで3~5を繰り返します。
M. EEPROMページ書き込み
① BS2をLow(0)、BS1をLow(0)に設定します。
② WRに負パルスを与えます。これはEEPROMページ書き込みを開始します。RDY/BSYがLow(0)になります。
③ 次のページを書く前に、RDY/BSYがHigh(1)になるまで待ちます。
図25-4. EEPROM書き込みタイミング
$11 アドレス上位 アドレス下位 データ DATA
XA1 XA0 BS1 XTAL1 WR RDY/BSY RESET OE
H LH LH LH LH LH LH 12VL
LH L BS2
PAGEL
H LH L
xx xx
A G B C E M
L
25.7.6. フラッシュ メモリ読み出し
フラッシュ メモリの読み出し方法は次の通りです。(指令とアドレス設定の詳細については163頁の「フラッシュ メモリの書き込み」を参照。) 1. フラッシュ メモリ読み出し指令$02(0000 0010)を設定します。 (「フラッシュ メモリ書き込み」のAを参照)
2. アドレス拡張バイト($00)を設定します。 (「フラッシュ メモリ書き込み」のHを参照)
3. アドレス上位バイト($00~$0F/$1F/$3F)を設定します。 (「フラッシュ メモリ書き込み」のGを参照) 4. アドレス下位バイト($00~$FF)を設定します。 (「フラッシュ メモリ書き込み」のBを参照)
5. BS1をLow(0)、OEをLow(0)に設定します。フラッシュ メモリ語(ワード)の下位バイトが直ぐにDATAで読めます。
6. BS1をHigh(1)に設定します。フラッシュ メモリ語(ワード)の上位バイトが直ぐにDATAで読めます。
7. OEをHigh(1)に設定します。DATAはHi-Zになります。
25.7.7. EEPROM読み出し
EEPROMの読み出し方法は次の通りです。(指令とアドレス設定の詳細については163頁の「フラッシュ メモリの書き込み」を参照。) 1. EEPROM読み出し指令$03(0000 0011)を設定します。 (「フラッシュ メモリの書き込み」のAを参照)
2. アドレス上位バイト($00~$01/$01/$03)を設定します。 (「フラッシュ メモリの書き込み」のGを参照) 3. アドレス下位バイト($00~$FF)を設定します。 (「フラッシュ メモリの書き込み」のBを参照)
4. BS1をLow(0)、OEをLow(0)に設定します。EEPROMのバイト データが直ぐにDATAで読めます。
5. OEをHigh(1)に設定します。DATAはHi-Zになります。
166
ATmega8U2/16U2/32U2
25.7.8. ヒューズ ビット書き込み (訳注:原書での拡張/上位/下位ヒューズ項を1つに纏めました。)
各ヒューズ バイトの書き込み方法は次の通りです。(指令とデータ設定の詳細については163頁の「フラッシュ メモリの書き込み」を参照。) 1. ヒューズ ビット書き込み指令$40(0100 0000)を設定します。 (「フラッシュ メモリ書き込み」のAを参照)
2. データ下位バイトを設定します。0=プログラム,1=非プログラム(消去)です。 (「フラッシュ メモリ書き込み」のCを参照) 3. BS1とBS2を右表の目的バイトに対応する設定にします。
4. WRに負パルスを与え、RDY/BSYがHighになるまで待ちます。
5. 3.でHighに設定したBS1、BS2をLow(0)に戻します。これはデータ下位バイトを選択します。
表A. ヒューズ バイト対応BS1,BS2設定 ヒューズ バイト BS2
下位バイト Low(0) BS1 Low(0) High(1) 拡張バイト
上位バイト
High(1) Low(0) Low(0)
図25-5. ヒューズ書き込みタイミング
$40 $40 データ
DATA XA1 XA0 BS1
XTAL1 WR RDY/BSY RESET OE
H LH LH LH L H LH LH 12VL
LH L
PAGEL H
L
xx xx
A C 下位ヒューズ書き A C
データ
上位ヒューズ書き
BS2 H
L
$40 データ xx
A C 拡張ヒューズ書き
25.7.9. 施錠ビット書き込み
施錠ビットの書き込み方法は次の通りです。(指令とデータ設定の詳細については163頁の「フラッシュ メモリの書き込み」を参照。) 1. 施錠ビット書き込み指令$20(0010 0000)を設定します。 (「フラッシュ メモリの書き込み」のAを参照)
2. データ下位バイト(としてデータ)を設定します。0=プログラム,1=無変化です。LB保護種別3が設定(LB1とLB2がプログラム(0))されると、ど の外部的なプログラミング動作種別によってもブート施錠ビットはプログラミングできません。 (「フラッシュ メモリの書き込み」のCを参照) 3. WRに負パルスを与え、RDY/BSYがHighになるまで待ちます。
施錠ビットはチップ消去の実行によってのみ解除(1)できます。
25.7.10. ヒューズ ビットと施錠ビットの読み出し
ヒューズ ビットと施錠ビットの読み出し方法は次の通りです。(指令設定の詳細については163頁の「フラッシュ メモリの書き込み」を参照。) 1. ヒューズ ビットと施錠ビットの読み出し指令$04(0000 0100)を設定します。 (「フラッシュ メモリの書き込み」のAを参照)
2. BS1とBS2をLow(0)、OEをLow(0)に設定します。ヒューズ下位ビットの状態が直ぐにDATAで読めます。(0=プログラム) 3. BS1とBS2をHigh(1)、OEをLow(0)に設定します。ヒューズ上位ビットの状態が直ぐにDATAで読めます。(0=プログラム)
4. BS1をLow(0)、BS2をHigh(1)、OEをLow(0)に設定します。拡張ヒュー ズ ビットの状態が直ぐにDATAで読めます。(0=プログラム) 5. BS1をhigh(1)、BS2をLow(0)、OEをLow(0)に設定します。施錠ビットの状態が直ぐにDATAで読めます。(0=プログラム)
6. OEをHigh(1)に設定します。DATAはHi-Zになります。
図25-6. ヒューズ,施錠ビット読み出し中のBS1, BS2との関係
DATA 拡張ヒューズ バイト
施錠ビット 0
ヒューズ上位バイト 1
0 1
BS2 BS1 0
1 ヒューズ下位バイト