STM32 I2C驅動開發全解析:從理論到實戰 | 零基礎入門STM32第五十步

主題內容教學目的/擴展視頻
I2C總線電路原理,跳線設置,I2C協議分析。驅動程序與調用。熟悉I2C總線協議,熟練調用。

師從洋桃電子,杜洋老師


📑文章目錄

    • 引言
    • 一、I2C驅動分層架構
    • 二、I2C總線驅動代碼精析
      • 2.1 初始化配置(i2c.c)
      • 2.2 數據發送函數(I2C_SAND_BUFFER)
      • 2.3 數據接收函數(I2C_READ_BUFFER)
    • 三、總線速度配置原理
    • 四、用戶應用實戰(main.c)
    • 五、器件驅動開發(LM75A示例)
      • 5.1 溫度讀取函數
    • 六、常見問題排查指南
    • 七、進階優化技巧
    • 八、相關資源
    • 總結


▲ 回顧上期🔍STM32入門之I2C總線應用詳解(附LM75A溫度傳感器實戰) | 零基礎入門STM32第四十九步


引言

I2C總線是嵌入式系統中廣泛使用的通信協議,具有接線簡單、多設備共享總線等優點。本文將深入解析STM32的I2C驅動開發,通過分層架構設計代碼逐行分析實戰案例演示,幫助開發者快速掌握I2C通信的核心技術。


一、I2C驅動分層架構

用戶應用層 main.c
器件驅動層 LM75A
總線驅動層 i2c.c
硬件抽象層 stm32f10x_i2c.c
硬件寄存器
  1. 硬件抽象層(HAL)
    ST官方提供的固件庫(如stm32f10x_i2c.c),直接操作寄存器實現基礎功能。
  2. 總線驅動層
    封裝I2C協議的核心操作(發送/接收數據),提供I2C_Configuration()等接口。
  3. 器件驅動層
    針對具體外設(如LM75A溫度傳感器)的驅動實現。
  4. 用戶應用層
    調用驅動函數實現業務邏輯,如溫度顯示。

二、I2C總線驅動代碼精析

2.1 初始化配置(i2c.c)

void I2C_Configuration(void) {// GPIO配置:SCL=PB6, SDA=PB7GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_OD;  // 復用開漏模式GPIO_Init(GPIOB, &GPIO_InitStruct);// I2C參數配置I2C_InitStruct.I2C_ClockSpeed = 100000;       // 100kHz標準模式I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2; // 時鐘占空比I2C_Init(I2C1, &I2C_InitStruct);I2C_Cmd(I2C1, ENABLE);                        // 使能I2C
}
  • 關鍵點
    • GPIO必須配置為復用開漏模式(支持總線仲裁)
    • 時鐘速度需匹配從機設備(如LM75A支持400kHz)

2.2 數據發送函數(I2C_SAND_BUFFER)

void I2C_SAND_BUFFER(u8 SlaveAddr, u8 WriteAddr, u8* pBuffer, u16 NumByteToWrite) {I2C_GenerateSTART(I2C1, ENABLE);              // 發送起始信號while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // 等待EV5I2C_Send7bitAddress(I2C1, SlaveAddr, I2C_Direction_Transmitter); // 發送設備地址while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); // 等待EV6I2C_SendData(I2C1, WriteAddr);                // 發送寄存器地址while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // 等待EV8while(NumByteToWrite--) {                     // 循環發送數據I2C_SendData(I2C1, *pBuffer++);while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));}I2C_GenerateSTOP(I2C1, ENABLE);               // 發送停止信號
}
  • 協議流程
    1. 起始信號 → 2. 發送地址+寫方向 → 3. 發送寄存器地址 → 4. 發送數據 → 5. 停止信號

2.3 數據接收函數(I2C_READ_BUFFER)

MCU Slave START + 設備地址(寫) 寄存器地址 REPEATED START + 設備地址(讀) 數據字節1 (ACK) 數據字節2 (NACK) STOP MCU Slave

三、總線速度配置原理

i2c.h中定義總線速率:

#define BusSpeed 200000  // 200kHz
  • 計算公式

SCL頻率 = APB1時鐘頻率 2 × ( I2C_ClockSpeed + 1 ) \text{SCL頻率} = \frac{\text{APB1時鐘頻率}}{2 \times (\text{I2C\_ClockSpeed} + 1)} SCL頻率=2×(I2C_ClockSpeed+1)APB1時鐘頻率?

  • 注意事項
    • APB1時鐘需在初始化時正確配置(默認為36MHz)
    • 實際速率可通過示波器測量SCL引腳驗證

四、用戶應用實戰(main.c)

int main(void) {u8 tempData[3];I2C_Configuration();          // 初始化I2CTM1640_Init();                // 初始化顯示模塊while(1) {LM75A_GetTemp(tempData);  // 讀取溫度// 顯示溫度值(示例代碼略)delay_ms(200);            // 控制采樣頻率}
}
  • 調用鏈
    main()LM75A_GetTemp()I2C_READ_BUFFER() → 硬件寄存器操作

五、器件驅動開發(LM75A示例)

5.1 溫度讀取函數

void LM75A_GetTemp(u8 *Tempbuffer) {u8 rawData[2];I2C_READ_BUFFER(LM75A_ADD, 0x00, rawData, 2); // 讀取原始數據// 數據解析(示例)int16_t temp = (rawData[0] << 8) | rawData[1];temp = temp >> 5;  // 有效數據為11位*Tempbuffer = temp * 0.125;  // 轉換為實際溫度值
}
  • 關鍵參數
    • LM75A_ADD = 0x9E(包含R/W位)
    • 溫度數據為16位(高11位有效)

六、常見問題排查指南

現象可能原因解決方案
總線無響應1. 硬件連接錯誤檢查SCL/SDA上拉電阻(4.7kΩ)
數據校驗失敗2. 時序不匹配降低時鐘速度或調整延時
重復地址沖突3. 從機地址配置錯誤使用I2C掃描工具檢測設備地址

七、進階優化技巧

  1. DMA傳輸
    使用DMA減少CPU占用:
    I2C_DMACmd(I2C1, I2C_DMAReq_Tx | I2C_DMAReq_Rx, ENABLE);
    
  2. 錯誤恢復機制
    檢測總線忙狀態時自動復位:
    if(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)) {I2C_SoftwareResetCmd(I2C1, ENABLE);I2C_SoftwareResetCmd(I2C1, DISABLE);
    }
    

八、相關資源

[1] 洋桃電子B站課程-STM32入門100步
[2] STM32F103xx官方數據手冊
[3] STM32F103X8-B數據手冊(中文)
[4] STM32F103固件函數庫用戶手冊(中文)
[5] I2C總線規范(中文)
[6] LM75(溫度傳感器)數據手冊+編程說明+應用
[7] 溫度傳感器數碼管顯示程序
[8] I2C驅動程序分析.pptx


總結

本文從STM32的I2C驅動架構出發,詳細解析了總線初始化、數據收發和速度配置的實現原理,并結合LM75A溫度傳感器展示了實際應用場景。掌握以下核心要點:

  1. 分層架構設計提升代碼可維護性
  2. 嚴格遵循I2C協議時序
  3. 合理配置總線速率匹配外設
  4. 善用調試工具(如邏輯分析儀)驗證通信波形

通過理論結合實踐的方式,開發者能夠快速構建穩定可靠的I2C通信系統。


💬 技術討論(請在評論區留言~)

📌 下期預告:下一期將探討LM75A驅動程序分析,歡迎持續關注!

點擊查閱🔍往期【STM32專欄】文章

版權聲明:本文采用[CC BY-NC-SA 4.0]協議,轉載請注明來源
實測開發版:洋桃1號開發版(基于STM32F103C8T6)
更新日志

  • v1.0 初始版本(2025-03-07)

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

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

相關文章

Vercel Serverless

1. 引言 現代應用程序是為適應當前技術環境需求而設計的軟件&#xff0c;采用現代開發工具和實踐&#xff0c;針對云部署和可擴展性優化。它們由多個模塊化小組件組成&#xff0c;便于集成和縮放&#xff0c;具有高度的敏捷性和適應性&#xff0c;能快速響應用戶或業務需求變化…

國產操作系統之系統分區及分區的作用

國產操作系統之系統分區及分區的作用和掛載 Linux的系統分區跟Windows有著本質區別,在windows中大家知道c盤一般為系統盤,除c盤系統盤外,我們再分為D、E等文件存儲盤,而在Linux中雖然是以文件目錄著稱的系統,但思路也一樣的,比如針對系統分區中 /home、/var 和 /opt 等文…

字節碼是由什么組成的?

Java字節碼是Java程序編譯后的中間產物&#xff0c;它是一種二進制格式的代碼&#xff0c;可以在Java虛擬機&#xff08;JVM&#xff09;上運行。理解字節碼的組成有助于我們更好地理解Java程序的運行機制。 1. Java字節碼是什么&#xff1f; 定義 Java字節碼是Java源代碼經過…

微前端框架 Qiankun 的應用及問題分析

一、Qiankun 的核心應用場景與優勢 多技術棧共存與靈活集成 Qiankun 支持主應用與子應用使用不同技術棧&#xff08;如 Vue、React、Angular 等&#xff09;&#xff0c;通過 HTML Entry 方式接入子應用&#xff0c;無需深度改造子應用即可實現集成&#xff0c;降低了技術遷移成…

function uuid_generate_v4()不存在(二)

說明&#xff1a;之前代碼里用到了postgresql內嵌函數uid_generate_v4()生成記錄的主鍵&#xff0c;提示該函數不存在&#xff0c;寫了下面這篇博客記錄了一下&#xff0c;今天又發現了新的問題&#xff0c;于是補充了這篇博客。 function uuid_generate_v4()不存在&#xff0…

6. 機器人實現遠程遙控(具身智能機器人套件)

1. 啟動控制腳本 遠程作到 Raspberry Pi 中&#xff0c;并運行以下腳本&#xff1a; conda activate lerobotpython lerobot/scripts/control_robot.py \--robot.typelekiwi \--control.typeremote_robot登錄筆記本電腦上&#xff0c;同時運行以下腳本&#xff1a; conda ac…

【簡單的C++圍棋游戲開發示例】

C圍棋游戲開發簡單示例&#xff08;控制臺版&#xff09; ?核心代碼實現? #include <iostream> #include <vector> #include <queue> using namespace std;const int SIZE 9; // 簡化棋盤為9x9?:ml-citation{ref"1" data"citationList&…

RK3568平臺(音頻篇)audio_policy_volumes_drc.xml解析

audio_policy_volumes_drc.xml 是 Android 系統中用于配置音頻策略和音量的 XML 文件。它定義了音頻流的音量曲線、動態范圍控制(DRC)參數以及音頻設備的音量設置。該文件通常位于 /vendor/etc/ 或 /system/etc/ 目錄下,是 Android 音頻框架的重要組成部分。 以下是對 audi…

如何下載安裝 PyCharm?

李升偉 整理 一、下載 PyCharm 訪問官網 打開 PyCharm 官網&#xff0c;點擊 "Download" 按鈕25。 版本選擇&#xff1a; 社區版&#xff08;Community&#xff09;&#xff1a;免費使用&#xff0c;適合個人學習和基礎開發。 專業版&#xff08;Professional&#…

leetcode day27 455+376

455 分發餅干 假設你是一位很棒的家長&#xff0c;想要給你的孩子們一些小餅干。但是&#xff0c;每個孩子最多只能給一塊餅干。 對每個孩子 i&#xff0c;都有一個胃口值 g[i]&#xff0c;這是能讓孩子們滿足胃口的餅干的最小尺寸&#xff1b;并且每塊餅干 j&#xff0c;都有…

HPC超算系列2——新手指南1

一&#xff0c;平臺簡介&#xff1a; 主要是官方手冊指南、B站視頻&#xff08;培訓視頻、軟件視頻&#xff09; 1&#xff0c;超算平臺架構&#xff1a; 和普通的家用電腦的架構不同&#xff0c; 主要區別在于&#xff1a;層次化的結構 &#xff08;1&#xff09;超算是有…

K8S單機部署

主線 :部署簡單的單節點k8s - sowler - 博客園 學習網址&#xff1a;為什么我不能獲取到鏡像&#xff0c;ImagePullBackoff | Kuboard docker鏡像源&#xff1a;https://chuxia.blog.csdn.net/article/details/145090710?spm1001.2101.3001.6650.3&utm_mediumdistribute…

web3區塊鏈

Web3 是指下一代互聯網&#xff0c;也被稱為“去中心化互聯網”或“區塊鏈互聯網”。它是基于區塊鏈技術構建的&#xff0c;旨在創建一個更加開放、透明和用戶主導的網絡生態系統。以下是關于 Web3 的一些關鍵點&#xff1a; ### 1. **核心概念** - **去中心化**&#xff1…

SQL Server核心知識總結

SQL Server核心知識總結 &#x1f3af; 本文總結了SQL Server核心知識點,每個主題都提供實際可運行的示例代碼。 一、SQL Server基礎精要 1. 數據庫核心操作 -- 1. 創建數據庫&#xff08;核心配置&#xff09; CREATE DATABASE 學生管理系統 ON PRIMARY (NAME 學生管理系統…

android 支持自定義布局、線程安全、避免內存泄漏的 Toast 工具類

支持自定義布局&#xff1a;可以靈活地顯示自定義樣式的 Toast。 線程安全&#xff1a;確保在主線程中顯示 Toast&#xff0c;避免崩潰。 避免內存泄漏&#xff1a;使用 ApplicationContext 和取消機制&#xff0c;防止內存泄漏問題。 工具類&#xff1a;作為一個通用的工具…

嵌入式人工智能應用-第6章 人臉檢測

嵌入式人工智能應用 人臉檢測 嵌入式人工智能應用1 人臉檢測1.1 CNN 介紹1.2 人臉檢測原理1.3 MTCNN介紹1.4 NCNN介紹2 系統安裝2.1 安裝依賴庫NCNN2.2 運行對應的庫3 總結1 人臉檢測 1.1 CNN 介紹 卷積神經網絡。卷積是什么意思呢?從數學上說,卷積是一種運算。它是我們學習…

RocketMQ提供了哪些過濾機制?

前言 本篇文章比較簡單&#xff0c;分別介紹RocketMQ支持幾種過濾機制&#xff0c;其原理和使用。 RocketMQ 提供了多種消息過濾機制&#xff0c;幫根據業務需求高效篩選消息&#xff0c;可以減少不必要的消息傳輸和處理。以下是其核心過濾機制及使用場景&#xff1a; 1. Tag…

Redis數據結構深度解析:從String到Stream的奇幻之旅(一)

Redis系列文章 《半小時掌握Redis核心操作&#xff1a;從零開始的實戰指南》-CSDN博客 Redis數據結構深度解析&#xff1a;從String到Stream的奇幻之旅&#xff08;一&#xff09;-CSDN博客 Redis數據結構深度解析&#xff1a;從String到Stream的奇幻之旅&#xff08;二&…

【Java開發指南 | 第三十五篇】Maven + Tomcat Web應用程序搭建

讀者可訂閱專欄&#xff1a;Java開發指南 |【CSDN秋說】 文章目錄 前言Maven Tomcat Web應用程序搭建1、使用Maven構建新項目2、單擊項目&#xff0c;連續按兩次shift鍵&#xff0c;輸入"添加"&#xff0c;選擇"添加框架支持"3、選擇Java Web程序4、點擊&…

機器始終是一個機器:技術本質與哲學邊界

機器始終是一個機器&#xff1a;技術本質與哲學邊界 這句話揭示了人工智能發展中的核心矛盾——無論技術如何進步&#xff0c;機器的本質仍是基于規則與數據的計算系統。這種「機器性」既是其能力的源泉&#xff0c;也是其與生命體智能不可逾越的邊界的根源。以下從技術本質、…