001-45841_EzI2Cs.pdf

EzI2C スレーブ データシート EzI2Cs V 1.2
001-67096 Rev. **
EzI2C Slave
Copyright © 2008-2011 Cypress Semiconductor Corporation. All Rights Reserved.
API メモリ
(バイト数)
PSoC® ブロック
リソース
CapSense®
I2C/SPI
コンパレー
タ
タイマ
フラッ
シュ
RAM
センサー当
たりのピン
数
CY8C20x66, CY8C20x36, CY8C20336AN, CY8C20436AN, CY8C20636AN, CY8C20x46, CY8C20x96,
CY7C643/4/5xx, CY7C60413, CY7C60424, CY7C6053x, CYONS2010, CYONS2011, CYONSFN2051,
CYONSFN2053, CYONSFN2061, CYONSFN2151, CYONSFN2161, CYONSFN2162, CY8CTST200,
CY8CTMG2xx, CY8CTMA30xx
RAM のリード / ライト
バッファ
–
1
–
–
264
6
2
ROM バッファ サポート –
用
1
–
–
379
6
2
機能および概要
„
„
„
„
„
業界標準の フィリップス社 I2C バス互換インターフェイス
一般的な I2C EEPROM インターフェイスをエミュレート
2 つのピン (SDA および SCL) のみで I2C バスへのインターフェイスを実現
100/400 kbps の標準データ レート
ユーザ プログラミングを最小限に抑える高レベル API
EzI2C ユーザ モジュールは、I2C レジスタ ベースのスレーブ デバイスを実装します。I2C バスは、
Philips® (現 NXP)が開発した業界標準の 2 線式ハードウェアインターフェースです。マスタは、I2C
バスですべての通信を開始し、すべてのスレーブのデバイスのためにクロックを提供します。 EzI2C ユ
ーザ モジュールは、400 kbps までの速度で、標準モードをサポートします。このモジュールでは、デジ
タルまたはアナログ PSoC ブロックは消費しません。 EzI2C ユーザ モジュールは、同じバスでの複数デ
バイスと互換性を持ちます。
Cypress Semiconductor Corporation
Document Number: 001-67096 Rev. **
•
198 Champion Court
•
San Jose, CA 95134-1709
•
408-943-2600
Revised February 1, 2011
[+] Feedback
EzI2C Slave
Figure 1.
I2C のブロック図
機能説明
EzI2C ユーザ モジュールは、PSoC Designer で提供されている I2CHW ユーザ モジュールとは異なるア
プローチを取ります。 このユーザ モジュールは、1 つまたは 2 つの I2C アドレスを持つ I2C スレーブ構
成のみをサポートします。 最初の I2C アドレスは、常に RAM が割り当てられた領域で、オプションの 2
つ目の I2C アドレスは ROM 領域にアクセスします。2 つ目の I2C アドレスは、RAM の I2C アドレスと
0x40 の論理和です。 例えば、0x15 の I2C アドレスを選択すると、RAM 領域の I2C アドレスが 0x15、
オプションの ROM I2C アドレスが 0x55 となります。
I2C ハードウェアが割り込み駆動であるため、このユーザ モジュールで、グローバルな割り込みを有効
にする必要があります。このユーザ モジュールに割り込みが必要となる場合でも、ユーザのコードは
ISR ( 割り込みサービス ルーチン ) にコードを追加する必要はありません。モジュールは、ユーザコー
ドから独立してすべての割り込み ( データ転送 ) を担います。 ただし、このインターフェイスに割り当
てられたメモリ バッファは、ユーザのアプリケーションと I2C マスタ間のシンプルなデュアル メモリの
ように見えます。
必要な場合は、データ構造でセマフォとコマンドの位置を定義して、マスタとこのスレーブ間でより高
レベルのインターフェイスを作成できます。
Document Number: 001-67096 Rev. **
Page 2 of 18
[+] Feedback
EzI2C Slave
RAM 領域インターフェイス
I2C マスタへのインターフェイスは、一般的な 256 バイトの I2C EEPROM へのインターフェイスとよく
似ています。 PSoC API は、シンプルな変数、アレイ、または構造として定義された RAM として扱われ
ます。 ある意味では、これは、ユーザのプログラムと I2C バス上の I2C マスタ間の共有 RAM インター
フェイスのように動作します。API を使うと、I2C マスタにデータ構造を公開することができます。 ユー
ザ モジュールは、I2C マスタが RAM の特定の領域にアクセスすることだけを許可し、その領域外での
読み取りや書き込みを防止します。 I2C インターフェイスには、単一の変数、値のアレイ、構造といっ
たデータを公開することができます。ここで必要なのは、初期化される際、変数またはデータ構造の始
まりへのポインタのみです。 以下の図を参照してください。
Figure 2.
RAM 領域インターフェイス
例えば、ユーザはこの構成を作成できます。
struct I2C_Regs {
BYTE bStat;
BYTE bCmd;
int iVolts;
char cStr[6];
} MyI2C_Regs;
// Example I2C interface structure
// Read only string
この構造には、メモリに内でポインタで参照できれば、任意の名前を持つ変数のグループを含めること
ができます。 インターフェイス (I2C マスタ ) は、バイトのアレイとしてのみこれを見るため、定義され
た領域外のメモリにはアクセスできません。前述の構造例を使うと、供給される API は、I2C インター
フェイスにデータ構造を公開するために使用されます。最初のパラメータが I2C に公開する RAM のサ
イズを設定します ( この例では構造全体 )。2 つ目のパラメータは、読み取り / 書き込み領域でバイト数
を設定することで、読み取り / 書き込み領域と読み取り専用領域の境界を設定します。読み取り / 書き込
Document Number: 001-67096 Rev. **
Page 3 of 18
[+] Feedback
EzI2C Slave
み領域が最初で、次に読み取り専用領域が続きます。 この場合、最初の 4 バイトが I2C マスタに書き込
まれ、すべてのバイトが I2C によって読み取られます。3 つ目のパラメータはデータへのポインタです。
EzI2Cs_SetRamBuffer(sizeof(MyI2C_Regs), 4,(BYTE *) &MyI2C_Regs);
以下の例では、15 バイトのアレイが作成され、I2C インターフェイスに公開されます。 アレイの最初の
8 バイトは読み取り / 書き込み、残りの 7 バイトは読み取り専用です。
char theArray[15];
EzI2Cs_SetRamBuffer(15, 8, (BYTE *) theArray);
以下の例は、単一の整数 (2 バイト ) のみが公開される、非常に単純な例です。両バイトとも、I2C マス
タによる読み取りと書き込みが可能です。
int iRegister;
EzI2Cs_SetRamBuffer(2, 2, (BYTE *) (&iRegister);
ROM 領域インターフェイス ( オプション )
ROM インターフェイスは、読み取り専用であるという以外は、RAM インターフェイスとほぼ同じで
す。以下の例で見られるように、SetRomBuffer 関数は、SetRamBuffer 関数と似ています。 この例で
は、データ領域は単純な定数文字列 ( 長さは 13 バイト ) で、終端 NULL (0x00) 文字が続きます。
Const BYTE bROM_Regs[13] = "I2C ROM AREA";
EZI2Cs_SetRomBuffer(13, (const BYTE *)bROM_Regs);
前述のように、ROM 領域は独自の I2C アドレスを持ちます。 このアドレスは、0x40 で論理和した RAM
領域アドレスです。 メイン RAM 領域のアドレスが 0x15 である場合は、ROM 領域にアクセスする I2C
アドレスは、0x55 となります。次の図は、この例がメモリでどのように表現されるかを示しています。
Figure 3.
ROM 領域インターフェイス
Document Number: 001-67096 Rev. **
Page 4 of 18
[+] Feedback
EzI2C Slave
外部マスタから見たインターフェイス
EzI2C ユーザ モジュールは、RAM 領域での基本的な読み取りおよび書き込み、ROM 領域での読み取り
専用動作をサポートします。 RAM および ROM 領域インターフェイスは、書き込み動作の最初のデータ
バイトで設定され、個別のデータ ポインタが含まれます。ROM 領域でも、データ ポイントを設定す
る、1 バイトの書き込みを受け入れます。1 または複数の RAM バイトが書き込まれる場合は、最初のデ
ータ バイトは常にデータ ポインタです。データ ポインタに続くバイトが、データ ポインタ バイトでポ
イントされる位置に書き込まれます。3 番目のバイト (2 番目のデータ バイト ) は、ポインタ + 1 に書き
込まれます。 このデータ ポインタは、各バイトの読み取りまたは書き込みで増分されますが、新しい読
み取り動作の開始時に、書き込まれる最初の値にリセットされます。新しい読み取り動作は、データ ポ
インタでポイントされている位置でデータの読み取りを開始します。
たとえば、データ ポインタが 4 に設定されている場合は、読み取り位置が 4 でのデータ読み取りを開始
し、データの終わりまたはホストが読み取り動作を終えるまで、連続して実行されます。たとえば、デ
ータ ポインタが 4 に設定されている場合は、各読み取り動作はデータ ポインタを 4 にリセットし、そ
の位置から連続して読み取りを行います。 これは、単一または複数のいずれの読み取り動作が実行され
る場合でも同じです。 データ ポインタは、新しい書き込み動作が開始されるまで変更されません。
I2C マスタが、SetRamBuffer() 関数で指定されている領域を超えるデータの書き込みを試みると、デー
タが破棄されるため、RAM 内部または指定された RAM 領域外には影響を与えません。 データは許可さ
れている範囲外から読み取ることはできません。 マスタから、許可されている範囲外からの読み取りが
リクエストされると、無効の戻り値が返されます。
以下の図は、データ書き込み、データ ポインタ書き込み、データ読み取り動作のバス通信を示していま
す。データ書き込み動作は、データ ポインタを常に書き換えるので注意が必要です。
Figure 4.
x バイトの I2C スレーブへの書き込み・読み出し
リセット時または電源オン時に、EzI2C ユーザ モジュールが構成され、API が供給されますが、リソー
スは EzI2Cs_Start() 関数を使って、明示的にオンにする必要があります。
I2C リソースは、バイト - バイトでデータ転送をサポートします。 各アドレスまたはデータ送受信の終わ
りで、ステータスが報告されるか、指定された割り込みがトリガされます。ステータスの報告と割り込
Document Number: 001-67096 Rev. **
Page 5 of 18
[+] Feedback
EzI2C Slave
みの生成は、データ転送の方向およびハードウェアで検出される I2C バスの状態に依存します。 割り込
みは、バイトの完了時またはバスのエラー検出時に発生するよう構成できます。
すべての I2C トランザクションは、開始、アドレス、R/W 方向、データ、終端で構成されます。I2C ス
レーブの場合は、受信データの 8th ビットの後で割り込みが発生します。この時点で、受信デバイス
は、アドレスまたはデータ受信時、受信バイトの認識 (ack) または非認識 (nak) を決定する必要がありま
す。次に、受信デバイスが I2C_SCR レジスタに適切な制御ビットを書き込み、ack/nak ステータスを
I2C リソースに伝えます。I2C_SCR レジスタへの書き込みは、バスをインストールし、ack/nak ステー
タスをバス上に配置して次の受信データをシフトします。トランスミッタの 2 つ目の場合では、外部受
信デバイスが ack または nak を提供した後で割り込みが発生します。このビットのステータスを決定す
るため、I2C_SCR が読み取られる場合があります。 トランスミッタでは、データが I2C_DR レジスタに
ロードされ、次の送信をトリガし、I2C_SCR レジスタが再び書き込まれます。
I2C バスの詳細な説明とここでの実装は、NXP 社のウェブサイトに完全な I2C の仕様として掲載されて
います。また、PSoC Designer とともに提供されているデバイス データシートにも記載されています。
設計について
メイン オシレータは、どのようなクロック速度にでも設定できます。 データのスループットは、プロセ
ッサの速度に影響されることがありますが、バイトごとのデータ転送は、指定された I2C 速度で動作し
ます。
ダイナミックな再構成
EzI2C リソースをダイナミックにロードされるまたはロードされないオーバーレイに統合しないでくだ
さい。EzI2C リソースは、ベース コンフィグレーションの一部としてのみ配置します。 EzI2C ブロッ
クの動作は、動作要件により変更できますが、ダイナミック リコンフィグレーションの一部としてリ
ソースを削除しようとすると、外部 I2C デバイスに逆効果を与えることがあります。また、I2C 関数を
無効にするようピンが誤ってリコンフィグレーションされる可能性があります。 コンフィグレーション
間のスイッチングでは、この可能性を避けるよう注意してください。
DC 電気的特性と AC 電気的特性
I2C インターフェースの電気的特性については、PSoC デバイスのデバイス データシートを参照してく
ださい。
回路図で示されているように、I2C バスには外部プルアップ レジスタが必要です。プルアップ レジスタ
(RP) は、供給電圧、クロック速度、バス上のキャパシタンスによって決定されます。 出力ステージで
は、すべてのデバイス ( マスタまたはスレーブ ) で、最小シンク電流を VOLmax = 0.4V で 3 mA 以上にし
てください。 これは、5V システムの最小プルアップ レジスタ値をおよそ 1.5 kΩ に制限します。 RP の
最大値は、バス上のキャパシタンスとクロック速度によって異なります。 150 pF のバス上にキャパシタ
ンスを持つ 5V のシステムでは、プルアップ レジスタは、6 kΩ を超えません。 I2C バスの仕様について
詳しくは、NXP のウェブサイト (www.nxp.com) をご覧ください。
Note
I2C コンポーネントをサイプレスまたはサブライセンスを持つ関連業者から購入すると、Philips
I2C の特許権の下でライセンスが付与されます。このライセンスにより、システムが NXP の指定
する I2C の標準仕様を満たす限り、I2C システムでこれらのコンポーネントを使用できます。
Document Number: 001-67096 Rev. **
Page 6 of 18
[+] Feedback
EzI2C Slave
配置
EzI2C ユーザ モジュールでは、デジタルまたはアナログ PSoC ブロックは必要ありません。 配置に関し
て制限はありません。 I2C モジュールは、専用の PSoC リソース ブロックと割り込みを使用するため、
I2C モジュールを複数配置することはできません。
パラメータおよびリソース
Slave_Addr
I2C マスタによって使用される 7-bit スレーブ アドレスを選択し、スレーブを指定します。RAM レ
ジスタのみを使用した場合、有効な選択肢は、0 ~ 127 (十進数)です。 ROM レジスタが有効に
なっている場合は、0 〜 63 のアドレスのみが有効です。これは、ROM レジスタのスペースが、
RAM アドレス + 64 ( 十進数では 64 〜 127) であるためです。
Address_Type
アドレスがスタティックかダイナミックかを選択します。スタティックに設定すると、I2C アドレ
スを変更することができなくなりますが、RAM を 1 バイト節約できます。このオプションをダイ
ナミックに選択すると、ファームウェアがアドレスをいつでも変更できるようになります。 このオ
プションは、I2C アドレスの LSB を設定するために外部レジスタまたはディップ スイッチが使用
される場合の用途では一般的です。
ROM_Registers
RAM 領域は常に有効になりますが、ROM 領域へのアクセスを許可する 2 つ目のアドレスを有効に
できます。ROM アドレスを使用する場合はこのパラメータのオプションを有効にし、必要ない場
合は無効にしてください。この 2 つ目のアドレスは、0x40 との論理和のベース アドレスです。
HW Addr Rec
このパラメータは、ハードウェアの I2C スレーブアドレス認知機能を有効・無効にします。また、
ROM/RAM 使用の低減と I2CISR 実行時間を許可します。
I2C_Clock
このパラメータは、このスレーブで使用されるクロック速度を選択します。オプションは、50
kHz、100 kHz、400 kHz です。 400 kHz の速度は、IMO (SysClk) が 12 MHz の場合のみ使用しま
す。
I2C_Pin
I2C 信号との使用では、ポート 1 からピンを選択してください。PSoC Designer が自動で行うた
め、ピンの正しいドライブ モードを選択する必要がありません。これにより、I2C クロックとデー
タ信号を P1[5] - P1[7] または P1[1] - P1[0] に配置できます。
Document Number: 001-67096 Rev. **
Page 7 of 18
[+] Feedback
EzI2C Slave
アプリケーション プログラミング インタフェース
2 以上のバイト長を持つ変数のデータ整合性を保証するには、コードでこの変数を変更する前に、
EzI2Cs_bBusy_Flag 変数をチェックしてください。例:
if(!(EzI2Cs_bBusy_Flag == EzI2Cs_I2C_BUSY_RAM_READ))
{
data.wData1++; //safely increment some 2 byte variable
}
EzI2Cs_bBusy_Flag 変数は ISR で自動的に更新され、以下の事前定義値を持ちます。
Table 1.
EzI2Cs_bBusy_Flag 変数の事前定義値
シンボル名
値
説明
I2C_FREE
0x00
現在のトランザクションはありません。
I2C_BUSY_RAM_READ
0x01
RAM の読み取りトランザクションが進行中です。
I2C_BUSY_RAM_WRITE
0x03
RAM の書き込みトランザクションが進行中です。
I2C_BUSY_ROM_READ
0x01
ROM の読み取りトランザクションが進行中です。
I2C_BUSY_ROM_WRITE
0x03
ROM の書き込みトランザクションが進行中です。
EzI2Cs_Start
説明
I2C スレーブと割り込みを有効にします。 この関数を呼び出す前に、必要な
EzI2Cs_SetRamBuffer() 関数を呼び出します。
C プロトタイプ
void EzI2Cs_Start(void);
アセンブラ
lcall EzI2Cs_Start
パラメータ
なし
戻り値
なし
副作用
この関数によって、A および X レジスタが変更される場合があります。
Document Number: 001-67096 Rev. **
Page 8 of 18
[+] Feedback
EzI2C Slave
EzI2Cs_Stop
説明
I2C の割り込みを無効にして、EzI2C を無効にします。
C プロトタイプ
void
EzI2Cs_Stop(void);
アセンブラ
lcall EzI2Cs_Stop
パラメータ
なし
戻り値
なし
副作用
この関数によって、A および X レジスタが変更される場合があります。
EzI2Cs_DisableSlave
説明
I2C の割り込みを無効にせずに、EzI2C を無効にします。
C プロトタイプ
void
EzI2Cs_DisableSlave(void);
アセンブラ
lcall EzI2Cs_DisableSlave
パラメータ
なし
戻り値
なし
副作用
この関数によって、A および X レジスタが変更される場合があります。
Document Number: 001-67096 Rev. **
Page 9 of 18
[+] Feedback
EzI2C Slave
EzI2Cs_SetAddr
説明
この関数は、EzI2C ユーザ モジュールによって認識されるアドレスを設定します。 このコマンド
は、Address_Type がパラメータで 「Dynamic ( ダイナミック )」に設定されている場合にのみ有効
です。 この関数は、EzI2Cs_Start() 関数の後でのみ呼び出します。 これは、開始関数がデフォルト
のアドレスを設定し、この関数がこのアドレスを上書きするためです。この関数はオプションで、
デフォルトのアドレスを変更しない限り必要ありません。
C プロトタイプ
void EzI2Cs_SetAddr(BYTE bAddr);
アセンブラ
mov
A,0x05
lcall EzI2Cs_SetAddr
; Set I2C slave address to 0x05
パラメータ
BYTE char:スレーブのアドレスは、1 〜 127 です。
戻り値
なし
副作用
この関数によって、A および X レジスタが変更される場合があります。
EzI2Cs_GetActivity
説明
この関数は、最後にこの関数が呼び出されてから、I2C の読み取りまたは書き込みが発生した場合
に、ゼロ以外の値を返します。このアクティビティフラグは関数呼び出しの最後にゼロにリセット
されます。シンボル定数を C とアセンブリで準備されています。その値は次のように指定されてい
ます。
記号
値
意味
EzI2Cs_ANY_ACTIVITY
0x80
発生した書き取り周期または読み込
み周期
EzI2Cs_READ_ACTIVITY
0x20
発生した読み込み周期
EzI2Cs_WRITE_ACTIVITY
0x10
発生した書き取り周期
C プロトタイプ
BYTE EzI2Cs_GetActivity(void);
アセンブラ
lcall EzI2Cs_GetActivity
; Return value in A
パラメータ
なし
Document Number: 001-67096 Rev. **
Page 10 of 18
[+] Feedback
EzI2C Slave
戻り値
I2C の読み取りまたは書き込みが発生した場合に、ゼロ以外の値を返します。最後にこの関数が呼
び出されてから動作が実行されなかった場合は、ゼロを返します。
副作用
この関数によって、A および X レジスタが変更される場合があります。
EzI2Cs_GetAddr
説明
この関数は、この I2C スレーブの現在のアドレスを返します。 この関数はオプションで、通常、ア
プリケーションが現在またはデフォルトのアドレスを決定しなければならない場合にのみ必要で
す。
C プロトタイプ
BYTE EzI2Cs_GetAddr(void);
アセンブラ
lcall EzI2Cs_GetAddr
; Return value in A
パラメータ
なし
戻り値
この I2C スレーブの現在の I2C アドレスを返します。
副作用
この関数によって、A および X レジスタが変更される場合があります。
EzI2Cs_EnableInt
説明
開始条件を検出できるように I2C 割り込みをイネーブルにします。必ずマクロ M8C_EnableGInt を
使用してグローバル割り込みイネーブル関数を呼び出してください。M8C_EnableGInt. この関数
は、EzI2Cs_Start 関数が呼び出される場合は必要ありません。 デフォルトで、この関数は、保留中
の割り込みをクリアします。 保留中の割り込みをクリアしないようにするには、「ResumeInt 関
数」を参照してください。
C プロトタイプ
void
EzI2Cs_EnableInt(void);
アセンブラ
lcall EzI2Cs_EnableInt
パラメータ
なし
戻り値
なし
Document Number: 001-67096 Rev. **
Page 11 of 18
[+] Feedback
EzI2C Slave
副作用
この関数によって、A および X レジスタが変更される場合があります。
EzI2Cs_ResumeInt
説明
開始条件を検出できるように I2C 割り込みをイネーブルにします。この関数は、割り込みを有効に
する前に、保留中の割り込みをクリアしません。 必ずマクロ M8C_EnableGInt を使用してグローバ
ル割り込みイネーブル関数を呼び出してください。M8C_EnableGInt. この関数は、EzI2Cs_Start 関
数が呼び出される場合は必要ありません。
C プロトタイプ
void
EzI2Cs_ResumeInt(void);
アセンブラ
lcall EzI2Cs_ResumeInt
パラメータ
なし
戻り値
なし
副作用
この関数によって、A および X レジスタが変更される場合があります。
EzI2Cs_DisableInt
説明
SDA 割り込みを無効にして、I2C スレーブを無効にします。EzI2Cs_Stop. と同じ処理を実行しま
す。
C プロトタイプ
void
EzI2Cs_DisableInt(void);
アセンブラ
lcall EzI2Cs_DisableInt
パラメータ
なし
戻り値
なし
副作用
この関数によって、A および X レジスタが変更される場合があります。
副作用
この関数によって、A および X レジスタが変更される場合があります。
Document Number: 001-67096 Rev. **
Page 12 of 18
[+] Feedback
EzI2C Slave
EzI2Cs_SetRamBuffer
説明
この関数は、I2C マスタに公開される RAM バッファ (255 バイトまで ) の位置とサイズを設定しま
す。この関数は必須で、EzI2Cs_Start(). を呼び出す前に呼び出します。
C プロトタイプ
void EzI2Cs_SetRamBuffer(BYTE bSize, BYTE bRWboundry, (BYTE *)pAddr);
アセンブラ
lcall EzI2Cs_SetRamBuffer
パラメータ
BYTE bSize:I2C マスタに公開されるデータ構造のサイズ。bSize の最小値は 1、最大値は 255 で
す。BYTE bRWboundry:先頭から始まる、書き込み可能な位置のサイズ。 正しい動作を実行する
には、この値が常に bSize 以下となる必要があります。 BYTE * pAddr:データ構造へのポインタ。
戻り値
なし
副作用
この関数によって、A および X レジスタが変更される場合があります。bRWboundry が bSize より
も大きい値に設定されると、bRWboundry 全体のサイズが書き込み可能になります。 bSize を 0 の
無効値に設定すると、I2C ホストが未定義のメモリ位置に書き込めるようになります。
EzI2Cs_SetRomBuffer
説明
この関数は、I2C マスタに公開される ROM バッファ (255 バイトまで ) の位置とサイズを設定しま
す。ROM を使用する場合、この関数は、EzI2Cs_Start 関数を有効にする前に必要になります。
C プロトタイプ
void EzI2Cs_SetRomBuffer(BYTE bSize,(const BYTE *)pAddr);
アセンブラ
lcall EzI2Cs_SetRomBuffer
パラメータ
BYTE bSize:I2C マスタに公開されるデータ構造のサイズ。BYTE * pAddr:Flash ROM でのデー
タ構造へのポインタ。
戻り値
なし
副作用
この関数によって、A および X レジスタが変更される場合があります。
Document Number: 001-67096 Rev. **
Page 13 of 18
[+] Feedback
EzI2C Slave
ファームウェア ソースコードの例
C コードの例
//**********************************************************
// Example code to demonstrate the use of the EzI2Cs UM
//
// This code sets up the EzI2Cs slave to expose both
// a RAM and a ROM data structure. The RAM structure is
// addressed at I2C address 0x05, and the ROM structure
// is at I2C address 0x45.
//
// * The instance name of the EzI2Cs User Module is "EzI2Cs".
// * The "Address_Type" parameter is set to "Dynamic"
// * The "ROM_Registers" parameter is set to "Enable"
//
// NOTE: to guarantee data integrity of variables with length 2 or more
// bytes check the EzI2Cs_bBusy_Flag variable before changing values of such
// variables.//************************************************************
#include <m8c.h>
#include "PSoCAPI.h"
struct I2C_Regs {
BYTE bStat;
BYTE bCmd;
int iVolts;
char cStr[6];
} MyI2C_Regs;
// Part specific constants and macros
// PSoC API definitions for all User Modules
// Example I2C interface structure
// Read only string
const BYTE DESC[] = "Hello I2C Master";
void main(void)
{
// Set up RAM buffer
EzI2Cs_SetRamBuffer(sizeof(MyI2C_Regs), 4, (BYTE *) &MyI2C_Regs);
EzI2Cs_SetRomBuffer(sizeof(DESC), DESC);
// Set up ROM buffer
M8C_EnableGInt ;
// Turn on interrupts
EzI2Cs_Start();
EzI2Cs_SetAddr(5);
// Turn on I2C
// Change address to 5
while(1) {
// Place user code here to update and read structure data.
}
}
Document Number: 001-67096 Rev. **
Page 14 of 18
[+] Feedback
EzI2C Slave
ASM コードの例
;-----------------------------------------------------------------------; Example code to demonstrate the use of the ExI2Cs UM
;
; This code sets up the EzI2Cs slave to expose both
; a RAM and a ROM data structure. The RAM structure is
; addressed at I2C address 0x05, and the ROM structure
; is at I2C address 0x45.
;
; * The instance name of the EzI2Cs User Module is "EzI2Cs".
; * The "Address_Type" parameter is set to "Dynamic".
; * The "ROM_Registers" parameter is set to "Enable".
;
; NOTE: to guarantee data integrity of variables with length 2 or more
; bytes check the EzI2Cs_bBusy_Flag variable before changing values of such
; variables.
;-----------------------------------------------------------------------include "m8c.inc"
include "memory.inc"
include "PSoCAPI.inc"
; part specific constants and macros
; Constants & macros for SMM/LMM and Compiler
; PSoC API definitions for all User Modules
area bss (RAM, REL, CON)
RAM_BUF_SIZE:
equ 10
BUF_RW_SIZE:
equ
5
I2C_RAM_Buf:
blk
; Allocate Variables & define constants
; Top of ramp value
; Only first five bytes writable from I2C Master
RAM_BUF_SIZE ; Reserve RAM for I2C buffer
area text (ROM, REL, CON)
.LITERAL
I2C_ROM_BUF:
; I2C ROM Buffer
DB 11h, 22h, 33h, 44h, 55h, 66h, 77h, 88h
.ENDLITERAL
ROM_BUF_SIZE:
equ
8
export _main
_main:
; Set RAM Buffer
mov
A,>I2C_RAM_Buf
push
A
mov
A,<I2C_RAM_Buf
push
A
mov
A,BUF_RW_SIZE
push
A
mov
A,RAM_BUF_SIZE
push
A
call
EzI2Cs_SetRamBuffer
ADD
SP,-4
; Set ROM Buffer
mov
A,>I2C_ROM_BUF
push
A
mov
A,<I2C_ROM_BUF
Document Number: 001-67096 Rev. **
; Save MSB of RAM buffer address
; Save LSB of RAM buffer address
; Save RW size param
; Save I2C buffer size
; Reset Stack
; Save MSB of ROM buffer address
; Save LSB of ROM buffer address
Page 15 of 18
[+] Feedback
EzI2C Slave
push
mov
push
call
add
A
A,ROM_BUF_SIZE
A
EzI2Cs_SetRomBuffer
SP,-3
; Save ROM buffer size
; Reset Stack
M8C_EnableGInt
; Enable Global Interrupts
call
mov
call
; Start and enable IRQ
; Set address to 5
EzI2Cs_Start
A,5
EzI2Cs_SetAddr
.Loop:
;; User Code goes here
jmp
.Loop
コンフィグレーション レジスタ
ここでは、EzI2C ユーザ モジュールで使用または変更される PSoC リソース レジスタについて説明し
ます。EzI2C ユーザ モジュールを使用する際に、これらのレジスタの使用は必須ではありませんが、リ
ファレンスとして提供されています。
Table 2.
ビット
値
リソース I2C_CFG: バンク 0 reg[D6] 設定レジスタ
7
Reserved
(予備)
6
PinSelect
(ピン選
択)
5
4
3
2
1
Bus Error Stop IE
Clock (ク Clock (ク 0
IE (バス (停止 IE) ロック)
ロック)
エラー IE)
Rate[1]
Rate[0]
0
Enable
Slave (ス
レーブのイ
ネーブル
化)
ピン選択:P1[5] - P1[7] または P1[1] - P1[0] から、SCL および SDA のを選択します。
バス エラー割り込みの有効化:バス エラーでの I2C 割り込みの生成を有効にします。
ストップ エラー割り込みの有効化:I2C 停止状態で I2C 割り込みの生成を有効にします。
クロック レート [1,0]:有効な 3 つのクロック レート、50、100、400 kbps から選択します。
スレーブの有効化:バス スレーブとして、I2C ハードウェア ブロックを有効にします。
Table 3.
ビット
値
リソース I2C_SCR: バンク 0 reg[D7] ステータス制御レジスタ
7
6
Bus Error なし
(バス エラ
ー)
5
4
Stop
ACK out
Status (停 (ACK 出
止ステータ 力)
ス)
3
Address
(アドレ
ス)
2
Transmit
(送信)
1
0
Last Recd
Bit (LRB)
(最後に受
信したビッ
ト)
Byte
Complete
(バイト完
了)
バス エラー:バス エラー状態の検出を示します。
停止ステータス:I2C 停止状態の検出を示します。
Document Number: 001-67096 Rev. **
Page 16 of 18
[+] Feedback
EzI2C Slave
ACK 出力 : I2C ブロックが、受信バイトを ACK (承認する)(1)か、または NAK (承認しない)(0)
ように指示します。
アドレス:受信または送信バイトがアドレスです。
最後の受信ビット (LRB):送信シーケンスで最後に受信したビット ( ビット 9) の値、送信先デバイスか
らの Ack/Nak ステータス。
バイト完了 : 8 バス ビットが受信されました。受信モードの場合、バスは ACK 応答/ NAK 応答を待っ
てストールします。 送信モードでは、Ack Nac も受信され (SRB を参照 )、バスの次の動作がストールし
ます。
Table 4.
ビット
値
リソース I2C_DR: バンク 0 reg[D8] データ レジスタ
7
6
5
4
3
2
1
0
Data (データ)
受信または送信データ。データを送信するには、I2C_SCR レジスタに書き込む前にこのレジスタをロー
ドする必要があります。受信したデータは、このレジスタから読み取られ、受信内容にはアドレスやデ
ータが含まれる場合があります。
Document Number: 001-67096 Rev. **
Page 17 of 18
[+] Feedback
EzI2C Slave
バージョン ヒストリー
バージョン
1.2
著者
DHA
説明
他のユーザ モジュールで設定された該当ピンの駆動モードを破損させるため、「I2C ピ
ン」パラメータのデフォルト ピン値は削除しました。
SCL が低でスタックする状態を防止するよう更新されました。
起動の機能が次のように変更されました。
1. ユーザ モジュール ピンの初期のオープン - ドレイン低ドライブ モードが HI-Z アナ
ログに変更されました。
2. 2C ブロックを有効にしました。
3. 遅延 5 nop 命令を追加しました。
4. 初期の I2C ピンを復元しました。
*.h および *.inc ファイルに 「Export EzI2C_StopSlave API」が追加されました。
シャドー レジスタを通して出力ピンを更新する機能が追加されました。
RAM ページング管理が更新されました。
Start API に RAM および ROM オフセット ポインタ初期化が追加されました。
ハードウェアアドレス認知機能が追加されました。
Note
PSoC Designer 5.1 は、すべてのユーザ モジュール データシートにおいてバージョン ヒストリ
ーを導入しています。 このセクションでは、ユーザ モジュールの過去のバージョンと現在のバー
ジョンとの違いに関して高度な解説を掲載しています。
Document Number: 001-67096 Rev. **
Revised February 1, 2011
Page 18 of 18
Copyright © 2008-2011 Cypress Semiconductor Corporation. The information contained herein is subject to change without notice. Cypress Semiconductor Corporation assumes no responsibility
for the use of any circuitry other than circuitry embodied in a Cypress product. Nor does it convey or imply any license under patent or other rights. Cypress products are not warranted nor intended
to be used for medical, life support, life saving, critical control or safety applications, unless pursuant to an express written agreement with Cypress. Furthermore, Cypress does not authorize its
products for use as critical components in life-support systems where a malfunction or failure may reasonably be expected to result in significant injury to the user. The inclusion of Cypress products
in life-support systems application implies that the manufacturer assumes all risk of such use and in doing so indemnifies Cypress against all charges.
PSoC Designer ™ and Programmable System-on-Chip ™ are trademarks and PSoC® is a registered trademark of Cypress Semiconductor Corp. All other trademarks or registered trademarks
referenced herein are property of the respective corporations.
Any Source Code (software and/or firmware) is owned by Cypress Semiconductor Corporation (Cypress) and is protected by and subject to worldwide patent protection (United States and foreign),
United States copyright laws and international treaty provisions. Cypress hereby grants to licensee a personal, non-exclusive, non-transferable license to copy, use, modify, create derivative works
of, and compile the Cypress Source Code and derivative works for the sole purpose of creating custom software and or firmware in support of licensee product to be used only in conjunction with
a Cypress integrated circuit as specified in the applicable agreement. Any reproduction, modification, translation, compilation, or representation of this Source Code except as specified above is
prohibited without the express written permission of Cypress.
Disclaimer: CYPRESS MAKES NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH REGARD TO THIS MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. Cypress reserves the right to make changes without further notice to the materials described herein. Cypress does not
assume any liability arising out of the application or use of any product or circuit described herein. Cypress does not authorize its products for use as critical components in life-support systems
where a malfunction or failure may reasonably be expected to result in significant injury to the user. The inclusion of Cypress' product in a life-support systems application implies that the manufacturer
assumes all risk of such use and in doing so indemnifies Cypress against all charges.
Use may be limited by and subject to the applicable Cypress software license agreement.
[+] Feedback