零基礎STM32單片機編程入門(九)IIC總線詳解及EEPROM實戰含源碼視頻

文章目錄

    • 一.概要
    • 二.IIC總線基本概念
      • 1.總體特征
      • 2.通訊流程
    • 三.EEPROM介紹
      • 1.M24C08基本介紹
      • 2.向M24C08寫一個字節時序圖
      • 3.從M24C08讀一個字節時序圖
    • 四.GPIO模擬IIC驅動M24C08讀寫
    • 五.CubeMX工程源代碼下載
    • 六.講解視頻鏈接地址
    • 七.小結

一.概要

IIC(Inter-Integrated Circuit)總線是一種由NXP(原PHILIPS)公司開發的兩線式串行總線,用于連接微控制器及其外圍設備。多用于主控制器和從器件間的主從通信,在小數據量場合使用,傳輸距離短,任意時刻只能有一個主機等特性。

二.IIC總線基本概念

I2C 總線,分別由SDA(串行數據線)和SCL(串行時鐘線)及上拉電阻組成。
在這里插入圖片描述

1.總體特征

在這里插入圖片描述

2.通訊流程

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

三.EEPROM介紹

EEPROM( Electrically Erasable Programmable Read Only Memory )全稱是電可擦除可編程只讀存儲器,是非易失存儲器,可以訪問到每個字節,容量比較小。目前的EEPROM一般是IIC接口或者SPI接口的。

1.M24C08基本介紹

M24C08是ST公司(意法半導體公司)的串行接口的EEPROM存儲芯片,它的容量是8K bit。
?在這里插入圖片描述

芯片功能描述:
M24C08系列支持I2C,總線數據傳送協議I2C,總線協議規定任何將數據傳送到總線的器件作為發送器。任何從總線接收數據的器件為接收器;數據傳送是由產生串行時鐘和所有起始停止信號的主器件控制的。主器件和從器件都可以作為發送器或接收器,但由主器件控制傳送數據(發送或接收)的模式。

芯片特性介紹:

1.兩線串行接口(SDA、SCL)

2.有用于硬件數據保護的寫保護引腳

3.自定時寫入周期(5毫秒),因為內部有頁緩沖區,向M24C08寫入數據之后,還需要等待M24C08將緩沖區數據寫入到內部EEPROM區域

4.數據保存可達100年

5.100萬次擦寫周期

6.高數據傳送速率為400KHz、低速100KHZ和IIC總線兼容

7.16字節頁寫緩沖區
這個緩沖區大小與芯片具體型號有關: 8字節頁(1K、2K)、16字節頁(4K、8K、16K)

在這里插入圖片描述

M24C08的E2(3腳)一般接地,E1,E0是容量大點的EEPROM才有,這樣M24C08這個器件,寫操作時候的地址就是0xA0,讀操作時候的地址是0xA1。

2.向M24C08寫一個字節時序圖

寫操作過程中只有ACK是M24C08發出的,其他信號都是單片機發出的。

在這里插入圖片描述

3.從M24C08讀一個字節時序圖

讀操作過程中ACK跟返回的數據是M24C08發出的,其他信號都是單片機發出的。

在這里插入圖片描述

四.GPIO模擬IIC驅動M24C08讀寫

硬件準備:

STLINK接STM32F103C8T6小系統板,STLINK接電腦USB口,
STM32F103C8T6小系統板跟EEPROM模塊連接:
板子G----模塊GND
板子3.3–模塊VCC
板子PB10—模塊SCL
板子PB11—模塊SDA

在這里插入圖片描述
打開STM32CubeMX軟件,新建工程
在這里插入圖片描述
Part Number處輸入STM32F103C8,再雙擊就創建新的工程
在這里插入圖片描述
配置下載口引腳
在這里插入圖片描述
配置外部晶振引腳
在這里插入圖片描述
配置系統主頻
在這里插入圖片描述
配置工程文件名,保存路徑,KEIL5工程輸出方式
在這里插入圖片描述
生成工程
在這里插入圖片描述
用Keil5打開工程
在這里插入圖片描述
添加代碼
在這里插入圖片描述
在這里插入圖片描述
主要代碼

int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();//8M外部晶振,系統主頻72M/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 */EE_IIC_Init();//管腳初始化EE_EE_IIC_SendByteToSlave(0xA0,0x00,0x55);//0地址寫入0x55HAL_Delay(10);//等待10msEE_IIC_ReadByteFromSlave(0xA0,0x00,&EEDATA);//從0地址讀取內容存儲到變量/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}#include "main.h"
#define	EE_ADDR 0xa0		
#define EE_SCL_PIN  GPIO_PIN_10   //模擬IIC的SCL信號  1.修改引腳即可修改IIC接口
#define EE_SDA_PIN  GPIO_PIN_11   //模擬IIC的SDA信號void EE_SDA_IN(void) 	//配置成輸入  {  GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_11;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
} 
void EE_SDA_OUT(void)//配置成輸出
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_11;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);}void EE_SCK_OUT(void) //配置成輸出
{GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}#define EE_IIC_SCL(val)         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10,val)                   //SCL      2.修改引腳即可修改IIC接口        
#define EE_IIC_SDA(val)         HAL_GPIO_WritePin(GPIOB, GPIO_PIN_11,val)                    //SDA	unsigned char EE_READ_SDA(void)
{
return HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11);
}	/******************************************************************************
*函  數:void EE_IIC_Delay(void)
*功 能:IIC延時
*參  數:無
*返回值:無
*備  注: 移植時只需要將EE_IIC_Delay()換成自己的延時即可
*******************************************************************************/	
void EE_IIC_Delay(uint8_t us)
{for(int i = 0; i < 20; i++)    {__asm("NOP");//core bus 160M  情況下大概IIC速率 400K}}
/******************************************************************************
*函  數:void IIC_Init(void)
*功 能:IIC初始化
*參  數:無
*返回值:無
*備  注:無
*******************************************************************************/void EE_IIC_Init(void)
{			__HAL_RCC_GPIOB_CLK_ENABLE();EE_SCK_OUT();EE_SDA_OUT();EE_IIC_SCL(1);EE_IIC_SDA(1);}void EE_IIC_Start(void)
{EE_SDA_OUT(); //sda線輸出 EE_IIC_SDA(1);	EE_IIC_SCL(1);EE_IIC_Delay(4);EE_IIC_SDA(0); //START:when CLK is high,DATA change form high to low EE_IIC_Delay(4);EE_IIC_SCL(0); //鉗住I2C總線,準備發送或接收數據 
}void EE_IIC_Stop(void)
{EE_SDA_OUT(); //sda線輸出EE_IIC_SCL(0);EE_IIC_SDA(0); //STOP:when CLK is high DATA change form low to highEE_IIC_Delay(4);EE_IIC_SCL(1); EE_IIC_SDA(1); //發送I2C總線結束信號EE_IIC_Delay(4);							   	
}uint8_t EE_IIC_WaitAck(void)
{uint8_t ucErrTime=0;EE_SDA_IN(); //SDA設置為輸入  (從機給一個低電平做為應答) EE_IIC_SDA(1);EE_IIC_Delay(1);	   EE_IIC_SCL(1);EE_IIC_Delay(1);;	 while(EE_READ_SDA()){ucErrTime++;if(ucErrTime>250){EE_IIC_Stop();return 1;}}EE_IIC_SCL(0); //時鐘輸出0 	   return 0;  
} void EE_IIC_Ack(void)
{EE_IIC_SCL(0);EE_SDA_OUT();EE_IIC_SDA(0);EE_IIC_Delay(1);EE_IIC_SCL(1);EE_IIC_Delay(2);EE_IIC_SCL(0);
}void EE_IIC_NAck(void)
{EE_IIC_SCL(0);EE_SDA_OUT();EE_IIC_SDA(1);EE_IIC_Delay(1);EE_IIC_SCL(1);EE_IIC_Delay(1);EE_IIC_SCL(0);
}					 				     void EE_IIC_SendByte(uint8_t data)
{                        uint8_t t;   EE_SDA_OUT(); 	    EE_IIC_SCL(0); //拉低時鐘開始數據傳輸for(t=0;t<8;t++){              EE_IIC_SDA((data&0x80)>>7);EE_IIC_Delay(1);			EE_IIC_SCL(1);data<<=1;EE_IIC_Delay(1);EE_IIC_SCL(0);	   }EE_IIC_Delay(1);
} 	 uint8_t EE_IIC_ReadByte(uint8_t ack)
{uint8_t i,receive=0;EE_SDA_IN(); //SDA設置為輸入模式 等待接收從機返回數據for(i=0;i<8;i++ ){EE_IIC_SCL(0); EE_IIC_Delay(1);EE_IIC_SCL(1);receive<<=1;if(EE_READ_SDA())receive++; //從機發送的電平EE_IIC_Delay(1); }					 if(ack)EE_IIC_Ack(); //發送ACK elseEE_IIC_NAck(); //發送nACK  return receive;
}uint8_t EE_IIC_ReadByteFromSlave(uint8_t I2C_Addr,uint8_t reg,uint8_t *buf)
{EE_IIC_Start();	EE_IIC_SendByte(I2C_Addr);	 //發送從機地址if(EE_IIC_WaitAck()) //如果從機未應答則數據發送失敗{EE_IIC_Stop();return 1;}EE_IIC_SendByte(reg); //發送寄存器地址EE_IIC_WaitAck();	  EE_IIC_Start();EE_IIC_SendByte(I2C_Addr+1); //進入接收模式			   EE_IIC_WaitAck();*buf=EE_IIC_ReadByte(0);	   EE_IIC_Stop(); //產生一個停止條件return 0;
}uint8_t EE_EE_IIC_SendByteToSlave(uint8_t I2C_Addr,uint8_t reg,uint8_t data)
{EE_IIC_Start();EE_IIC_SendByte(I2C_Addr); //發送從機地址if(EE_IIC_WaitAck()){EE_IIC_Stop();return 1; //從機地址寫入失敗}EE_IIC_SendByte(reg); //發送寄存器地址EE_IIC_WaitAck();	  EE_IIC_SendByte(data); if(EE_IIC_WaitAck()){EE_IIC_Stop(); return 1; //數據寫入失敗}EE_IIC_Stop(); //產生一個停止條件return 0;
}

五.CubeMX工程源代碼下載

鏈接:https://pan.baidu.com/s/1MMYww6IgUNa3wPaN-pWqdw
提取碼:d39f
如果鏈接失效,可以聯系博主給最新鏈接

程序下載下來之后解壓就行

六.講解視頻鏈接地址

IIC總線講解

七.小結

學會使用模擬IIC,能適應各種平臺,不管是STM32的單片機,還是其他牌子的單片機,都能很快實現對EEPROM等IIC總線的設備進行數據讀寫。

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

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

相關文章

黑馬|最新AI+若依 |初識項目

本章主要內容是&#xff1a; 1.快速搭建了若依前后端項目在本地 2.實現了單表的增刪改查快速生成 文章目錄 介紹1.若依介紹2.若依的不同版本3.項目運行環境 初始化前后端項目1.下載若依項目2.初始化后端a.把表導入到數據庫中b.更改application.yml文件 3.初始化前端a.安裝依賴…

基于LoFTR_TRT項目實現LoFTR模型的trt推理與onnx推理,3060顯卡下320圖像30ms一組圖

本博文主要記錄了使用LoFTR_TRT項目將LoFTR模型導出為onnx模型&#xff0c;然后將onnx模型轉化為trt模型。并分析了LoFTR_TRT與LoFTR的基本代碼差異&#xff0c;但從最后圖片效果來看是與官網demo基本一致的&#xff0c;具體可以查看上一篇博客記錄。最后記錄了onnx模型的使用【…

WebAssembly場景及未來

引言 從前面的文章中&#xff0c;我們已經了解了 WebAssembly&#xff08;WASM&#xff09; 的基本知識&#xff0c;演進歷程&#xff0c;以及簡單的使用方法。通過全面了解了WebAssembly的設計初衷和優勢&#xff0c;我們接下來要知道在什么樣的場景中我們會使用 WASM 呢&…

在門店里造綠色氧吧!康養行業也這么卷了?

拼啥不如拼健康&#xff0c;現在的人算是活明白了&#xff0c;不但中老年人這樣想&#xff0c;年輕人也這樣干。你可能不知道&#xff0c;現在眾多健康養生門店&#xff0c;逐漸成了年輕人“組團養生”的好去處&#xff0c;也是他們吃喝玩樂之外的新興消費趨勢。 而在看得見的…

原理圖設計工作平臺:capture和capture CIS的區別在于有沒有CIS模塊

1環境:design entry CIS 2.參數設置命令options——preference&#xff08;7個選項卡colors/print&#xff0c;grid display&#xff0c;miscellaneous&#xff0c;pan and zoom&#xff0c;select&#xff0c;text editor和board simulation&#xff09; 1)顏色設置colors/p…

應急響應--網站(web)入侵篡改指南

免責聲明:本文... 目錄 被入侵常見現象: 首要任務&#xff1a; 分析思路&#xff1a; 演示案例: IIS&.NET-注入-基于時間配合日志分析 Apache&PHP-漏洞-基于漏洞配合日志分析 Tomcat&JSP-弱口令-基于后門配合日志分析 (推薦) Webshell 查殺-常規后門&…

linux內核定時器

文章目錄 一、jiffies定時器1.1 工作原理1.2 timer_list結構體1.3 相關接口1.3.1 初始化和啟動定時器1.3.2 修改定時器1.3.3 刪除定時器1.3.4 jiffies相關接口 二、高精度定時器2.1 hrtimer結構體2.2 相關接口2.2.1 初始化和啟動定時器2.2.2 取消定時器2.2.3 通過定時器實現周期…

shell-awk語法整理

shell-awk語法整理 前言基本語法內置變量1. $02. NF3. NR4. FS5. RS6. OFS7. ORS8. FILENAME9. FNR10. ARGV11. ENVIRON12. IGNORECASE13. RSTART 和 RLENGTH示例解釋 內置函數循環語句&#xff08;后面的;可不加&#xff09;條件語句高級特性示例 特殊模式BEGINEND組合示例BEG…

R語言實戰—圓形樹狀圖

話不多說&#xff0c;先看最終效果&#xff1a; 圓形樹狀圖是樹狀圖的一個變型&#xff0c;其實都是層次聚類。 接下來看代碼步驟&#xff1a; 首先要先安裝兩個包&#xff1a; install.packages("ggtree") install.packages("readxl") 咱就別問問什么…

29、php實現和為S的兩個數字(含源碼)

題目&#xff1a;php 實現 和為S的兩個數字 描述&#xff1a; 輸入一個遞增排序的數組和一個數字S&#xff0c;在數組中查找兩個數&#xff0c; 是的他們的和正好是S&#xff0c;如果有多對數字的和等于S&#xff0c;輸出兩個數的乘積最小的。 輸出描述&#xff1a; 對應每個測…

go zero入門

一、goctl安裝 goctl 是 go-zero 的內置腳手架&#xff0c;可以一鍵生成代碼、文檔、部署 k8s yaml、dockerfile 等。 # Go 1.16 及以后版本 go install github.com/zeromicro/go-zero/tools/goctllatest檢查是否安裝成功 $ goctl -v goctl version 1.6.6 darwin/amd64vscod…

vue2響應式原理+模擬實現v-model

效果 簡述原理 配置對象傳入vue實例 模板解析&#xff0c;遍歷出所有文本節點&#xff0c;利用正則替換插值表達式為真實數據 data數據代理給vue實例&#xff0c;以后通過this.xxx訪問 給每個dom節點增加觀察者實例&#xff0c;由觀察者群組管理&#xff0c;內部每一個鍵值…

sqlite 數據庫 介紹

文章目錄 前言一、什么是 SQLite &#xff1f;二、語法三、SQLite 場景四、磁盤文件 前言 下載 目前已經出到了&#xff0c; Version 3.46.0 SQLite&#xff0c;是一款輕型的數據庫&#xff0c;是遵守ACID的關系型數據庫管理系統&#xff0c;它包含在一個相對小的C庫中。它是…

VMware虛擬機配置橋接網絡

轉載&#xff1a;虛擬機橋接網絡配置 一、VMware三種網絡連接方式 VMware提供了三種網絡連接方式&#xff0c;VMnet0, VMnet1, Vmnet8&#xff0c;分別代表橋接&#xff0c;Host-only及NAT模式。在VMware的編輯-虛擬網絡編輯器可看到對應三種連接方式的設置&#xff08;如下圖…

美好生活的 100 條建議

簡介 一些簡潔明了的人生建議&#xff0c;易于理解&#xff0c;并且能夠為日常生活中的各個方面提供實用的指導。 財富 (Possessions) 1. If you want to find out about people’s opinions on a product, google \reddit. You’ll get real people arguing, as compared t…

SpringBoot2.2.6使用spring-boot-validation讀取不到自定義配置文件中的屬性

SpringBoot2.2.6沒有做message.properties文件中屬性的自動讀取配置。解決方法有兩種&#xff1a; 1. 升級springboot版本到2.6.x以上 2. 在現有springboot版本的基礎上添加以下自定義配置&#xff1a; Configuration public class RequestParamValidationConfig implements…

學習筆記——交通安全分析12

目錄 前言 當天學習筆記整理 4信控交叉口交通安全分析 結束語 前言 #隨著上一輪SPSS學習完成之后&#xff0c;本人又開始了新教材《交通安全分析》的學習 #整理過程不易&#xff0c;喜歡UP就點個免費的關注趴 #本期內容接上一期11筆記 當天學習筆記整理 4信控交叉口交…

ORA-03115 ORA-06594--空間不足 rman 磁帶壓縮備份 控制文件恢復后備份信息丟失

---用舊的控制文件恢復后 這個控制文件本身的備份信息不在此還原出的控制文件中。所以這個備份的控制文件就刪不掉&#xff0c;看不到。 但是只要設置正確的dbid&#xff0c;還是可以用恢復這個控制文件的 正常未恢復過controlfile的話&#xff0c;這個控制文件備份信息在現有…

Square Root SAM論文原理

文章目錄 Square Root SAM論文原理核心原理SLAM問題的3種表示貝葉斯網絡因子圖&#xff08;Factor graph&#xff09;馬爾科夫隨機場(Markov Random Field, MRF) SLAM最小二乘問題&線性化因式分解 factorization矩陣與圖(Matrices ? Graphs)因式分解&變量消元(Factori…

Kafka系列之Kafka知識超強總結

一、Kafka簡介 Kafka是什么 Kafka是一種高吞吐量的分布式發布訂閱消息系統&#xff08;消息引擎系統&#xff09;&#xff0c;它可以處理消費者在網站中的所有動作流數據。 這種動作&#xff08;網頁瀏覽&#xff0c; 搜索和其他用戶的行動&#xff09;是在現代網絡上的許多社…