EZ-USBの割り込み処理は,基本的に8051の割り込みそのものですが,USBインターフェースとの間では若干の拡張が施されています.まず,8051の割り込み処理について説明しましょう.
● 8051の割り込み処理
8051の割り込みは,要因ごとに飛び先が固定されています.割り込み処理のエントリは0003h番地から,8バイトおきになっています.また,8051の割り込み要因はIE0(INT0#ピン),TF0(Timer#0 オーバフロー),IE1(INT1#ピン),TF1(Timer#1オーバフロー)がありますが,割り込みが発生するとそれぞれ0003h,000Bh,0013h,001Bh番地に制御が移るというわけです.EZ-USBでは割り込み要因が追加されていますが,それらも8番地おきに割り込み処理エントリが並ぶ格好になっています.
0003h番地からというのが中途半端な感じですが,8051はリセット後,0000h番地から命令を実行するようになっており,通常は0000h〜0002hの3バイトの領域にLJMP命令を配置するため空けてあるわけです.
● EZ-USBのオートベクタ割り込み
EZ-USBの割り込みは,8051の割り込みを拡張する形で配置されています(表6).このうち,USBコントローラ部分が発生する割り込みは,0033hのResume(PFI),USB(INT2),I2C(INT3)の三つです.USB伝送に伴う割り込みはUSB(INT2)で,通常,この割り込みが発生すると0043h番地に飛んできて,ここに書かれたLJMP命令を実行します.
EZ-USBの場合,エンドポイントの数が多いこともあり,割り込み要因となるものが多数あります.そこで,EZ-USBではUSB割り込みが入った後,割り込み要因を解釈して分岐するという手間を省く仕組みが用意されています.これがオートベクタです.
USB伝送にともなう割り込みにはそれぞれ番号が振られていて,これを2ビットシフトしたもの(00hから4おきになる)がベクタとして,IVECレジスタから読み出されるのですが,オートベクタモードをイネーブルすると(USBBAVのAVENビットを‘1’),LJMP命令の3バイト目(16ビットアドレスの下位8ビット)がこのIVECレジスタの値とすり替わります.たとえば,USB割り込みのところの命令コードがLJMP 1280hだったときに,IVECの値が18h(EP0のIN方向伝送割り込み)が発生したとき,通常は1280h番地から始まるプログラムの中でIVECレジスタを見てEP0の処理を行うわけですが,オートベクタになっていると,下位8ビット(80h)がIVECレジスタの値(18h)とすり替わり,1218hにジャンプします.
この1218hに本来の割り込み処理に飛ぶためのLJMP命令を置くことで,プログラムを簡素化することができるというわけです.割り込み要因とベクタの関係は,表7に整理したので参考にしてください.
次章で作成するサンプルプログラムでは,コンパイラの生成するジャンプ命令の生成機能を使ったため,このオートベクタ機能は使いませんでした.
参考文献
1)AN21xxファミリデータシート,Cypress Semiconductor
1月号特集トップページへ戻る
Copyright 2001 桑野 雅彦
|