導航:首頁 > 器材知識 > i2c設備接多少個

i2c設備接多少個

發布時間:2025-02-28 06:37:38

1. I2C協議(上)——基礎介紹

I2C協議由Philips提出,廣泛應用於系統內部多個IC之間的通訊。

I2C是一個支持多個設備的匯流排,包含SDA(雙向串列數據線)和SCL(串列時鍾線)。每個設備有一個獨立地址,主機通過此地址訪問不同設備。主機通過SDA發送設備地址(SLAVE_ADDRESS),SLAVE_ADDRESS通常為7位或10位,第8位或11位表示數據傳輸方向(寫或讀)。數據在SCL高電平時穩定,SDA高電平表示「1」,低電平表示「0」;SCL低電平時SDA電平切換。數據傳輸格式規定每個位元組為8位,總位元組數不限,每個位元組後跟響應位。MSB位首先傳輸。若從機忙於其他功能,如中斷服務程序,SCL需保持低電平,迫使主機等待。數據接收方收到位元組後給出「應答(ACK)」或「非應答(NACK)」響應。

通訊過程涉及不斷更新狀態寄存器I2C_SRx,可通過讀取相應位了解通訊狀態。主發送器流程包括發送設備地址、等待應答、傳輸數據、結束通訊。接收數據(讀數據)過程包含兩次起始信號,第一次找到從設備後,向從設備寫入讀取數據地址,第二次開始讀取數據。要深入了解I2C協議,參考《I2C匯流排協議》文檔,不論在何種晶元上開發,都遵循同一協議標准。後續文章將介紹硬體I2C和GPIO模擬I2C的讀寫實驗。

2. STM32CubeMX學習筆記(9)——I2C介面使用(讀寫EEPROM AT24C02)

一、I2C簡介

I2C(Inter-Integrated Circuit ,內部集成電路) 匯流排是一種由飛利浦 Philip 公司開發的串列匯流排。是兩條串列的匯流排,它由一根數據線(SDA)和一根 時鍾線(SDL)組成。I2C 匯流排上可以接多個 I2C 設備,每個器件都有一個唯一的地址識別。同一時間只能有一個主設備,其他為從設備。通常 MCU 作為主設備控制,外設作為從設備。

STM32 的 I2C 外設可用作通訊的主機及從機,支持 100Kbit/s 和 400Kbit/s 的速率,支持 7 位、10 位設備地址,支持 DMA 數據傳輸,並具有數據校驗功能。它的 I2C 外設還支持 SMBus2.0 協議,SMBus 協議與 I2C 類似,主要應用於筆記本電腦的電池管理中。

二、引腳分布

STM32 晶元有多個 I2C 外設,它們的 I2C 通訊信號引出到不同的 GPIO 引腳上,使用時必須配置到這些指定的引腳。PB8 PB9 為重映射。

三、EEPROM晶元

開發板中的 EEPROM 晶元型號:AT24C02。AT24C 系列為美國 ATMEL 公司推出的串列 COMS 型 EEPROM。晶元型號後兩位表示晶元容量,例如 ATC24C02 為 2K。引腳圖中 A0、A1、A2 為器件地址引腳,GND為地,VCC為正電源,WP為防寫,SCL為串列時鍾線,SDA為串列數據線。

EEPROM 晶元中 WP 引腳具有防寫功能,當該引腳電平為高時,禁止寫入數據,當引腳為低電平時,可寫入數據,我們直接接地,不使用防寫功能。AT24Cxx 設備地址為如下,前四位固定為 1010,A2~A0為由管腳電平決定。AT24Cxx EEPROM Board模塊中默認為接地。A2~A0 為 000,最後一位 R/W 表示讀寫操作。所以由於 I2C 通訊時常常是地址跟讀寫方向連在一起構成一個 8 位數,且當 R/W 位為 0 時,表示寫方向,所以加上 7 位地址,其值為 0xA0,常稱該值為 I2C 設備的「寫地址」;當 R/W 位為 1 時,表示讀方向,加上 7 位地址,其值為 0xA1,常稱該值為「讀地址」。

四、新建工程

1. 打開 STM32CubeMX 軟體,點擊「新建工程」

2. 選擇 MCU 和封裝

3. 配置時鍾 RCC 設置,選擇 HSE(外部高速時鍾) 為 Crystal/Ceramic Resonator(晶振/陶瓷諧振器)選擇 Clock Configuration,配置系統時鍾 SYSCLK 為 72MHz 修改 HCLK 的值為 72 後,輸入回車,軟體會自動修改所有配置

4. 配置調試模式 非常重要的一步,否則會造成第一次燒錄程序後續無法識別調試器 SYS 設置,選擇 Debug 為 Serial Wire

五、I2C15.1 參數配置

在 Connectivity 中選擇 I2C1 設置,並選擇 I2C 內部集成電路I2C 為默認設置不作修改。只需注意一下,I2C 為標准模式,I2C 傳輸速率 (I2C Clock Speed) 為 100KHz。

5.2 生成代碼

輸入項目名和項目路徑選擇應用的 IDE 開發環境 MDK-ARM V5每個外設生成獨立的 』.c/.h』 文件 不勾:所有初始化代碼都生成在 main.c 勾選:初始化代碼生成在對應的外設文件。 如 GPIO 初始化代碼生成在 gpio.c 中。點擊 GENERATE CODE 生成代碼

5.3 添加全局變數

在 main.c 頭部添加寫地址 0xA0,讀地址 0xA1,寫緩存區 WriteBuffer,讀緩存區 ReadBuffer。

/* Private variables ---------------------------------------------------------*/I2C_HandleTypeDef hi2c1;UART_HandleTypeDef huart1;/* USER CODE BEGIN PV */#define ADDR_24LCxx_Write 0xA0#define ADDR_24LCxx_Read 0xA1#define BufferSize 256uint8_t WriteBuffer[BufferSize] = {0};uint8_t ReadBuffer[BufferSize] = {0};/* USER CODE END PV */5.4 添加寫入和讀取函數/*** @briefThe application entry point.* @retval int*/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();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_USART1_UART_Init();MX_I2C1_Init();/* USER CODE BEGIN 2 */printf(" ***************I2C Example******************************* ");uint32_t i;uint8_t j;for(i = 0; i < 256; i++){WriteBuffer[i] = i;/* WriteBuffer init */printf("0x%02X ", WriteBuffer[i]);if(i % 16 == 15){printf(" ");}}/* wrinte date to EEPROM */for (j = 0; j < 32; j++){if(HAL_I2C_Mem_Write(&hi2c1, ADDR_24LCxx_Write, 8*j, I2C_MEMADD_SIZE_8BIT, WriteBuffer+8*j, 8, 100) == HAL_OK){printf(" EEPROM 24C02 Write Test OK ");}else{printf(" EEPROM 24C02 Write Test False ");}} /* read date from EEPROM */HAL_I2C_Mem_Read(&hi2c1, ADDR_24LCxx_Read, 0, I2C_MEMADD_SIZE_8BIT, ReadBuffer, BufferSize, 1000);for(i = 0; i < 256; i++){printf("0x%02X",ReadBuffer[i]);if(i%16 == 15){printf(" ");}}if(memcmp(WriteBuffer,ReadBuffer,BufferSize) == 0 ) /* check date */{printf(" EEPROM 24C02 Read Test OK ");}else{printf(" EEPROM 24C02 Read Test False ");}/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */}

程序中先初始化寫數據緩存。然後調用 HAL_I2C_Mem_Write() 函數將數據寫入 EEPROM 中。根據函數返回值判斷寫操作是否正確。在 I2C 中可以找到內存寫函數說明。

第一個參數為 I2C 操作句柄。

第二個參數為 EEPROM 的寫操作設備地址。

第三個參數為內存地址。

第四個參數為內存地址長度,EEPROM 內存長度為 8bit。

第五個參數為數據緩存的起始地址。

第六個參數為傳輸數據的大小。AT24C02 型號的晶元頁寫入時序最多可以一次 發送 8 個數據(即 n = 8 ),該值也稱為頁大小,某些型號的晶元每個頁寫入時序最多可傳輸 16 個數據。

第七個參數為操作超時時間。

/*** @briefWrite an amount of data in blocking mode to a specific memory address* @paramhi2c Pointer to a I2C_HandleTypeDef structure that contains*the configuration information for the specified I2C.* @paramDevAddress Target device address: The device 7 bits address value* in datasheet must be shifted to the left before calling the interface* @paramMemAddress Internal memory address* @paramMemAddSize Size of internal memory address* @parampData Pointer to data buffer* @paramSize Amount of data to be sent* @paramTimeout Timeout ration* @retval HAL status*/HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,uint16_t MemAddress, uint16_t MemAddSize,uint8_t *pData, uint16_t Size, uint32_t Timeout)

調用 HAL_I2C_Mem_Read() 函數讀取 EEPROM 中剛才寫入的數據。HAL_I2C_Mem_Read() 函數描述如下。

第一個參數為 I2C 操作句柄。

第二個參數為 EEPROM 的讀操作設備地址。

第三個參數為內存地址。

第四個參數為內存地址長度。

第五個參數為讀取數據存儲的起始地址。

第六個參數為傳輸數據的大小。

第七個參數為操作超時時間。

/*** @briefRead an amount of data in blocking mode from a specific memory address* @paramhi2c Pointer to a I2C_HandleTypeDef structure that contains*the configuration information for the specified I2C.* @paramDevAddress Target device address: The device 7 bits address value* in datasheet must be shifted to the left before calling the interface* @paramMemAddress Internal memory address* @paramMemAddSize Size of internal memory address* @parampData Pointer to data buffer* @paramSize Amount of data to be sent* @paramTimeout Timeout ration* @retval HAL status*/HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress,uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout)

程序最後調用 memcmp() 函數判斷讀寫的兩個緩存的數據是否一致。memcmp() 是比較內存區域是否相等,標准庫裡面的函數,在 main.c 前面添加 string.h 頭文件。

5.5 查看列印

串口列印功能查看 STM32CubeMX學習筆記(6)——USART串口使用

5.6 HAL庫與標准庫代碼比較

STM32CubeMX 使用 HAL 庫生成的代碼:

/*** @brief I2C1 Initialization Function* @param None* @retval None*/static void MX_I2C1_Init(void){/* USER CODE BEGIN I2C1_Init 0 *//* USER CODE END I2C1_Init 0 *//* USER CODE BEGIN I2C1_Init 1 *//* USER CODE END I2C1_Init 1 */hi2c1.Instance = I2C1;hi2c1.Init.ClockSpeed = 100000;hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;hi2c1.Init.OwnAddress1 = 0;hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;hi2c1.Init.OwnAddress2 = 0;hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;if (HAL_I2C_Init(&hi2c1) != HAL_OK){Error_Handler();}/* USER CODE BEGIN I2C1_Init 2 *//* USER CODE END I2C1_Init 2 */}HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);

使用 STM32 標准庫的代碼:

/*** @briefI2C I/O配置* @param無* @retval 無*/static void I2C_GPIO_Config(void){GPIO_InitTypeDefGPIO_InitStructure; /* 使能與 I2C 有關的時鍾 */EEPROM_I2C_APBxClock_FUN ( EEPROM_I2C_CLK, ENABLE );EEPROM_I2C_GPIO_APBxClock_FUN ( EEPROM_I2C_GPIO_CLK, ENABLE );/* I2C_SCL、I2C_SDA*/GPIO_InitStructure.GPIO_Pin = EEPROM_I2C_SCL_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;// 開漏輸出GPIO_Init(EEPROM_I2C_SCL_PORT, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = EEPROM_I2C_SDA_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;// 開漏輸出GPIO_Init(EEPROM_I2C_SDA_PORT, &GPIO_InitStructure);}/*** @briefI2C 工作模式配置* @param無* @retval 無*/static void I2C_Mode_Config(void){I2C_InitTypeDefI2C_InitStructure; /* I2C 配置 */I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;/* 高電平數據穩定,低電平數據變化 SCL 時鍾線的占空比 */I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1 =I2Cx_OWN_ADDRESS7; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable ;/* I2C的定址模式 */I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;/* 通信速率 */I2C_InitStructure.I2C_ClockSpeed = I2C_Speed;/* I2C 初始化 */I2C_Init(EEPROM_I2Cx, &I2C_InitStructure);/* 使能 I2C */I2C_Cmd(EEPROM_I2Cx, ENABLE); }void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction);void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data);uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx);六、注意事項

用戶代碼要加在 USER CODE BEGIN N 和 USER CODE END N 之間,否則下次使用 STM32CubeMX 重新生成代碼後,會被刪除。

? 由 Leung 寫於 2021 年 1 月 26 日

? 參考:STM32CubeMX系列教程9:內部集成電路(I2C)

【STM32Cube_13】使用硬體I2C讀寫EEPROM(AT24C02)

原文:https://juejin.cn/post/7100502480986832926

3. i2c匯流排可以連接幾個設備

IIC協議規定,在啟動匯流排後第1位元組的高7位是從節點的定址地址,第8位為方向位。所以在單位元組定址中最多128個從設備。但又不能是同一類設備,因為在地址還要區分設備類型。

4. 一文搞懂I2C通信

I2C通信,全稱為集成電路匯流排(Inter-Integrated Circuit),是一種廣泛應用於主板、嵌入式系統和手機與周邊設備組件之間的串列通信匯流排。其設計源於飛利浦公司在1980年代初,旨在簡化微控制器與感測器、顯示器、IoT設備、EEPROM等之間的數據交換。I2C協議的簡單性使其成為了眾多電子設備之間通信的首選方案。

I2C通信的主要特點包括標准模式(100Kbps)、快速模式(400Kbps)、高速模式(3.4Mbps)和超快速模式(5Mbps)。硬體層面,I2C僅需SDA(串列數據線)和SCL(串列時鍾線)兩個引腳,並要求這些引腳配備上拉電阻,以確保匯流排的穩定性和數據的有效傳輸。

上拉電阻的計算公式基於邏輯低電壓(VLO)、邏輯低電流(IOL)、信號的最大上升時間(TR)和匯流排電容(CB)。以5V電源為例,每條上拉電阻阻值至少應為1.53kΩ;而對於3.3V電源,每個電阻阻值至少為967Ω。為簡化計算,常見選擇值為4.7kΩ。在調試過程中,當測量SDA或SCL信號的邏輯LOW電壓高於0.4V時,可判斷灌電流可能過高,盡管這不意味著設備立即停止工作,但操作超出規格的設備時需謹慎,以避免通信故障、縮短設備使用壽命甚至永久損壞。

I2C通信的數據傳輸協議包括開始條件、地址位、讀寫位、應答位、數據位和停止條件。開始條件由主設備在通信開始時發送,用於喚醒所有從機。地址位用於識別特定從機,主設備發送地址後,從機通過比較地址位來確定是否參與通信。讀寫位指示數據傳輸方向,應答位由接收設備在數據傳輸後返回,以確認數據接收成功。數據傳輸後,接收設備返回一個ACK位,表示成功接收數據。最後,停止條件由主設備發出,用於結束數據傳輸。

I2C通信的實現涉及硬體連接和軟體驅動。硬體連接包括SDA和SCL線的正確配置,以及上拉電阻的正確選擇。軟體驅動則需遵循特定的通信協議,包括數據傳輸格式和設備識別規則。在實際應用中,I2C匯流排允許主設備連接多個從機,每個從機使用7位或10位地址進行識別。多個主設備可以連接到同一匯流排上,但需通過檢測SDA線電平來避免沖突。

在I2C的實際應用中,DS18B20溫度感測器是一個典型的例子,它使用I2C匯流排與微控制器通信,實現溫度數據的讀取和處理。華大半導體HC32L136和ESP32等微控制器都支持I2C介面,可以輕松地驅動DS18B20等感測器。

5. i2c匯流排上最多可以掛多少個從器件

有IIC地址決定,8位地址,減去1位廣播地址,是7位地址,2^7=128,但是地址0x00不用,那就是127個地址, 所以理論上可以掛127個從器件。

I2C(Inter-Integrated Circuit)匯流排是由PHILIPS公司開發的兩線式串列匯流排,用於連接微控制器及其外圍設備。是微電子通信控制領域廣泛採用的一種匯流排標准。它是同步通信的一種特殊形式,具有介面線少,控制方式簡單,器件封裝形式小,通信速率較高等優點。I2C 匯流排支持任何IC 生產過程(CMOS、雙極性)。通過串列數據(SDA)線和串列時鍾 (SCL)線在連接到匯流排的器件間傳遞信息。每個器件都有一個唯一的地址識別(無論是微控制器——MCU、LCD 驅動器、存儲器或鍵盤介面),而且都可以作為一個發送器或接收器(由器件的功能決定)。LCD 驅動器只能作為接收器,而存儲器則既可以接收又可以發送數據。除了發送器和接收器外,器件在執行數據傳輸時也可以被看作是主機或從機(見表1)。主機是初始化匯流排的數據傳輸並產生允許傳輸的時鍾信號的器件。此時,任何被定址的器件都被認為是從機。

6. i2c是什麼

I2C是一種匯流排標准。


I2C是一種用於連接電子設備的匯流排協議。在電子硬體設計和製造中,不同晶元、模塊和處理器之間的通信至關重要。為了滿足這種需求,I2C匯流排標准應運而生。它提供了一種簡單、高效且經濟的方式,用於在微控制器或處理器之間傳輸數據。這種匯流排系統具有以下幾個顯著特點:


首先,I2C匯流排具有雙線結構,即一條數據線和一條時鍾線。這種簡單的結構降低了硬體實現的復雜性,使得設備間的通信更為便捷。其次,I2C匯流排支持多主機操作,這意味著在同一匯流排上可以有多個主設備,但它們之間的通信需要通過特定的協議和優先順序控制來避免沖突。此外,I2C匯流排還具有低功耗特性,它在不傳輸數據時能夠進入低功耗模式,從而延長整個系統的電池壽命。


具體來說,I2C匯流排廣泛應用於嵌入式系統、智能感測器、存儲器擴展和其他需要晶元間通信的場合。例如,在智能手機中,I2C匯流排用於連接各種感測器和處理器,確保設備內部各個部件之間的協同工作。此外,在工業自動化、汽車系統和智能家居等領域,I2C匯流排也發揮著重要作用。


綜上所述,I2C是一種用於電子設備間通信的匯流排協議,以其簡單的雙線結構、多主機操作支持和低功耗特性而備受青睞。它在嵌入式系統和其他需要晶元間通信的場合中發揮著關鍵作用。

閱讀全文

與i2c設備接多少個相關的資料

熱點內容
ampnetconnect是什麼設備 瀏覽:803
新盟機械鍵盤怎麼調燈 瀏覽:124
美博櫃式空調製冷效果不好怎麼辦 瀏覽:348
機械手錶計時了怎麼恢復正常 瀏覽:161
設備的橫向與縱向如何區分 瀏覽:1
角磨機後軸承皮套多少錢 瀏覽:49
哪裡收飼料設備 瀏覽:873
江蘇安廈消防器材有限公司怎麼樣 瀏覽:734
製冷量2350w格力空調是多少匹 瀏覽:4
內徑4外徑9厚5什麼型號軸承 瀏覽:54
惠州化學教學儀器設備有哪些 瀏覽:243
特種設備法律法規一共有多少 瀏覽:788
肺部長結節什麼儀器能查出 瀏覽:542
什麼地方賣單缸四輪車機械啟動裝置 瀏覽:609
遠景x6製冷劑加多少 瀏覽:590
廈門桐福機械製造公司怎麼樣 瀏覽:363
暖氣注水要把閥門打開嗎 瀏覽:834
超聲波測距模擬演示用什麼好 瀏覽:992
閥門的o和c代表什麼意思 瀏覽:85
怎麼剪好閥門墊子 瀏覽:222