I2C-EEPROMを8051マイクロコントローラーとインターフェースする方法

問題を排除するために楽器を試してください





I2CまたはIICの略語という用語は 集積回路 そしてそれは私がCを二乗したように呼ばれます。 I2Cはシリアルコンピュータバスです 、以前はNXPセミコンダクターズによって発明され、フィリップスセミコンダクターズと呼ばれていました。 I2Cバスは、低速周辺集積回路をに接続するために使用されます マイクロコントローラーとプロセッサー 。 2006年には、I2Cプロトコルを実装するためにライセンス料は必要ありません。ただし、NXPセミコンダクターズによって割り当てられたI2Cスレーブアドレスを取得するには料金が必要です。

Texas Instruments、Siemens AG、NEC、Motorola、Intersil、STMicroelectronicsなどの一部の競合他社は、1990年代半ばに市場に適したI²C製品を発表しました。 1995年、SMBusはIntelによって定義されました。これは、プロトコルがより厳密であると述べているI²Cのサブグループです。 SMBusの主な目的は、相互運用性と堅牢性をサポートすることです。したがって、現在のI²CシステムにはSMBusのルールとポリシーが含まれており、最小限の再構成でI2CとSMBusの両方をサポートする場合があります。




I2Cバス

I2Cバス

インターフェイスI2Cバス-EEPROMと8051マイクロコントローラ

I2Cバスとは

I2cバスは、SDA(シリアルデータライン)とSCl(シリアルクロックライン)などの2つの双方向オープンドレインラインを使用し、これらは抵抗でプルアップされます。 I2Cバスは、マスターデバイスがスレーブデバイスとの通信を開始することを許可します。これら2つのデバイス間でデータが交換されます。使用される一般的な電圧は+ 3.3Vまたは+ 5Vですが、追加の電圧を使用するシステムも許可されます。



I2Cインターフェース

I2Cインターフェース

EEPROM

電気的に消去可能なプログラム可能なROM (EEPROM)はユーザーが変更可能なROMであり、通常よりも高い電圧を印加することで頻繁に取り外して再プログラムすることができます。 EEPROMは、コンピュータなどの電子デバイスで使用される一種の不揮発性メモリであり、電源を切ったときに保存する必要のある少量のデータを保存します。

8051スリッカーボード

8051 Slickerボードは、次の分野の技術系学生を支援するために特別に設計されています。 組み込みシステム 。このキットは、のすべての機能が 8051マイクロコントローラー おそらく学生によって使用されます。このストライカーボードは、シリアルポートを介して行われるISP(インシステムプログラミング)をサポートしています。このキットとNXPの8051は、速度8ビットマイクロコントローラーを取り巻く多くの設計のデバッグの進行をスムーズにするために提案されています。

I2Cのインターフェース– EEPROM

次の図は、I2C-EEPROMと8051マイクロコントローラのインターフェイスを示しています。ここで、I2Cはマスタースレーブプロトコルであり、クロックパルスとともにデータが含まれています。通常、マスターデバイスはクロックラインSCLを切り替えました。このラインは、I2Cバスで転送されるデータタイミングを命令します。クロックが動作しない限り、データは転送されません。すべてのスレーブは同じクロックSCLによって制御されます。


I2Cとのインターフェース-EEPROM

I2Cのインターフェース– EEPROM

I2Cバスはさまざまなデバイスをサポートします ここで、各デバイスは、LCDドライバー、メモリカード、マイクロコントローラー、または キーボードのインターフェース TxまたはRxとして動作できるのは、デバイスの機能によって異なります。コントローラは、I2Cプロトコルを介してEEPROMデバイスを制御するように設計されています。ここで、I2Cプロトコルはマスターデバイスとして機能し、EEPROMを調整し、スレーブとして機能します。 R / W操作は、アドレスAND / ORデータバスを構成する一連の制御信号を転送することによって熟練しています。これらの信号には、適切なクロック信号を使用する必要があります

インターフェイスI2Cバス-EEPROMと8051マイクロコントローラ

読み取り、書き込み、および消去を行う場合は、8051ストライカーボードのI2Cバスを使用してください。 I2バス-EEPROMとのインターフェース 8051マイクロコントローラーは非常にシンプルです 。このインターフェースの動作は、WRITEのような信号を送信し、その後にデータとアドレスバスを送信することです。この操作では、EEPROMを使用してデータを保存します。 8051キットでは、2つのEEPROMラインがI2C対応ドライバーによって規制されています。 SCLとSDAは、I2CベースのシリアルEEPROMICに接続されています。

インターフェイスI2Cバス-EEPROMと8051マイクロコントローラ

インターフェイスI2Cバス-EEPROMと8051マイクロコントローラ

SDAおよびSCLI2Cラインを使用することにより、EEPROMの読み取りおよび書き込み操作は8051 SlickerKitで実行されます。

I2Cのインターフェースは非常にシンプルで、EEPROMのすべてのデータの読み取り/書き込みに使用できます。遅延は、選択を変更するとすぐにループがどのように強化されるかによって異なります。

I2Cインターフェースのソースコード

#include
#include
#include

#define ACK 1
#define NO_ACK 0

unsigned char i
unsigned char EData [5]
unsignedcharデータ
void InitSerial(void)
void DelayMs(unsigned int)
void WriteI2C(unsigned char)
void Start(void)
void Stop(void)
void ReadBYTE(unsigned int)
void WriteBYTE(unsigned int)
unsigned char ReadI2C(bit)

sbit SCL = P2 ^ 0 // SCLピンに接続(クロック)
sbit SDA = P2 ^ 1 // SDAピンに接続(データ)

// —————————————
//メインプログラム
// —————————————
void main(void)
{{
InitSerial()//シリアルポートを初期化します
putchar(0x0C)//ハイパーターミナルをクリア
DelayMs(5)
WriteBYTE(0x0000)
WriteI2C( ‘A’)//ここにデータを書き込む
WriteI2C( ‘B’)
WriteI2C( ‘C’)
WriteI2C( ‘D’)
WriteI2C(「E」)
WriteI2C( ‘F’)
やめる()
DelayMs(10)

ReadBYTE(0x0000)
EData [0] = ReadI2C(NO_ACK)
EData [1] = ReadI2C(NO_ACK)
EData [2] = ReadI2C(NO_ACK)
EData [3] = ReadI2C(NO_ACK)
EData [4] = ReadI2C(NO_ACK)
EData [5] = ReadI2C(NO_ACK)

for(i = 0i<6i++)
{{
printf(“ value =%c n”、EData [i])//データを表示* /
DelayMs(100)
}

while(1)
}

// —————————————
//シリアルポートを初期化します
// —————————————
void InitSerial(void)
{{
SCON = 0x52 //シリアルポート制御を設定します
TMOD = 0x20 //ハードウェア(9600ボー@ 11.0592MHZ)
TH1 = 0xFD // TH1
TR1 = 1 //タイマー1オン
}

// ———————————-
// I2Cを開始します
// ———————————-
void Start(void)
{{
SDA = 1
SCL = 1
_button _()_ nop_()
SDA = 0
_button _()_ nop_()
SCL = 0
_button _()_ nop_()
}

// ———————————-
// I2Cを停止します
// ———————————-
void Stop(void)
{{
SDA = 0
_button _()_ nop_()
SCL = 1
_button _()_ nop_()
SDA = 1
}

// ———————————-
// I2Cを書く
// ———————————-
void WriteI2C(unsigned char Data)
{{

for(i = 0i<8i++)
{{
SDA =(データ&0x80)? 1:0
SCL = 1SCL = 0
データ<<=1
}

SCL = 1
_button _()_ nop_()
SCL = 0

}

// ———————————-
// I2Cを読み取ります
// ———————————-
unsigned char ReadI2C(ビットACK_Bit)
{{

開始()
WriteI2C(0xA1)

SDA = 1
for(i = 0i<8i++)

SCL = 1
データ<<= 1
日付=(日付

if(ACK_Bit == 1)
SDA = 0 // ACKを送信します
そうしないと
SDA = 1 // ACKを送信しない

_button _()_ nop_()
SCL = 1
_button _()_ nop_()
SCL = 0
やめる()
データを返す
}

// ———————————-
// I2Cから1バイトを読み取る
// ———————————-
void ReadBYTE(unsigned int Addr)
{{
開始()
WriteI2C(0xA0)
WriteI2C((unsigned char)(Addr >> 8)&0xFF)
WriteI2C((unsigned char)Addr&0xFF)
}

// ———————————-
// I2Cに1バイトを書き込む
// ———————————-
void WriteBYTE(unsigned int Addr)
{{
開始()
WriteI2C(0xA0)
WriteI2C((unsigned char)(Addr >> 8)&0xFF)//アドレスを上位に送信
WriteI2C((unsigned char)Addr&0xFF)//アドレスを低く送信
}

// —————————————
// mS関数を遅らせる
// —————————————
void DelayMs(unsigned int count)
{// mSec遅延11.0592Mhz
unsigned int i // Keil v7.5a
while(count)
{{
i = 115
while(i> 0)i–
カウント-
}
}

したがって、これはすべてI2Cインターフェイスの実装に関するものです。この概念をよりよく理解していただければ幸いです。さらに、この概念に関する質問や インターフェースデバイス 以下のコメントセクションにコメントして、貴重な提案をしてください。