嵌入式硬件篇---IIC


文章目錄

  • 前言
  • 1. I2C協議基礎
    • 1.1 物理層特性
      • 兩根信號線
        • SCL
        • SDA
        • 支持多主多從
      • 標準模式
      • 電平
    • 1.2 通信流程
      • 起始條件(Start Condition)
      • 從機地址(Slave Address)
      • 應答(ACK/NACK)
      • 數據傳輸:
      • 停止條件(Stop Condition)
    • 1.3 典型通信序列
      • 寫數據
      • 讀數據
  • 2. STM32F103RCT6的I2C硬件配置
    • 2.1 硬件連接
    • 2.2 CubeMX配置
  • 3. HAL庫代碼實現
    • 3.1 I2C初始化
    • 3.2 基本讀寫函數
      • (1) 寫入1字節數據
      • (2) 讀取1字節數據
      • (3) 連續讀寫
  • 4. 軟件模擬I2C(GPIO模擬)
    • 4.1 初始化GPIO
    • 4.2 模擬時序函數
  • 5. 常見問題與調試
    • 5.1 I2C通信失敗原因
      • 從機地址錯誤:
      • 上拉電阻未接:
      • 時序問題:
      • 硬件沖突:
    • 5.2 邏輯分析儀抓取波形
  • 6. 完整示例:讀取MPU6050的WHO_AM_I寄存器
  • 總結
    • 硬件I2C
    • 軟件模擬I2C
    • 調試關鍵


前言

I2C(Inter-Integrated Circuit)是一種同步、半雙工串行通信協議,廣泛用于連接微控制器與傳感器、EEPROM低速外設。以下是I2C協議的詳細說明及在STM32F103RCT6上的代碼實現。


1. I2C協議基礎

1.1 物理層特性

兩根信號線

SCL

SCL(Serial Clock):時鐘線,由主機控制。

SDA

SDA(Serial Data):數據線,雙向傳輸。

支持多主多從

支持多主多從:通過地址尋址區分設備。

標準模式

  1. 100 kHz(低速)
  2. 400 kHz(快速模式)
  3. 1 MHz(高速模式,STM32F103支持最高400kHz)

電平

電平:開漏輸出(需外接上拉電阻,通常4.7kΩ)。

1.2 通信流程

起始條件(Start Condition)

SCL高電平時,SDA由高→低。

從機地址(Slave Address)

7位地址 + 1位讀寫方向(0:寫,1:讀)。

應答(ACK/NACK)

每傳輸1字節后,接收方**拉低SDA(ACK)**表示成功。

數據傳輸:

主機發送數據或從機返回數據

停止條件(Stop Condition)

SCL高電平時,SDA由低→高。

1.3 典型通信序列

寫數據

START → 從機地址(寫) → ACK → 寄存器地址 → ACK → 數據 → ACK → STOP

讀數據

START → 從機地址(寫) → ACK → 寄存器地址 → ACK →
START → 從機地址(讀) → ACK → 數據 → NACK → STOP

2. STM32F103RCT6的I2C硬件配置

STM32F103RCT6有2個I2C接口(I2C1、I2C2),支持主/從模式。以下以I2C1(PB6=SCL, PB7=SDA)為例:

2.1 硬件連接

I2C信號 STM32引腳
SCL PB6
SDA PB7
GND 共地
上拉電阻 4.7kΩ至3.3V

2.2 CubeMX配置

啟用I2C1(模式:I2C)。
配置SCL/SDA引腳(PB6/PB7)。
設置時鐘速度(如100kHz)。
啟用中斷(可選,用于事件處理)。

3. HAL庫代碼實現

3.1 I2C初始化

#include "stm32f1xx_hal.h"I2C_HandleTypeDef hi2c1;void MX_I2C1_Init(void) {hi2c1.Instance = I2C1;hi2c1.Init.ClockSpeed = 100000;          // 100kHzhi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;  // 50%占空比hi2c1.Init.OwnAddress1 = 0;              // 主機模式無需地址hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;if (HAL_I2C_Init(&hi2c1) != HAL_OK) {Error_Handler();}
}

3.2 基本讀寫函數

(1) 寫入1字節數據

HAL_StatusTypeDef I2C_WriteByte(uint8_t devAddr, uint8_t regAddr, uint8_t data) {return HAL_I2C_Mem_Write(&hi2c1, devAddr, regAddr, I2C_MEMADD_SIZE_8BIT, &data, 1, 100);
}
參數:
devAddr:從機地址(7位,左對齊,如0x68 << 1)。
regAddr:寄存器地址。
data:待寫入數據。

(2) 讀取1字節數據

HAL_StatusTypeDef I2C_ReadByte(uint8_t devAddr, uint8_t regAddr, uint8_t *data) {return HAL_I2C_Mem_Read(&hi2c1, devAddr, regAddr, I2C_MEMADD_SIZE_8BIT, data, 1, 100);
}

(3) 連續讀寫

// 寫入多字節
HAL_I2C_Mem_Write(&hi2c1, 0x68<<1, 0x00, I2C_MEMADD_SIZE_8BIT, buffer, 4, 100);// 讀取多字節
HAL_I2C_Mem_Read(&hi2c1, 0x68<<1, 0x00, I2C_MEMADD_SIZE_8BIT, buffer, 4, 100);

4. 軟件模擬I2C(GPIO模擬)

如果硬件I2C不可用,可用GPIO模擬:

4.1 初始化GPIO

void I2C_GPIO_Init() {GPIO_InitTypeDef GPIO_InitStruct = {0};// SCL=PB6, SDA=PB7GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD; // 開漏輸出GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);// 初始狀態:SDA和SCL高電平HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6 | GPIO_PIN_7, GPIO_PIN_SET);
}

4.2 模擬時序函數

// 起始信號
void I2C_Start() {SDA_HIGH();SCL_HIGH();Delay_us(5);SDA_LOW();  // SCL高時SDA拉低Delay_us(5);SCL_LOW();  // 準備數據傳輸
}// 停止信號
void I2C_Stop() {SDA_LOW();SCL_HIGH();Delay_us(5);SDA_HIGH(); // SCL高時SDA拉高Delay_us(5);
}// 發送1字節
void I2C_WriteByte(uint8_t data) {for (uint8_t i = 0; i < 8; i++) {SCL_LOW();if (data & 0x80) SDA_HIGH();else SDA_LOW();Delay_us(2);SCL_HIGH();Delay_us(5);SCL_LOW();data <<= 1;}// 等待ACKSDA_HIGH(); // 釋放SDASCL_HIGH();Delay_us(2);if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) { // 檢測ACK// NACK處理}SCL_LOW();
}

5. 常見問題與調試

5.1 I2C通信失敗原因

從機地址錯誤:

確保地址正確(如MPU6050的7位地址是0x68,寫入時左移1位:0x68 << 1)。

上拉電阻未接:

SDA/SCL必須接4.7kΩ上拉電阻

時序問題:

檢查時鐘速度是否匹配(從機是否支持400kHz?)。

硬件沖突:

確保沒有多個設備同時驅動總線

5.2 邏輯分析儀抓取波形

使用Saleae或PulseView觀察:

  1. 起始/停止條件是否正常?
  2. ACK/NACK是否正確?
  3. 數據線是否被意外拉低?

6. 完整示例:讀取MPU6050的WHO_AM_I寄存器

uint8_t who_am_i;
if (HAL_I2C_Mem_Read(&hi2c1, 0x68<<1, 0x75, I2C_MEMADD_SIZE_8BIT, &who_am_i, 1, 100) == HAL_OK) {printf("MPU6050 ID: 0x%02X\n", who_am_i); // 正確應返回0x68
}

總結

硬件I2C

硬件I2C:使用HAL庫的HAL_I2C_Mem_Read/Write最方便。

軟件模擬I2C

軟件模擬I2C:靈活但占用CPU資源。

調試關鍵

調試關鍵:檢查地址、上拉電阻、邏輯分析儀波形
通過上述方法,可穩定實現STM32F103RCT6與I2C設備的通信。


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

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

相關文章

深入探討 Java 注解:從基礎到高級應用

Java 注解自 Java 5 引入以來,已成為現代 Java 開發中不可或缺的一部分。它們通過為代碼添加元數據,簡化了配置、增強了代碼可讀性,并支持了從編譯時驗證到運行時動態行為的多種功能。本文將全面探討 Java 注解的使用、定義和處理方式,并通過一個實際的插件系統示例展示其強…

力扣-105.從前序與中序遍歷序列構造二叉樹

題目描述 給定兩個整數數組 preorder 和 inorder &#xff0c;其中 preorder 是二叉樹的先序遍歷&#xff0c; inorder 是同一棵樹的中序遍歷&#xff0c;請構造二叉樹并返回其根節點。 class Solution { public:TreeNode* buildTree(vector<int>& preorder, vecto…

NoSQL數據庫技術與應用復習總結【看到最后】

第1章 初識NoSQL 1.1 大數據時代對數據存儲的挑戰 1.高并發讀寫需求 2.高效率存儲與訪問需求 3.高擴展性 1.2 認識NoSQL NoSQL--非關系型、分布式、不提供ACID的數據庫設計模式 NoSQL特點 1.易擴展 2.高性能 3.靈活的數據模型 4.高可用 NoSQL擁有一個共同的特點&am…

【ios越獄包安裝失敗?uniapp導出ipa文件如何安裝到蘋果手機】蘋果IOS直接安裝IPA文件

問題場景&#xff1a; 提示&#xff1a;ipa是用于蘋果設備安裝的軟件包資源 設備&#xff1a;iphone 13(未越獄) 安裝包類型&#xff1a;ipa包 調試工具&#xff1a;hbuilderx 問題描述 提要&#xff1a;ios包無法安裝 uniapp導出ios包無法安裝 相信有小伙伴跟我一樣&…

php數據導出pdf,然后pdf轉圖片,再推送釘釘群

public function takePdf($data_plan, $data_act, $file_name, $type){$pdf new \TCPDF(L); // L - 橫向 P-豎向// 設置文檔信息//$file_name 外協批價單;$pdf->SetCreator($file_name);$pdf->SetAuthor($file_name);$pdf->SetTitle($file_name);$pdf->SetSubjec…

每日算法-250513

每日算法 - 2024-05-13 記錄今天學習的算法題解。 2335. 裝滿杯子需要的最短總時長 題目 思路 貪心 這道題的關鍵在于每次操作盡可能多地減少杯子的數量。我們每次操作可以裝一杯或兩杯&#xff08;不同類型&#xff09;。為了最小化總時間&#xff0c;應該優先選擇裝兩杯不同…

城市生命線綜合管控系統解決方案-守護城市生命線安全

一、政策背景 國務院辦公廳《城市安全風險綜合監測預警平臺建設指南》?要求&#xff1a;將燃氣、供水、排水、橋梁、熱力、綜合管廊等納入城市生命線監測體系&#xff0c;建立"能監測、會預警、快處置"的智慧化防控機制。住建部?《"十四五"全國城市基礎…

分布式AI推理的成功之道

隨著AI模型逐漸成為企業運營的核心支柱&#xff0c;實時推理已成為推動這一轉型的關鍵引擎。市場對即時、可決策的AI洞察需求激增&#xff0c;而AI代理——正迅速成為推理技術的前沿——即將迎來爆發式普及。德勤預測&#xff0c;到2027年&#xff0c;超半數采用生成式AI的企業…

auto.js面試題及答案

以下是常見的 Auto.js 面試題及參考答案&#xff0c;涵蓋基礎知識、腳本編寫、運行機制、權限、安全等方面&#xff0c;適合開發崗位的技術面試準備&#xff1a; 一、基礎類問題 什么是 Auto.js&#xff1f;它的主要用途是什么&#xff1f; 答案&#xff1a; Auto.js 是一個…

C語言中的指定初始化器

什么是指定初始化器? C99標準引入了一種更靈活、直觀的初始化語法——指定初始化器(designated initializer), 可以在初始化列表中直接引用結構體或聯合體成員名稱的語法。通過這種方式,我們可以跳過某些不需要初始化的成員,并且可以以任意順序對特定成員進行初始化。這…

高德地圖在Vue3中的使用方法

1.地圖初始化 容器創建&#xff1a;通過 <div> 標簽定義地圖掛載點。 <div id"container" style"height: 300px; width: 100%; margin-top: 10px;"></div> 密鑰配置&#xff1a;綁定高德地圖安全密鑰&#xff0c;確保 API 合法調用。 參…

RabbitMQ發布訂閱模式深度解析與實踐指南

目錄 RabbitMQ發布訂閱模式深度解析與實踐指南1. 發布訂閱模式核心原理1.1 消息分發模型1.2 核心組件對比 2. 交換機類型詳解2.1 交換機類型矩陣2.2 消息生命周期 3. 案例分析與實現案例1&#xff1a;基礎廣播消息系統案例2&#xff1a;分級日志處理系統案例3&#xff1a;分布式…

中小型培訓機構都用什么教務管理系統?

在教育培訓行業快速發展的今天&#xff0c;中小型培訓機構面臨著學員管理復雜、課程體系多樣化、教學效果難以量化等挑戰。一個高效的教務管理系統已成為機構運營的核心支撐。本文將深入分析當前市場上適用于中小型培訓機構的教務管理系統&#xff0c;重點介紹愛耕云這一專業解…

C++虛函數食用筆記

虛函數定義與作用&#xff1a; virtual關鍵字聲明虛函數&#xff0c;虛函數可被派生類override(保證返回類型與參數列表&#xff0c;名字均相同&#xff09;&#xff0c;從而通過基類指針調用時&#xff0c;實現多態的功能 virtual關鍵字: 將函數聲明為虛函數 override關鍵…

運算放大器相關的電路

1運算放大器介紹 解釋&#xff1a;運算放大器本質就是一個放大倍數很大的元件&#xff0c;就如上圖公式所示 Vp和Vn相差很小但是放大后輸出還是會很大。 運算放大器不止上面的三個引腳&#xff0c;他需要獨立供電&#xff1b; 如圖比較器&#xff1a; 解釋&#xff1a;Vp&…

華為OD機試真題——通信系統策略調度(用戶調度問題)(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

2025 B卷 100分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

Ubuntu 系統默認已安裝 python,此處只需添加一個超鏈接即可

步驟 1&#xff1a;確認 Python 3 的安裝路徑 查看當前 Python 3 的路徑&#xff1a; which python3 輸出類似&#xff1a; /usr/bin/python3 步驟 2&#xff1a;創建符號鏈接 使用 ln -s 創建符號鏈接&#xff0c;將 python 指向 python3&#xff1a; sudo ln -s /usr/b…

深度學習-分布式訓練機制

1、分布式訓練時&#xff0c;包括train.py的全部的代碼都會在每個gpu上運行嗎&#xff1f; 在分布式訓練&#xff08;如使用 PyTorch 的 DistributedDataParallel&#xff0c;DDP&#xff09;時&#xff0c;每個 GPU 上運行的進程會執行 train.py 的全部代碼&#xff0c;但通過…

yarn的介紹

### Yarn 的基本概念 Yarn 是 Hadoop 生態系統中的一個重要組成部分&#xff0c;它是一種分布式資源管理框架&#xff0c;旨在為大規模數據處理提供高效的資源管理和調度能力。以下是關于 Yarn 的一些核心概念&#xff1a; #### 1. **Yarn 的定義** Yarn 是一個資源調度平臺&a…

Spring-messaging-MessageHandler接口實現類ServiceActivatingHandler

ServiceActivatingHandler實現了MessageHandler接口&#xff0c;所以它是一個MessageHandler&#xff0c;在spring-integration中&#xff0c;它也叫做服務激活器&#xff08;Service Activitor&#xff09;&#xff0c;因為這個類是依賴spring容器BeanFactory的&#xff0c;所…