
■ BASCOM-AVR (DEMO) の使用方法 ■ |
*** BASCOMのI2C命令について *** |
ソフトウェアI2C と ハードウェアI2C
・BASCOMでI2C命令を使用する場合、初期状態(指定が無い場合)ではソフトウェアI2Cルーチンを
使用します。
・これは、初期のAVRチップが、まだTWI(ハードウェアI2C)を搭載していなかったからです。
・PhilipsがI2Cの開発元であるめ、AtmelはTWIと命名しました。 (TWIはI2Cと同じです)
・従って、BASCOMを使用すると、すべてのAVRチップでI2Cインターフェイスを使用することができます。
・ほとんどの新しいAVRチップには、ハードウェアのI2C(TWI)が組み込まれています。
・「I2C_TWI」ライブラリを使用するとTWIを使うことができ、これはフラッシュのコードを少なくできる利点が
あります。
・代わりに、チップ固有の指定されたSCLピンとSDAピンしか使用できないという欠点もあります。
(CONFIG SCLとCONFIG SDA命令で、チップ固有のSCLピンとSDAピンを指定する必要があります)
・使用するチップにTWIインターフェイスがある場合は、このTWIを使用することをお勧めします。
・BASCOMにTWIの使用を強制するには、コードに下記の命令文を挿入する必要があります。
$lib "i2c_TWI.LBX" (CONFIG TWIを参照)
I2C命令の体系
・「I2CSEND」と「I2CRECEIVE」命令で、ほとんどの通信処理を行うことができますが、スレーブ・デバイス
の一部に、これらのI2Cルーチンでは不都合が出て、特殊な通信が必要になる場合があります。
・I2CSTART、I2CWBYTE、I2CRBYTE、I2CSTOP、I2CREPSTART 命令を使用すると、必要なI2C通信
処理を作成することができます。
・通常のAVRチップは、リピート・スタート・コンディションにする場合、I2CSTARTまたはI2CREPSTART
命令のいずれかを使用できます。
・XMegaでリピート・スタート・コンディションにするには、I2CREPSTARTを使用する必要があります。
・下記の「i2cV2.LBX」を使用している場合も同様です。
ソフトウェアI2Cの注意点
・BASCOMのソフトウェアI2Cルーチンは、初期状態で「i2c.lib」という名前のライブラリを使用します。
・このライブラリは、クロック(SCL)およびデータ(SDA)線の状態を保全しないため、i2cstartまたはi2cstop
命令が実行されると、STARTおよびSTOPコンディションが生成される前に、クロックおよびデータ線を
適切な状態(例えばアイドル状態)に設定する必要があります。
・これにより、小さなグリッチ(ノイズになるパルス)が発生する可能性があります。
・ほとんどのスレーブ・デバイスはこのグリッチを無視しますが、いくつかのデバイスがこれにより異常な
動作を起こすことがあります。
・その対策のために、クロックとデータ線が常に既知の状態になるように修正されたライブラリが
追加されました。
・このライブラリでは、グリッチのないクロックとデータ線の状態を生成することができます。
・このライブラリを使用するには、コードに下記の命令文を挿入する必要があります。
$lib "i2cV2.LBX" (I2CREPSTARTを参照)
・これにより、コンパイラはこのライブラリを使用します。
・注意点として、リピート・スタート・コンディションにするには、I2CREPSTARTを使用する必要があります。
|
USI (ユニバーサル・シリアル・インターフェイス)について
・USIは、ほとんどのATtinyチップに搭載されており、さまざまな仕事に使用できます。
・現時点のBASCOMでは、TWIマスター・モードとTWIスレーブ・モードのみがサポートされています。
・その他のモードは、ユーザー自身で設定およびコード化する必要があります。
・「i2c_USI.LBX」ライブラリは、代用のI2Cマスター・ライブラリで、USIインターフェイスを搭載している
チップで使われることを目的としています。
・ハードウェアを使用する方がフラッシュの使用量が少なくなるため、より優れています。
・もし、チップがTWIを持っているならば、TWIの使用をお勧めします。
・チップがUSIを持っているならば、USIの使用をお勧めします。
・チップにハードウェアI2C(TWIまたはUSI)がない場合は、BASCOMのソフトウェアI2Cルーチンを
使用します。
・I2Cのマスター・モードでUSIを使用するには、CONFIG USI命令を使用します。
|
CONFIG SCL |
一覧へ戻る |
I2Cバスの、SCLラインを接続する、ポートピンを設定します。
書式 |
Config Scl = PORTX.b |
注釈 |
X = |
ポートの名前。 ( A , B , C , D , E , F , G ) |
b = |
ピンの番号。 ( 0 〜 7 ) |
|
・コンパイラの[Options]→[Compiler]→[I2C]からも設定が可能ですが、この命令が優先されます。
・ソフトウェア I2Cの場合は、設定されたポートピンが、DDRによる疑似オープンドレインで操作されます。
・TWI(ハードウェア I2C)の場合も、既存のポートピンを指定する必要があります。
|
CONFIG SDA |
一覧へ戻る |
I2Cバスの、SDAラインを接続する、ポートピンを設定します。
書式 |
Config Sda = PORTX.b |
注釈 |
X = |
ポートの名前。 ( A , B , C , D , E , F , G ) |
b = |
ピンの番号。 ( 0 〜 7 ) |
|
・コンパイラの[Options]→[Compiler]→[I2C]からも設定が可能ですが、この命令が優先されます。
・ソフトウェア I2Cの場合は、設定されたポートピンが、DDRによる疑似オープンドレインで操作されます。 ・TWI(ハードウェア I2C)の場合も、既存のポートピンを指定する必要があります。
|
CONFIG I2CBUS |
一覧へ戻る |
複数のI2Cバスを構成して、SCLとSDAラインのポートピンを設定します。
書式 |
Config I2cbus = n , Scl = PORTX.b , Sda = PORTX.b |
注釈 |
n = |
I2Cバスを選択する番号。 ( 0〜15の数値、必ず0から割り付ける ) |
X = |
ポートの名前。 ( A , B , C , D , E , F , G ) |
b = |
ピンの番号。 ( 0 〜 7 ) |
|
・I2Cスレーブアドレスが同じデバイスでも、I2Cのバスラインを増やして接続し制御できます。
・各バスのSCLとSDAピンは、同じポートにする必要があります。 (バスの構成は別ポートでも可能)
・Mega128の「PortF」の様に、PIN、DDR、PORTレジスターのアドレスが昇順になっていない
AVRのポートでは使用できません。
・各バスを構成した後に、必ずI2CINIT命令でそれぞれのバスラインを初期化する必要があります。
・内部変数「I2cbus」が用意されるので、各I2C命令を実行する前に、この変数にバスの選択番号を
入れて、バスを切り替えます。
|
(例) |
|
Config I2cbus = 0 , Scl = Portd.0 , Sda = Portd.1 |
' PD0,PD1にI2Cバスを構成する。 |
Config I2cbus = 1 , Scl = Portd.3 , Sda = Portd.2 |
' PD2,PD3にI2Cバスを構成する。 |
Config I2cbus = 2 , Scl = Portc.0 , Sda = Portc.1 |
' PC0,PC1にI2Cバスを構成する。 |
I2cbus = 0 |
' I2Cバス[0]を選択する。 |
I2cinit |
' I2Cバス[0]ラインを初期化。 |
I2cbus = 1 |
' I2Cバス[1]を選択する。 |
I2cinit |
' I2Cバス[1]ラインを初期化。 |
I2cbus = 2 |
' I2Cバス[2]を選択する。 |
I2cinit |
' I2Cバス[2]ラインを初期化。 |
' |
' |
I2cbus = 1 |
' I2Cバス[1]を選択する。 |
I2csend &H40 , &B0101010 |
' I2Cバス[1]に送信する。 |
I2cbus = 0 |
' I2Cバス[0]を選択する。 |
I2creceive &H64 , I2cbuff(1) , 1 , 7
|
' I2Cバス[0]から受信する。 |
|
|
CONFIG I2CDELAY |
一覧へ戻る |
ソフトウェア I2Cの、SCLクロック速度を設定します。
書式 |
Config I2cdelay = value |
注釈 |
value = クロック周期の遅延数。 (1 〜 255) |
・値が大きいほど、周波数が下がります。
・デフォルトは5で、クロックは200KHzに設定されています。 10を設定すると、100KHzになります。
・AVRの動作クロックが低い場合は、上記の設定にならない場合があります。
注.ソフトウェア I2Cの、SCLクロック速度設定(CONFIG I2CDELAY)にバグがあります。
・マニュアルに記載されている、遅延数 (5 = 200KHz , 10 = 100KHz) は、AVRの動作クロックが
4MHzの場合($crystal = 4000000)の計算値で、($crystal =)の値が(4000000)以外の場合は、
SCLクロック速度が記載されている値になりません。
・AVRの動作クロックが16MHzの場合に、1の設定で約238kHzとなります。 |
|
CONFIG TWI |
一覧へ戻る |
TWI(ハードウェア I2C)の、SCLクロック速度を設定します。
書式 |
Config Twi = value |
注釈 |
value = SCLクロック周波数。 |
・必要なクロック周波数を、周波数値で設定します。
( 400KHz = 400000 , 100KHz = 100000 )
・AVRの動作クロックが低い場合は、設定の速度が得られない場合があります。
・TWI(ハードウェア I2C)を使用する場合は、ライブラリ "i2c_twi.lbx" を組み込む必要があります。
|
(例) |
|
$regfile = "M128def.dat" |
' AVRデバイスを"ATmega128"に設定。 |
$crystal = 16000000 |
' クロック周波数を16MHzに設定。(任意の周波数) |
$lib "i2c_TWI.LBX" |
' TWI用ライブラリを組み込む。 |
Config Scl = PORTD.0 |
' SCLラインを接続する、ポートピンを設定。 |
Config Sda = PORTD.1 |
' SDAラインを接続する、ポートピンを設定。 |
Config Twi = 400000 |
' SCLクロック速度を設定。 |
I2cinit |
' SCL・SDAラインを初期化。 |
|
Xmegaチップの場合。
書式 |
Config Twix = value |
注釈 |
Twix = TWIC or TWID or TWIE or TWIF
value = SCLクロック周波数。 |
・Xmegaは最大4つのTWIバスを設置することができます。
・Xmegaは複数のTWIバスを設置することができるので、TWID、TWIE、TWIFを指定するときは、
チャネルの識別子を使用する必要があります。 ・TWIC、TWID、TWIE、TWIFを指定しない場合、TWICが初期値として使用されます。
・これは通常のI2CコードがTWICとだけ完全な互換性があることを意味します。
・したがって、チャネル識別子を省略すると自動的にTWICが使用されます。
・TWI_STARTという名前の変数をバイトで定義する必要があります。
・これはXmegaのTWIライブラリによって使用され、それがないとエラーが発生します。
Xtinyチップの場合。
書式 |
Config Twix = value |
注釈 |
Twix = TWI or TWI0
value = SCLクロック周波数。 |
・Xtinyは、1つのTWIバスを搭載しています。
・Xtinyは複数のTWIバスを設置できるため、TWI1以上のアドレスを指定する場合はチャネル識別子を
使用する必要があります。
・これは、通常のI2Cコードと完全に互換性がありますが、TWI,TWI0にしか対応していないことを
意味します。
・したがって、チャネル識別子を省略すると、自動的にTWI0が使用されます。
・TWI_STARTという名前の変数をバイトで定義する必要があります。
・これはXmegaのTWIライブラリによって使用され、それがないとエラーが発生します。
・チップによっては、Mega328PBのように複数のTWIインタフェースをサポートするものもあります。
・CONFIG TWI1を使用して、TWI1という名前の2番目のTWIを構成してください。
・TWI0と名付けられた最初のTWIはTWIと呼ばれます。
|
I2CINIT |
一覧へ戻る |
I2Cバスの、SCL、SDAラインを初期化します。
・SCL、SDAラインを、Hレベル(オープンドレイン)にします。
|
I2CSEND |
一覧へ戻る |
I2Cデバイスに、データを送信します。
書式 |
I2csend SlvAdr , variable
I2csend SlvAdr , variable , length |
注釈 |
SlvAdr = |
I2Cデバイスの、8bitスレーブ・アドレス。 (バイト型変数 または 定数) |
variable = |
送信するデータ。 (バイト、ワード、ロング型変数、配列、定数) |
length = |
送信するバイト数。 (バイト型変数 または 定数 [1〜255]) |
|
・[スタート・コンディション] → [アドレス送信] → [データ送信] → [ストップ・コンディション] の、一連の
動作を行います。
・送信データが、ワードやロング型の場合、下位バイトから送信されます。 (レングスも指定が必要)
・エラーが発生すると、内部変数 [ERR] にエラー情報が入ります。 (エラー無し = 0 、 エラー有り = 1)
|
(例) |
|
Dim Dat(10) As Byte |
' 使用する変数を宣言。 |
I2csend &HA0 , Dat(1) , 10 |
' 配列の内容を10バイト送信。 |
|
|
I2CRECEIVE |
一覧へ戻る |
I2Cデバイスから、データを受信します。
書式 |
I2creceive SlvAdr , variable
I2creceive SlvAdr , variable , lengthS , lengthR |
注釈 |
SlvAdr = |
I2Cデバイスの、8bitスレーブ・アドレス。 (バイト型変数 または 定数) |
variable = |
送信・受信データを入れる変数。(バイト、ワード、ロング型変数、配列) |
lengthS = |
送信するバイト数。 (バイト型変数 または 定数 [1〜255]) |
lengthR = |
受信するバイト数。 (バイト型変数 または 定数 [1〜255]) |
|
・[スタート・コンディション] → [アドレス送信] → [データ送信] → [データ受信] →
[ストップ・コンディション] の、一連の動作を行います。
・スレーブ・アドレス内の[Read/Write]ビットはソフトウェアで設定されるので、SlvAdrは
8bitのベース・アドレスを指定して下さい。
・エラーが発生すると、内部変数 [ERR] にエラー情報が入ります。 (エラー無し = 0 、 エラー有り = 1)
|
(例) |
|
Dim Buf(2) As Byte |
' 使用する変数を宣言。 |
I2creceive &HA0 , Buf(1) , 2 , 1 |
' 2バイトを送信し、1バイトを受信します。 |
|
|
I2CSTART |
一覧へ戻る |
I2Cバスを、[スタート・コンディション] の状態にします。
・I2CSEND、I2CRECEIVE命令の一連の動作を、個別に実行させることができます。
・エラーが発生すると、内部変数 [ERR] にエラー情報が入ります。 (エラー無し = 0 、 エラー有り = 1)
|
I2CSTOP |
一覧へ戻る |
I2Cバスを、[ストップ・コンディション] の状態にします。
・I2CSEND、I2CRECEIVE命令の一連の動作を、個別に実行させることができます。
・エラーが発生すると、内部変数 [ERR] にエラー情報が入ります。 (エラー無し = 0 、 エラー有り = 1)
|
I2CREPSTART |
一覧へ戻る |
I2Cバスを、[リピート・スタート・コンディション] の状態にします。
・I2CRECEIVE命令の一連の動作を、個別に実行させることができます。
・エラーが発生すると、内部変数 [ERR] にエラー情報が入ります。 (エラー無し = 0 、 エラー有り = 1)
|
(例) I2C-EEPROMの読み出し |
|
$lib "i2cV2.LBX" |
' 修正版のライブラリを組み込む。 |
Config Scl = PORTD.0 |
' SCLラインを接続する、ポートピンを設定。 |
Config Sda = PORTD.1 |
' SDAラインを接続する、ポートピンを設定。 |
I2cinit |
' SCL・SDAラインを初期化する。 |
I2cstart |
' [スタート・コンディション] の状態にする。 |
I2cwbyte Slvadr_w |
' 8bitスレーブ・アドレス(書き込み)を送信。 |
I2cwbyte Eepadr |
' EEPROMアドレスを送信。 |
i2crepstart |
' [再スタート] の状態にする。 |
I2cwbyte Slvadr_r |
' 8bitスレーブ・アドレス(読み出し)を送信。 |
I2crbyte Value1 , Ack |
' データを読み出す。 |
I2crbyte Value2 , Nack |
' データを読み出す。 |
I2cstop |
' [ストップ・コンディション] の状態にする。 |
|
|
I2CWBYTE |
一覧へ戻る |
I2Cデバイスに、データを1バイト送信します。
書式 |
I2cwbyte variable |
注釈 |
variable = |
送信するデータ。 (バイト型変数 または 定数) |
|
・I2CSEND命令の一連の動作を、個別に実行させることができます。
・エラーが発生すると、内部変数 [ERR] にエラー情報が入ります。 (エラー無し = 0 、 エラー有り = 1)
|
(例) I2C-EEPROMの書き込み |
|
I2cstart |
' [スタート・コンディション] の状態にする。 |
I2cwbyte Slvadr_w |
' 8bitスレーブ・アドレス(書き込み)を送信。 |
I2cwbyte Eepadr |
' EEPROMアドレスを送信。 |
I2cwbyte Value |
' データを書き込む。 |
I2cstop |
' [ストップ・コンディション] の状態にする。 |
Waitms 10 |
' 待ち時間タイマー。 |
|
|
I2CRBYTE |
一覧へ戻る |
I2Cデバイスから、データを1バイト受信します。
書式 |
I2crbyte variable , ACK/NACK |
注釈 |
variable = |
受信データを入れる変数。 (バイト型変数) |
ACK/NACK = |
ACK − 引き続きデータを受信する場合。
NACK − この1バイトで、データの受信を終了する場合。 |
|
・I2CRECEIVE命令の一連の動作を、個別に実行させることができます。
・エラーが発生すると、内部変数 [ERR] にエラー情報が入ります。 (エラー無し = 0 、 エラー有り = 1)
|
(例) I2C-EEPROMの読み出し |
|
I2cstart |
' [スタート・コンディション] の状態にする。 |
I2cwbyte Slvadr_w |
' 8bitスレーブ・アドレス(書き込み)を送信。 |
I2cwbyte Eepadr |
' EEPROMアドレスを送信。 |
I2cstart |
' [再スタート] の状態にする。 |
I2cwbyte Slvadr_r |
' 8bitスレーブ・アドレス(読み出し)を送信。 |
I2crbyte Value , Nack |
' データを読み出す。 |
I2cstop |
' [ストップ・コンディション] の状態にする。 |
|
|
CONFIG I2CSLAVE |
一覧へ戻る |
I2C スレーブ・モードを構成します。
書式 |
Config I2cslave = SlvAdr , Int = interrupt , Timer = tmr |
注釈 |
SlvAdr = |
I2Cスレーブ・デバイスとしての8bitアドレス。
(例えば &H60で&H61は不可) |
interrupt = |
使用する割込み。 (デフォルトは[ INT0 ]) |
tmr = |
使用するタイマー。 (デフォルトは[ TIMER0 ]) |
|
・有料のアドオン・ライブラリが必要です。
・デフォルト以外の割り込みを使用する場合には、ライブラリコードを変更する必要があります。
・デフォルト以外のタイマーを使用する場合には、ライブラリコードを変更する必要があります。
△ 動作未確認
|
CONFIG TWISLAVE |
一覧へ戻る |
TWI スレーブ・モードを構成し、スレーブ・アドレス、ビット・レートを設定します。
書式 |
Config Twislave = SlvAdr , Btr = length , Bitrate = Bvalue ,
Save = Option [ , Gencall = gca] |
注釈 |
SlvAdr = |
TWIスレーブ・デバイスとしての8bitアドレス。 (偶数アドレス) |
length = |
受信するバイト数。 |
Bvalue = |
クロック周波数。 ( 400KHz = 400000 , 100KHz = 100000 ) |
Option = |
NOSAVE − 割り込み時に、全レジスターの待避・復帰を行いません。
SAVE − 割り込み時に、全レジスターの待避・復帰を行います。 |
gca = |
General call addressの設定。 (1=アクティブ) |
|
・有料のアドオン・ライブラリが必要です。
△ 動作未確認
|
CONFIG USI |
一覧へ戻る |
ハードウェアUSIを設定します。
書式 |
Config Usi = UsiMode , Mode = Mode
Config Usi = UsiMode , Address = I2cAdr |
注釈 |
UsiMode = |
Twimaster − USIをTWIマスター・モードで設定します。
このモードは、割り込みを使用しません。 |
Twislave − USIをTWIスレーブ・モードで設定します。
USIは、バック・グラウンドの割り込みモードで動作します。 |
Mode = |
Normal − クロック周波数を100KHzに設定。
Fast − クロック周波数を400KHzに設定。
USIをマスター・モードで使用することのみを目的としています。 |
I2cAdr = |
I2C / TWIの8bitスレーブ・アドレス。 (8ビットのアドレス表記)
このアドレスは、USIをスレーブとして使用する場合にのみ必要です。 |
○TWIマスターモード
・Config Usi = Twimaster は、BASCOM製品版に含まれるライブラリ[i2c_USI.LBX]が必要です。
・USIがTWI / I2Cモードで使用される場合、SCLとSDAにプルアップ抵抗が必要です。
・SCLおよびSDAピンを自由に選択することはできません。
・固定のSCLおよびSDAピンを使用する必要があります。
・マスター・モードでは変数を必要とせず、使用することもありません。
・また、割り込みも使用しません。
○TWIスレーブモード
・Config Usi = Twislave は、有料アドオンであるi2cスレーブ・アドオンのライブラリ[i2c_usi_slave.lib]
が必要です。
・USIがTWI / I2Cモードで使用される場合、SCLとSDAにプルアップ抵抗が必要です。
・SCLおよびSDAピンを自由に選択することはできません。
・固定のSCLおよびSDAピンを使用する必要があります。
・変数TWI_USI_OVS、TWI_slaveAddress、Twi、Twi_btr、およびTwi_btwは、コンパイラによって
作成されます。 (これらはすべてバイトです)
・USI割り込みは可能ですが、ENABLE INTERRUPTSを使用してグローバルな割り込みを有効に
する必要があります。
・USIスレーブのコードは、割り込み処理として実行されています。
・USIの割り込みがあるたびに、スレーブのコードが実行されます。
・あなたのBASICコードは、いくつかのイベントで低レベルのスレーブコードから呼び出されます。
・スレーブのアプリケーションに、これらのラベルをすべて含める必要があります。
・これらのすべてのサブルーチンにコードを書く必要はありません。
|
(例) I2C-EEPROMの読み出し |
|
config usi = twimaster , mode = fast |
' USIをTWIマスター・モードで設定する。 |
i2cinit |
' I2CバスのSCL/SDAラインを初期化する。 |
I2cstart |
' [スタート・コンディション] の状態にする。 |
I2cwbyte Slvadr_w |
' 8bitスレーブ・アドレス(書き込み)を送信。 |
I2cwbyte Eepadr |
' EEPROMアドレスを送信。 |
i2crepstart |
' [再スタート] の状態にする。 |
I2cwbyte Slvadr_r |
' 8bitスレーブ・アドレス(読み出し)を送信。 |
I2crbyte Value1 , Ack |
' データを読み出す。 |
I2crbyte Value2 , Nack |
' データを読み出す。 |
I2cstop |
' [ストップ・コンディション] の状態にする。 |
|
|
|