- I2C通信プロトコルとは何ですか?
- I2C通信はどのように機能しますか?
- I2C通信はどこで使用しますか?
- NuvotonN76E003のI2C-ハードウェア要件
- AT24LC64とNuvotonN76E003のインターフェース–回路図
- NuvotonN76E003のI2Cピン
- N76E003のI2C通信
- I2C通信用のN76E003のプログラミング
- コードと出力の点滅
組み込みアプリケーションの広大なシステムでは、マイクロコントローラーだけですべてのアクティビティを実行することはできません。ある段階で、情報を共有するために他のデバイスと通信する必要があります。これらの情報を共有するための通信プロトコルにはさまざま な種類があります が、最もよく使用されるのは USART、IIC、SPI、およびCANです。各通信プロトコルには、独自の長所と短所があります。IICの部分に焦点を当てましょう 。これは、このチュートリアルで学習する内容だからです。ここが初めての場合は、Nuvotonチュートリアルをチェックしてください。ここでは、非常に基本的な入門チュートリアルからN76E003マイクロコントローラーのすべての周辺機器について説明しています。他のマイクロコントローラーでI2Cを使用する方法を学びたい場合は、以下のリンクを確認してください。
- ArduinoでI2Cを使用する方法:2つのArduinoボード間の通信
- PICマイクロコントローラPIC16F877とのI2C通信
- I2Cを使用した16X2LCDとESP32のインターフェース
- MSP430ランチパッドとのI2C通信
- I2Cを使用せずにLCDをNodeMCUに接続する
- Arduinoの単一プログラムでマルチ通信(I2C SPI UART)を処理する方法
I2Cは、Philips(現在のNXP)によって開発された重要な通信プロトコルです。このI2Cプロトコルを使用すると、MCUを複数のデバイスに接続して通信を開始できます。I2Cは、SDAとSCLの2本のワイヤでのみ動作します。ここで、SDAはシリアルデータを表し、SCLはシリアルクロックを表します。ただし、これら2つのピンにはVCC電圧レベルまでのプルアップ抵抗が必要であり、適切なプルアップ抵抗があれば、バスは一意のアドレスを持つ127個のデバイスをサポートできます。
I2C通信プロトコルとは何ですか?
用語IICは「の略インター集積回路」。通常、I2CまたはI squared Cとして、あるいは2線式インターフェースプロトコル(TWI)として示される場所もありますが、すべて同じ意味です。I2Cは同期通信プロトコルです。つまり、情報を共有する両方のデバイスが共通のクロック信号を共有する必要があります。情報を共有するためのワイヤは2本だけで、そのうちの1つはクロック信号に使用され、もう1つはデータの送受信に使用されます。
I2C通信はどのように機能しますか?
I2C通信は、フィリップスによって最初に導入されました。前に述べたように、2本のワイヤーがあり、これらの2本のワイヤーは2つのデバイス間で接続されます。ここでは 、一方のデバイスをマスター と呼び、もう一方のデバイスをスレーブと呼び ます。通信は、マスターとスレーブの2つの間で常に発生する必要があります 。I2C通信の利点は、複数のスレーブをマスターに接続できることです。
完全な通信は、これら2つのワイヤ、つまりシリアルクロック(SCL)とシリアルデータ(SDA)を介して行われます。
シリアルクロック(SCL): マスターによって生成されたクロック信号をスレーブと共有します
シリアルデータ(SDA): マスターとスレーブ間でデータを送受信します。
いつでも、マスターだけが通信を開始できます。バスには複数のスレーブがあるため、マスターは異なるアドレスを使用して各スレーブを参照する必要があります。アドレス指定されると、その特定のアドレスを持つ軟膏のみが情報を返信し、他の軟膏は静かになります。このようにして、同じバスを使用して複数のデバイスと通信できます。
I2C通信はどこで使用しますか?
I2C通信は、短距離通信にのみ使用され ます。それはそれをスマートにするために同期されたクロックパルスを持っているので、それは確かにある程度信頼できます。このプロトコルは主に、マスターに情報を送信する必要があるセンサーまたはその他のデバイスと通信するために使用されます。マイクロコントローラが最小限のワイヤのみを使用して他の多くのスレーブモジュールと通信する必要がある場合に非常に便利です。長距離通信をお探しの場合はRS232を、より信頼性の高い通信をお探しの場合はSPIプロトコルをお試しください。
NuvotonN76E003のI2C-ハードウェア要件
このプロジェクトの要件はN76E003を使用してI2C通信を学習することであるため、I2Cデータラインに接続されるEEPROMを使用します。一部のデータをEEPROMに保存し、それを読み取ってUART画面を使用して表示します。
保存された値はUARTに出力されるため、あらゆる種類のUSBからUARTへのコンバーターが必要です。N76E003でのUART通信に不慣れな場合は、Nuvotonを使用したUARTのチュートリアルを確認することもできます。このアプリケーションでは、CP2102UARTからUSBへのコンバーターを使用します。上記の他に、以下のコンポーネントも必要です-
- EEPROM 24C02
- 2個の4.7k抵抗器
言うまでもなく、上記のコンポーネント以外に、N76E003マイクロコントローラーベースの開発ボードとNu-Linkプログラマーが必要です。さらに、すべてのコンポーネントを接続するには、ブレッドボードとフックアップワイヤも必要です。
AT24LC64とNuvotonN76E003のインターフェース–回路図
以下の回路図でわかるように、EEPROMは2つのプルアップ抵抗とともにI2Cラインに接続されています。左端には、プログラミングインターフェイスの接続が示されています。
AT24LC64 ICにブレッドボードを使用し、ジャンパー線を使用してICをnuvotonプログラマーボードに接続しました。私のハードウェアセットアップとnu-inkプログラマーを以下に示します。
NuvotonN76E003のI2Cピン
N76E003のピン配列は下の画像で見ることができます-
ご覧のとおり、各ピンには異なる仕様があり、各ピンは複数の目的に使用できます。ただし、ピン1.4はI2C SDAピンとして使用されるため、PWMおよびその他の機能が失われます。ただし、このプロジェクトには別の機能は必要ないため、これは問題ではありません。同じことがP1.3でも起こります。I2CのSCLピンです。
I2CピンはGPIOとして機能するため、構成する必要があります。すべてのGPIOピンは以下のモードで設定できます。
データシートによると、PxM1.nおよびPxM2。nは、I / Oポートの制御動作を決定するために使用される2つのレジスタです。データシートには、I2C機能を使用するには、I / OモードをI2C関連通信のオープンドレインとして使用する必要があると記載されています。
N76E003のI2C通信
I2Cペリフェラルは、I2C機能をサポートするマイクロコントローラユニットにとって重要です。多くの種類の異なるマイクロコントローラには、I2C周辺機器が組み込まれています。ただし、場合によっては、I2C関連のハードウェアサポートが利用できないソフトウェア制御を使用してI2Cを手動で構成できます(たとえば、多くの8051マイクロコントローラー)。ただし、nuvotonN76E003にはI2C周辺機器のサポートが付属しています。
M76E003は、I2Cモードで、マスタートランスミッタ、マスターレシーバ、スレーブトランスミッタ、およびスレーブレシーバの4種類の操作をサポートします。また、I2Cラインの標準(100kbps)および高速(最大400kbps)の速度もサポートします。I2Cは、SCLおよびSDA信号ラインのいくつかの一般的なルールで動作します。
開始条件と停止条件:
これはI2C通信において重要なことです。データがI2Cラインに転送されると、データは開始条件で始まり、停止条件で終わります。
開始条件は、SCLラインがハイのときのSDAのハイからローへの遷移であり、停止条件は、SCLラインがハイのときのSDAのローからハイへの遷移です。これらの2つの条件は、マスター(MCUまたは他のスレーブデバイスを制御しているもの)によって生成されます。バスラインは、開始条件が開始されるとこの状態でビジーのままになり、停止条件が開始されると再びフリーのままになります。
開始と停止の状態は、N76E003データシートの信号の観点で見事に示されています-
データ形式の7ビットアドレス:
N76E003は、7ビットのアドレスとデータ形式をサポートしています。開始条件が開始された後、マスターデバイスはデータをI2Cラインに送信する必要があります。最初のデータは重要なものです。このデータが適切に作成または送信されない場合、接続されたデバイスは識別されず、それ以上の通信はできません。
データは、SLAとして示される7ビット長のスレーブアドレスで構成されます。複数のデバイスがバスに接続されている場合、この7ビット長のアドレスはデバイスごとに一意である必要があります。 7ビットアドレスの後、8番目のビットはデータ方向ビットです。つまり、8番目のビットに応じて、マスターはデータがスレーブデバイスに書き込まれるか、データがスレーブデバイスから読み取られるかに関する情報をスレーブデバイスに送信します。 8番目のビットは、読み取りまたは書き込み通知機能と呼ばれるR / Wビットです。ご存知のとおり、8ビット情報は128タイプであるため、128デバイスをサポートしますが、I2Cは同じバス上で127タイプのデバイスをサポートしますが、128はサポートしません。0x00アドレスは予約済みアドレスであり、ジェネラルコールアドレスと呼ばれるためです。マスターがすべてのデバイスに情報を送信したい場合は、アドレス指定は0x00で、各デバイスは個々のソフトウェア構成と同じ方法で再生されます。
したがって、データ送信は次のようになります-
認める:
上記のデータアドレスイメージでは、9番目のビットの後にR / Wビットが続くことを確認応答ビットと呼びます。このビットを使用すると、マスターまたはスレーブはSDAラインをローに引き下げることによってデータトランスミッターに応答するため、これは重要なものです。確認応答ビットを取得するには、送信機はSDAラインを解放する必要があります。
I2C通信用のN76E003のプログラミング
このチュートリアルで使用される完全なプログラムは、このページの下部にあります。コード内の重要なセグメントの説明は次のとおりです-
ピンをオープンドレインとして設定し、I2C用に構成します。
まず、I2Cピンセクションから始めましょう。前に説明したように、I2C SCLおよびSDAポートは、オープンドレイン構成として構成および設定する必要があります。これを行うために、 I2C.cソースファイル と一緒に I2C.hヘッダーファイル を使用してい ます 。コードスニペットは次のようになります-
{P13_OpenDrain_Mode; P14_OpenDrain_Mode; clr_I2CPX;} while(0)
上記のコードは、P13とP14をオープンドレインピンとして設定し、 clr_I2CPX を使用して、 P1.3の SCLピンとP1.4のSDAピンとしてP13とP14を選択します。
このI2CPXは、I2C制御レジスタI2CONの0番目のビットです。この I2C_PX が1に設定されている場合、ピンはSCLとしてP0.2に、SDAとしてP1.6に変更されます。ただし、P13とP14を使用します。ここでは代替ピンは使用されていません。
I2C制御レジスタI2CON:
I2C制御レジスタI2CONは、I2C動作を制御するために使用されます。最初のビットはI2Cピン選択ビットです。0に設定すると、I2CピンがP13およびP14として構成されます。
AAビットは確認応答アサートフラグです。AAフラグが設定されている場合、SCLラインの確認応答クロックパルス中にACKが返されます。クリアされると、SCLラインの確認応答されたクロックパルス中にNACK(SDAのハイレベル)が返されます。
次のビットは、I2Cステータス割り込みであるSIです。I2Cステータス割り込みが有効になっている場合、ユーザーはI2STATレジスタをチェックして、どのステップが渡されたかを判断し、アクションを実行する必要があります。
STOは、マスターモードで設定されるSTOPフラグです。 STOP 条件が検出されると、STOはハードウェアによって自動的にクリアされます。
次のビットはSTAビットです。このフラグが設定されている場合、バスが空いているとI2CはSTART条件を生成します。バスがビジーの場合、I2CはSTOP条件を待機し、続いてSTART条件を生成します。I2Cがすでにマスターモードにあり、1バイト以上が送信または受信されているときにSTAが設定されると、I2Cは繰り返しSTART条件を生成します。STAは、ソフトウェアによって手動でクリアする必要があります。
最後のI2CENは、I2Cバスのイネーブルビットまたはディセーブルビットです。
EEPROM 24C02:
さて、24C02に来ます。N76E003のボードサポートパッケージには24LC64用のI2Cコードがあり、簡単に変更できます。ただし、I2C機能を理解するために簡単な方法を使用します。
EEPROM 24C02との詳細なインターフェースを使用したい場合は、BSPのEEPROMプログラムを使用できます。
N76E003がマスターになり、EEPROMがスレーブになるI2Cの24C02のみを接続します。したがって、EEPROMアドレスにデータを書き込み、同じものを読み取ります。
24C02EEPROMのピン配列を以下に示します-
A0、A1、A2は3つのアドレス選択ピンです。WPピンは書き込み保護ピンであり、EEPROMへの書き込みを有効にするにはVSSに接続する必要があります。
バイト書き込み機能を以下の画像に示します-
完全な書き込みサイクルは、スタートビットで発生します。その後、制御バイトを送信する必要があります。制御バイトには、次のものが必要です-
スタートビットの後、スレーブアドレスで構成されます。1010は静的アドレスであり、A0、A1、およびA2はハードウェア接続ベースのアドレスです。3つのピンがGNDまたはVSS電源に接続されている場合は、0として読み取られます。それ以外の場合、VCCに接続されている場合は、1として読み取られます。この場合、すべてのA0、A1、およびA2はVSSに接続されています。したがって、これらはすべて0になります。
読み取りまたは書き込み条件に費やします。読み取りまたは書き込みビットのあるアドレスの値は、書き込みの場合は-0xA0、読み取りの場合は0xA1になります。次は確認応答ビットで、その後、データを格納する必要のある場所に8ビットアドレスが送信され、最後にそれぞれの場所に格納されるデータが送信されます。これらのことは、main関数で段階的に実行されます。
主な機能とwhileループ:
void main(void){char c = 0x00; InitialUART0_Timer3(115200); TI = 1; //重要なのは、prinft関数を使用してTI = 1を設定する必要があることです。I2C_init(); while(1){EEPROM_write(1,0x55); c = EEPROM_read(1); printf( "\ n読み取られた値は%x"、c&0xff); }; }
主な機能はシンプルで、アドレス1のEEPROMに継続的に値を書き込み、データを読み取ります。次に、printf関数を使用してデータが印刷されます。printfは、値を16進数で出力しています。
EEPROM書き込み機能は、EEPROMセクションで説明した次のもので構成されています-
void EEPROM_write(unsigned char address、unsigned char value){I2C_start(); I2C_write(0xA0); I2C_write(アドレス); I2C_write(value); I2C_stop(); }
I2Cスタート機能は以下のもので構成されています-
void I2C_start(void){signed int time =タイムアウト; set_STA; clr_SI; while((SI == 0)&&(time> 0)){time--; }; }
この機能では、SIステータスが事前定義されたタイムアウト期間(事前定義された時間が1000に設定されているI2C.hで定義されている)とともにチェックされます。開始機能は、STAの設定とSIのクリアから始まります。
void I2C_stop(void){signed int time =タイムアウト; clr_SI; set_STO; while((STO == 1)&&(time> 0)){time--; }; }
スタートと同じように、ストップ機能が使用されます。 ストップ 機能は、SIをクリアすることによって、その後STOを設定することにより開始されます。以下の機能はI2C読み取り機能です-
unsigned char I2C_read(unsigned char ack_mode){signed int time =タイムアウト; unsignedchar値= 0x00; set_AA; clr_SI; while((SI == 0)&&(t> 0)){時間-; }; 値= I2DAT; if(ack_mode == I2C_NACK){t = timeout_count; clr_AA; clr_SI; while((SI == 0)&&(t> 0)){時間-; }; }戻り値; }
ack_mode と I2C_NACK 、双方がそれぞれ0及び1としてI2Cヘッダファイルに定義されています。
同様に、書き込み関数が作成されます-
void I2C_write(unsigned char value){signed int time =タイムアウト; I2DAT =値; clr_STA; clr_SI; while((SI == 0)&&(time> 0)){time--; }; }
コードと出力の点滅
コードは0の警告と0のエラーを返し、Keilによるデフォルトのフラッシュ方法を使用してフラッシュされました。初めての場合は、nuvotonチュートリアルの開始を確認して、コードをアップロードする方法を理解してください。コードのコンパイル情報は以下にあります。
ビルドターゲット「I2C_EEPROM」コンパイルI2C_EEPROM.c…コンパイルI2C.c…リンク…プログラムサイズ:data = 59.2 xdata = 0 code = 2409「。\ Output \ I2C_EEPROM」から16進ファイルを作成…」 。\ Output \ I2C_EEPROM "-0エラー、0警告。ビルド経過時間:00:00:04バッチビルドの概要:1成功、0失敗、0スキップ-経過時間:00:00:04
ハードウェアはブレッドボードにセットアップされており、期待どおりに機能しています。下の画像でわかるように、EEPROMに値を書き込んでメモリから読み取り、シリアルモニターに表示することができました。
ボードがこのコードでどのように機能するかの完全なデモンストレーションについては、以下のビデオをチェックしてください。チュートリアルを楽しんで、質問がある場合に役立つことを学んだことを願っています。下のコメントセクションに残してください。フォーラムを使用して、他の技術的な質問を投稿することもできます。