嵌入式學習筆記——I2C

IIC協議詳解

    • 一、IIC協議簡介
    • 二、IIC總線結構圖
    • 三、IIC通信流程詳解
      • 1. 空閑狀態 : 雙高空閑
      • 2. 起始信號(START): 時高數下開始
      • 3. 停止信號(STOP): 時高數上結束
      • 4. 數據傳輸格式 : 時高數穩,時低數變
      • 5. 應答信號
    • 四、寫操作流程
    • 五、讀操作流程
    • 六、IIC代碼(STM32)詳解
      • 1. 初始化函數
      • 2. 寫數據函數(主寫從)
    • 七、小結
    • 八、常見問題

一、IIC協議簡介

IIC(I2C)是由飛利浦公司提出的一種串行通信協議,僅用兩根線:

  • SDA:串行數據線
  • SCL:串行時鐘線

它是一種半雙工、多主機、主從通信協議,每個從設備都有唯一的地址。數據傳輸速度支持:

  • 標準模式:100kbps
  • 快速模式:400kbps
  • 高速模式:3.4Mbps

二、IIC總線結構圖

兩條總線連接主從設備,SDA和SCL均需上拉電阻保持高電平(空閑狀態)。

三、IIC通信流程詳解

1. 空閑狀態 : 雙高空閑

SDA 和 SCL 都為高電平時為空閑狀態

2. 起始信號(START): 時高數下開始

在 SCL 為高電平時,SDA 從高變低,表示通信開始。

3. 停止信號(STOP): 時高數上結束

在 SCL 為高電平時,SDA 從低變高,表示通信結束。

4. 數據傳輸格式 : 時高數穩,時低數變

  • 數據按字節(8位)發送
  • 每個字節后跟一個應答位(ACK)
  • 傳輸過程中,SDA 數據需在 SCL 高電平期間穩定
    當SCL為高電平時,便會獲取SDA數據值,其中SDA數據必須是穩定的(若SDA不穩定就會變成起始/停止信號)。
    當SCL為低電平時,便是SDA的電平變化狀態。
    若主從機在傳輸數據期間,需要完成其它功能(例如一個中斷),可以主動拉低SCL,使I2C進入等待狀態,直到處理結束再釋放SCL,數據傳輸會繼

5. 應答信號

I2C總線上的數據都是以8位數據(字節)進行的,當發送了8個數據后,發送方會在第9個時鐘脈沖期間釋放SDA數據,當接收方接收該字節成功,便會輸出一個ACK應答信號,當SDA為高電平,表示為非應答信號NACK,當SDA為低電平,表示為有效應答信號AC

  • ACK:SDA 被接收方拉低,表示接收成功
  • NACK:SDA 保持高電平,表示接收失敗或結束

四、寫操作流程

  1. 主機發送起始信號
  2. 發送從機地址 + 寫方向(最低位,第八位為0)
  3. 等待從機應答ACK
  4. 發送寄存器地址和數據
  5. 每發送1字節都需從機應答
  6. 最后發送停止信號

五、讀操作流程

  1. 主機發送起始信號
  2. 發送從機地址 + 寫方向(0)
  3. 等待應答,發送寄存器地址
  4. 發送重新開始信號(重復START): 主機要改變通信模式(主機將由發送變為接收,從機將由接收變為發送),所以主機重新發送一個開始start信號,然后緊跟著發送一個從機地址,注意此時該地址的第8位為1,表明將主機設置成接收模式,開始讀取數據
  5. 發送從機地址 + 讀方向(1)
  6. 接收數據,每接收一個字節主機需發送 ACK
  7. 最后一個字節發 NACK + 停止信號

六、IIC代碼(STM32)詳解

1. 初始化函數

void I2C_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;I2C_InitTypeDef I2C_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  // 開啟GPIOB時鐘RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);   // 開啟I2C1時鐘GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; // SCL = PB6, SDA = PB7GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;        // 復用開漏輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);                 // 初始化GPIOBI2C_InitStructure.I2C_Mode = I2C_Mode_I2C;             // I2C模式I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;     I2C_InitStructure.I2C_OwnAddress1 = 0x00;              // 本機地址I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;            // 打開應答I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000;             // 100kHz速率I2C_Init(I2C1, &I2C_InitStructure);I2C_Cmd(I2C1, ENABLE);  // 使能I2C
}

2. 寫數據函數(主寫從)

void I2C_SendData(uint8_t slaveAddress, uint8_t* pBuffer, uint16_t numByteToWrite)
{I2C_GenerateSTART(I2C1, ENABLE);  // 產生起始信號while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1, slaveAddress, I2C_Direction_Transmitter); // 發地址+寫方向while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));while (numByteToWrite--){I2C_SendData(I2C1, *pBuffer++);  // 發送數據while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // 等待發送完成}I2C_GenerateSTOP(I2C1, ENABLE); // 發送停止信號
}

七、小結

名稱描述
SDA數據線(雙向)
SCL時鐘線(主機控制)
STARTSDA下降沿 + SCL高,表示開始
STOPSDA上升沿 + SCL高,表示結束
ACK/NACK接收方對字節的響應

八、常見問題

  • 為什么要加上拉電阻?
    因為SDA/SCL為開漏結構,無法主動輸出高電平。
  • 為什么要重復發送START?
    切換讀寫模式或設備地址時,需發START而不是STOP。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76990.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76990.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76990.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Apifox Helper 與 Swagger3 區別

核心定位差異 Apifox Helper 定位:基于 IDEA 的代碼注釋解析工具,與 Apifox 平臺深度集成,實現文檔自動生成接口管理測試協作的一體化流程。 特點: 通過解析 Javadoc、KDoc 等注釋生成文檔,代碼零侵入(無…

單片機實現多線程的方法匯總

在單片機上實現“多線程”的方法有幾種,下面按照從簡單到復雜、從輕量到系統性來列出常見的方案: 🧵 一、偽多線程(最輕量) 方法:主循環 狀態機 / 定時器輪詢 主循環中輪流調用各個任務的處理函數&#x…

網絡:華為數通HCIA學習:靜態路由基礎

文章目錄 前言靜態路由基礎靜態路由應用場景 靜態路由配置靜態路由在串行網絡的配置靜態路由在以太網中的配置 負載分擔配置驗證 路由備份(浮動靜態路由)配置驗證 缺省路由配置驗證 總結 華為HCIA 基礎實驗-靜態路由 & eNSP靜態路由 基礎…

[項目總結] 在線OJ刷題系統項目技術應用(下)

🌸個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵?熱門專欄: 🧊 Java基本語法(97平均質量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection與…

Qt音頻輸出:QAudioOutput詳解與示例

1. 簡介 QAudioOutput是Qt多媒體框架中的一個關鍵類,它提供了將PCM(脈沖編碼調制)原始音頻數據發送到音頻輸出設備的接口。作為Qt多媒體組件的一部分,QAudioOutput允許開發者在應用程序中實現音頻播放功能,支持多種音…

【計算機網絡】Linux配置SNAT/DNAT策略

什么是NAT? NAT 全稱是 Network Address Translation(網絡地址轉換),是一個用來在多個設備共享一個公網 IP上網的技術。 NAT 的核心作用:將一個網絡中的私有 IP 地址,轉換為公網 IP 地址,從而…

Redis淘汰策略詳解!

目錄 一、為什么需要淘汰策略? 🤔二、Redis 的淘汰策略詳解 👇三、如何選擇合適的淘汰策略? 🤔???四、如何切換 Redis 的淘汰策略? ??🔧五、總結 🎉 🌟我的其他文章…

存儲基石:深度解讀Linux磁盤管理機制與文件系統實戰

Linux系列 文章目錄 Linux系列前言一、磁盤1.1 初識磁盤1.2 磁盤的物理結構1.3 磁盤的存儲結構1.4 磁盤的邏輯結構 二、文件系統2.1 系統對磁盤的管理2.2 文件在磁盤中的操作 前言 Linux 文件系統是操作系統中用于管理和組織存儲設備(如硬盤、SSD、USB 等&#xff…

本節課課堂總結

匿名子類: 說明 和 Java 一樣,可以通過包含帶有定義或重寫的代碼塊的方式創建一個匿名的子類。 單例對象(伴生對象) Scala語言是完全面向對象的語言,所以并沒有靜態的操作(即在Scala中沒有靜態的概念&a…

I2C、SPI、UART、CAN 通信協議詳解

一、協議基本特性對比 特性ICSPIUARTCAN通信類型同步、半雙工同步、全雙工異步、全雙工異步、多主多從信號線SDA(數據)、SCL(時鐘)MOSI、MISO、SCK、SS(片選)TX(發送)、RX&#xff…

【diffusers 進階(十五)】dataset 工具,Parquet和Arrow 數據文件格式,load dataset 方法

系列文章目錄 【diffusers 極速入門(一)】pipeline 實際調用的是什么? call 方法!【diffusers 極速入門(二)】如何得到擴散去噪的中間結果?Pipeline callbacks 管道回調函數【diffusers極速入門&#xff0…

第十三章:持久化存儲_《鳳凰架構:構建可靠的大型分布式系統》

第十三章 持久化存儲 一、Kubernetes存儲設計核心概念 (1)存儲抽象模型 PersistentVolume (PV):集群級別的存儲資源抽象(如NFS卷/云存儲盤)PersistentVolumeClaim (PVC):用戶對存儲資源的聲明請求&#…

以太網安全

前言: 端口隔離可實現同一VLAN內端口之間的隔離。用戶只需要將端口加入到隔離組中,就可以實現隔離組內端口之間的二層數據的隔離端口安全是一種在交換機接入層實施的安全機制,旨在通過控制端口的MAC地址學習行為,確保僅授權設備能…

跨域問題前端解決

由于瀏覽器的同源策略,前后端分離的項目,調試的時候總是會遇到跨域的問題,這里通過修改前端代碼解決跨域問題。 首先先查看前端代碼的根目錄下,有沒有vue.config.js文件, 若有,使用方法1,若沒有此文件&…

Elasticsearch 報錯index_closed_exception

index_closed_exception 是 Elasticsearch 中的一個異常類型,它通常發生在嘗試對一個已經被關閉(closed)的索引執行搜索、寫入或其他操作時。在 Elasticsearch 中,索引是用來存儲和檢索數據的邏輯命名空間,可以將其類比…

LearnOpenGL-筆記-其九

今天讓我們完結高級OpenGL的部分: Instancing 很多時候,在場景中包含有大量實例的時候,光是調用GPU的繪制函數這個過程都會帶來非常大的開銷,因此我們需要想辦法在每一次調用GPU的繪制函數時盡可能多地繪制,這個過程就…

PDF預覽-搜索并高亮文本

在PDF.js中實現搜索高亮功能可以通過自定義一些代碼來實現。PDF.js 是一個通用的、基于Web的PDF閱讀器,它允許你在網頁上嵌入PDF文件,并提供基本的閱讀功能。要實現搜索并高亮顯示文本,你可以通過以下幾個步驟來完成: 1. 引入PDF…

二叉樹——隊列bfs專題

1.N叉樹的層序遍歷 我們之前遇到過二叉樹的層序遍歷,只需要用隊列先進先出的特性就可以達到層序遍歷的目的。 而這里不是二叉樹,也就是說讓節點的孩子入隊列時不僅僅是左右孩子了,而是它的所有孩子。而我們看這棵多叉樹的構造,它…

Python高級爬蟲之JS逆向+安卓逆向1.1節-搭建Python開發環境

目錄 引言: 1.1.1 為什么要安裝Python? 1.1.2 下載Python解釋器 1.1.3 安裝Python解釋器 1.1.4 測試是否安裝成功 1.1.5 跟大神學高級爬蟲安卓逆向 引言: 大神薯條老師的高級爬蟲安卓逆向教程: 這套爬蟲教程會系統講解爬蟲的初級&…

Windows 安裝和使用 ElasticSearch

SpringBoot3 整合 Elasticsearch 1. ElasticSearch 1.1 ES (1)ES 是一個開源的分布式搜索和分析引擎,專為處理大模型數據而設計,它能夠實現近乎實時的數據檢索、分析和可視化,廣泛用于全文搜索、日志分析和監控&…