課程

課程 講師

IIC通信協議

購買數
2
課時數
1
瀏覽數
609
主講人:
邵老師
有效期:
自購買之日起永久
免費
原價:¥10
分享

分享到:

手機查看

    適用于基于STM32F103、STM32F407核心板的

            三軸加速度計傳感器

            大氣壓力傳感器

            磁場強度傳感器

            光照強度傳感器



一、IIC通信協議

            

            1、I2C簡介:

            I2C總線是由Philips公司開發的一種簡單、雙向二線制同步串行總線。它只需要兩根線即可在連接于總線上的器件之間傳送信息。                                SDA(串行數據線)和SCL(串行時鐘線)都是雙向I/O線,接口電路為開漏輸出.需通過上拉電阻接電源VCC.當總線空閑時.兩根線都是高電平,連接總線的外同器件都是CMOS器件,輸出級也是開漏電路.在總線上消耗的電流很小,因此,總線上擴展的器件數量主要由電容負載來決定,因為每個器件的總線接口都有一定的等效電容.而線路中電容會影響總線傳輸速度.當電容過大時,有可能造成傳輸錯誤.所以,其負載能力為400pF,因此可以估算出總線允許長度和所接器件數量。

          

          2、I2C總線特點:

          在硬件上,I2C總線只需要一根數據線和一根時鐘線兩根線,總線接口已經集成在芯片內部,簡化了硬件電路PCB布線,降低了系統成本,提高了系統可靠性。

          I2C總線是一個真正的多主機總線,如果兩個或多個主機同時初始化數據傳輸,可以通過沖突檢測和仲裁防止數據破壞,每個連接到總線上的器件都有唯一的地址,任何器件既可以作為主機也可以作為從機,但同一時刻只允許有一個主機。數據傳輸和地址設定由軟件設定,非常靈活。總線上的器件增加和刪除不影響其他器件正常工作。

      

        3、I2C通信協議:

        

        空閑狀態:

        I2C總線總線的SDA和SCL兩條信號線同時處于高電平時,規定為總線的空閑狀態。

        此時各個器件的輸出級場效應管均處在截止狀態,即釋放總線,由兩條信號線各自的上拉電阻把電平拉高。


        起始位與停止位的定義:

        起始信號:當SCL為高電平時,SDA由高電平到低電平的跳變;啟動信號是一種電平跳變時序信號,而不是一個電平信號。

        停止信號:當SCL為高電平時,SDA由低電平到高電平的跳變;停止信號也是一種電平跳變時序信號,而不是一個電平信號。


        ACK:

        發送器每發送一個字節,就在時鐘脈沖9期間釋放數據線,由接收器反饋一個應答信號。應答信號為低電平時,規定為有效應答位(ACK簡稱應答位),表示接收器已經成功地接受了該字節;應答信號為高電平時,規定為非應答位(NACK),一般表示接收器接收該字節沒有成功。


        數據有效性:

        I2C總線進行數據傳送時,時鐘信號為高電平期間,數據線上的數據必須保持穩定,只有在時鐘線上的信號為低電平期間,數據線上的高電平或低電平狀態才允許變化。

        

        數據的傳送:

        在I2C總線上傳送的每一位數據都有一個時鐘脈沖相對應(或同步控制),即在SCL串行時鐘的配合下,在SDA上逐位地串行傳送每一位數據。數據位的傳輸是邊沿觸發。        


        

      工作過程:

      總線上的所有通信都是由主控器引發的。在一次通信中,主控器和被控器總是在扮演著兩種不同的角色。在通信之初,主從機必須根據自己的要求約定好通信規則:command的定義和位置、address的位數和位置。

     以讀寫從機寄存器數據為例:

     假設從機寄存器地址為8位、從機寄存器也位8位(被讀取數據為8位);

     約定讀command為0x01,寫command位0x02;約定主機發起通信后,第一個slave address字節收到ack后,緊跟的一個字節為command,再下面一個字節為address。


二、代碼實現


一、讀寄存器數據步驟:

        主機先發起一次通信,將讀command(0x01)和需要讀取的寄存器地址address寫入從機;(主機發出寫操作)。

        從機firmware的處理:

        將command和address分別提取出來;

        判斷command的含義(本例中,是讀指令還是寫指令);

        根據收到的的address,將對應寄存器的的數據放入從機I2C輸出buffer;(這個步驟可以使用指針)。

       主機再次發起一次通信,讀取從機的數據;(主機發出讀操作)。


二、讀取數據代碼實現示例

/* 第1步:發起I2C總線啟動信號 */

BSP_MyIIC_Start();


/* 第2步:發起控制字節,高7bit是地址,bit0是讀寫控制位,0表示寫,1表示讀 */

BSP_MyIIC_SendByte(BH1750_Addr | I2C_RD); /* 此處是讀指令 */


/* 第3步:發送ACK */

if (BSP_MyIIC_WaitAck() != 0)

{

goto cmd_fail; /* 器件無應答 */

}


/* 第4步:讀取數據 */

Result = BSP_MyIIC_ReadByte(); /* 讀高字節 */

BSP_MyIIC_Ack(); /* 中間字節讀完后,CPU產生ACK信號(驅動SDA = 0) */

Result = (Result<<8) | BSP_MyIIC_ReadByte(); /* 讀低字節 */

BSP_MyIIC_NAck(); /* 最后1個字節讀完后,CPU產生NACK信號(驅動SDA = 1) */


/* 發送I2C總線停止信號 */

BSP_MyIIC_Stop();

return Result; /* 執行成功 */


講師信息

邵老師

邵老師

粉絲:1
多年嵌入式開發經驗,精通STM32/51單片機,扎實的C語言基本功
×

分享成功,快去個人中心查看吧~~~

祝您:學習愉快 !

確 定
×

加入我的看單

該課程需要加入我的看單后方可學習,確定加入?

確 定 取 消
關注官方微信
冠通棋牌世界游戏大厅