导航:首页 > 器材知识 > 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设备接多少个相关的资料

热点内容
工业燃气阀门设备有限公司招聘信息 浏览:937
量大的五金件 浏览:590
雷沃收割机行走轮轴承什么型号 浏览:316
苹果设备监管怎么显示 浏览:93
冷制冷食类调味后怎么上桌 浏览:839
锻造设备指什么 浏览:697
机械硬盘的盘片脏了怎么办 浏览:676
悬挂式干粉自动灭火装置国标 浏览:196
扭转测剪切弹性模量g实验装置 浏览:405
行车记录仪如何调整仪表盘 浏览:864
健身房标配的运动器材有哪些 浏览:873
浙江工装重力铸造怎么样 浏览:482
自动车载防护装置 浏览:829
体育器材秒表用的什么电池 浏览:120
机械工程师bak是什么文件 浏览:884
制冷制热技术实训设备哪个好 浏览:869
宁夏私人机电设备加工哪个好 浏览:365
真空泵制冷剂高低压表怎么看 浏览:983
什么是仪表输出通道 浏览:126
食堂用超声波洗碗机怎么省力 浏览:753