I2Cプロトコルの概要
二つの側面
私はそこに、このケースではありませんでしたかわからない、STM32の完了後に、孤独感を学びました。
ギャングスターは、詳細なレビューの波が原則で見つけることので、理解していない聞くと言う
、今日はそのI2C通信プロトコルであると言うだけで唯一の理解を見つけるために、これらの契約でやっている知っていることを学んでいない、死んではなりませんOLED mpu6050 EEPROMバラバラバラのような。。。要するに、それは非常に一般的です。まあ、ナンセンスが終了しました。
I2Cプロトコルを導入する我々二つの方法
の1->物理レイヤ
2 - >プロトコル層
物理層の電気的特性
1:これは、複数のデバイスへのバス信号線の共通は、バスデバイスの複数搭載することができることを意味し、複数のデバイスをサポートするバスです。
2: 2台のバスを含む、すなわち、シリアルクロックライン(SCL)Cクロック手段クロックの代表であり、シリアルデータ線(SDA)Dデータは、データの意味を表します。名前が示唆するように、SDAはSCL、同期するためのトランシーバまま、データを送信するために使用されます。
3: I2Cバス上に複数のデバイスをマウントすることができ、それがどのようにそれを送信するためのマシンを識別するためにありますか?**実際には、I2Cバス上のすべてのデバイスは、異なるデバイス間のアクセスの精度を確保するために、独自のアドレスを持っています。**アドレスは7または11ビットであってもよいです。
4:プルアップ抵抗を介して電源へのバス。これは多くの人が、私は上記の図輝いについて詳細に説明し、理解していないかもしれません。コンピュータの論理に:
高電圧(ハイインピーダンス)を表す
電圧が0を表す
出力装置がアイドル又は1である場合はなく、高出力インピーダンス状態我々 !
ハイ・インピーダンス状態は、定義まあにより、抵抗値が、その後、無限大を自分で大取りされます。
アイドル状態が表す場合:タッチスクリーンがアイドル状態のときにセンサーが作動している場合と仮定図出力電圧がゼロである、SCLバスは、この時点ではハイレベルの出力をローにプルされ、タッチスクリーンは、この場合0Vである、センサーが高い、それは意志短絡を引き起こします。我々は、タッチスクリーンにハイインピーダンス、等価回路を持っている場合。この時点では、センサ電圧が高い場合、全体のSCLバスが押し上げられたであることを確認してください。
示すハイレベルのとき**:** 他の機器アイドル(ハイインピーダンス状態)と仮定すると、それは、高インピーダンス状態かのセンサの動作のみを無視することができ、プルアップ抵抗が存在するため、全体のラインSCLは1です。
5: 3つの送信モード持つ:100kbit /秒の標準モードの伝送速度を、高速モードでは、最大3.4Mbit / sの高速モードに、400kbit / sのですが、現在のI 2Cデバイスのほとんどは、高速モードをサポートしていません。我々は、一般的に、その上に標準モードを使用します。
6: ICが400pFの静電容量の同じ数によってバスに接続されている最大のバスを制限します。
PS: 純粋にこじ開け、回路を学んだことはありません
プロトコル層
I2Cプロトコルは、通信の開始および停止信号、データ検証、応答、調停、クロック同期およびブロードキャストアドレスの他の態様を定義します。バスを介して各種信号の状態を表現します。
I2C
I2C基本的な識字コース
最初は絵を置きます:
#書き込みプロセス
まず最初にすることによって生成されたどのように特定の信号を理解していない抽象それを理解すること、書くためにそれを取る:
ホストは、最初にそれが送信(S)を、送信を開始言いますか??それは、(ADRESS)、ホストはもう一度確認のスレーブがそれ(R / W)に、他人のデータや書き込みデータを読み込み、その後、スレーブは、あなたが/書き込み(A)を読みたい知って発現していることは明らかである、ホストがバラバラバラ、送信データを送信します完了すると、マシンは、彼らが(シンボルが再生されないことを非応答者)からのデータを受け入れていないと述べた。ホストは、データ(P)を書いて停止します。
--------------------------------------- 本当に感動、私の書き込みを許します。----------------------------------------------
S:最初に言って、送信の開始を示します。
SLAVE_ADDRESS:この図はまた、スレーブアドレスこと、前記
R&LTは/ Wである: 0が書き込まれ、1読み取り
データ:データが送信された
A:応答信号
P:停止信号。終了しました
通信複合フォーマット
このプロセスは、その後、ホストは、スタート信号を生成するスレーブアドレスを見つけることはほとんど最初のR / Wが書かれていることを前提とし、実際の書き込みとの前で話すのプロセスであり、書き始め、スレーブは認めて、この背後にあるこの時間は、データを表現することですそれが書かれているEEPROMなどの機械、からの書き込みアドレスは、データによって決定され、それがほとんどです後ろに長いったらしいん。
通信信号を判定
スタートと通信するために停止信号
1 SCLがハイ、ハイからローへSDA、スタート信号を示すである
2 SCLが高い場合、ローからハイにSDA、その停止信号を示します
データ検証
1: SCLが高いときSDA 1に示すハイ、データであれば、SDAが低い場合、データは0を表す
2 SCLが低い場合、SDAレベル変換を、データ送信を示します。
アドレスとデータ方向
私たちのアドレスの前で話すことは通常7と、7または10です。
= 7八のデバイスアドレスは、スレーブアドレス+ EEPROMへの読み取り/書き込みアドレスの後、例えば、彼の7デバイスアドレスは1111000ヘキサ変換が0x78とされている
リードアドレス= 1111 0001 = 0xF1 8つのデバイス
8 = 1111 0000 = 0xF0がデバイスのアドレスを書きます
応答信号に
転送中に、マスタは9番目のクロック(8クロック8バイト、摩耗を失うビット(バイト))で生成されたクロック生成
データ送信端末は、SDAの制御を放棄し、への、SDAを制御する受信側データ応答は、高レベルの無応答と比較して低い場合、この時点で
コミュニケーションプロセス
ここで、言って非常にリラックス完全に理解の前にここを見て、上記のプロセスを読み書きすることではないことは基本的に同じです。
言って特別なニーズはEV5、EV6この時点で我々は、ステータス・レジスタを検出することができれば、実際には、以下のようなスタート信号を生成するような状態を表し、同様に、発生し、対応するイベントがあるだろう、(知りたいし、次のさ参加し、イベントが発生した検出した場合、スタート信号が生成されることが決定され、)「STM32中国はマニュアル参照」、それが保証とみなすことができます。
コードの一部を説明します
#include "myiic.h"
#include "delay.h"
void IIC_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);
}
void IIC_Start(void)
{
SDA_OUT(); //sdaÏßÊä³ö
IIC_SDA=1;
IIC_SCL=1;
delay_us(4);
IIC_SDA=0;//START:when CLK is high,DATA change form high to low
delay_us(4);
IIC_SCL=0;
}
//²úÉúIICÍ£Ö¹ÐźÅ
void IIC_Stop(void)
{
SDA_OUT();//sdaÏßÊä³ö
IIC_SCL=0;
IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
delay_us(4);
IIC_SCL=1;
IIC_SDA=1;
delay_us(4);
}
u8 IIC_Wait_Ack(void)
{
u8 ucErrTime=0;
SDA_IN();
IIC_SDA=1;delay_us(1);
IIC_SCL=1;delay_us(1);
while(READ_SDA)
{
ucErrTime++;
if(ucErrTime>250)
{
IIC_Stop();
return 1;
}
}
IIC_SCL=0;//ʱÖÓÊä³ö0
return 0;
}
void IIC_Ack(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=0;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
void IIC_NAck(void)
{
IIC_SCL=0;
SDA_OUT();
IIC_SDA=1;
delay_us(2);
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
}
IIC_Start();シグナル開始
IIC_Stop();停止信号
IIC_Wait_Ack();応答を待つ
IIC_Ack()応答信号は
IIC_NAckアクノリッジしない
ことが理解されるであろう上記のタイミングチャート。
話に焦点を当てて、送信とバイトの機能を読んで:
void IIC_Send_Byte(u8 txd)
{
u8 t;
SDA_OUT();
IIC_SCL=0;//ÀµÍʱÖÓ¿ªÊ¼Êý¾Ý´«Êä
for(t=0;t<8;t++)
{
IIC_SDA=(txd&0x80)>>7;
txd<<=1;
delay_us(2); //¶ÔTEA5767ÕâÈý¸öÑÓʱ¶¼ÊDZØÐëµÄ
IIC_SCL=1;
delay_us(2);
IIC_SCL=0;
delay_us(2);
}
}
//¶Á1¸ö×Ö½Ú£¬ack=1ʱ£¬·¢ËÍACK£¬ack=0£¬·¢ËÍnACK
u8 IIC_Read_Byte(unsigned char ack)
{
unsigned char i,receive=0;
SDA_IN();//SDAÉèÖÃΪÊäÈë
for(i=0;i<8;i++ )
{
IIC_SCL=0;
delay_us(2);
IIC_SCL=1;
receive<<=1;
if(READ_SDA)receive++;
delay_us(1);
}
if (!ack)
IIC_NAck();//·¢ËÍnACK
else
IIC_Ack(); //·¢ËÍACK
return receive;
}
ルック送信データは0x80 1000 0000で、送信されるべきデータのTXD
1、TXD&= 1000 0000 0x80とされている場合は、最初のビットをTXD
最高TXD TXD最初のビットは、操作の効果は、抽出物であることが0 TXD&0x80の= 0000 0000の場合データ;
(TXD&0x80の)>> 7(TXD&0x80の)を表し、右7、会議は、000000001です後のデータは千万ゼロ権利であることを前提としてい
ますが、最高のデータビット(8分)を得るようにすることを、データは注文後、左シフトは、データの7サイクル目を取得
データを受け入れるように同様。
概要
最近の研究は、OLEDとmpu6050上で実験を行うために数日前に、その通信は本当に重要で見つかった後、I2C通信プロトコルが使用されています。ESP8266プロトコルを使用する必要があり、クラウドサーバ(MQTT)に接続します。ああ、確か徹底的通信、または学ぶことは難しい後半を理解します。
これらのコードのほとんどを完了した後の理解はI2Cの初期化または私はヘクタールを言わないだろうというようなものは、私たちはEEPROMとの通信に興味缶使用I2C通信プロトコルである、読み取ることができます。
あなたがそれを学べば、トラブルは古典的な賞賛の何点を教えてください、あなたをしてから行く、ボールボール。