首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

STM32如何设置从I2C端口

基础概念

STM32 是一款基于 ARM Cortex-M 内核的微控制器,广泛应用于嵌入式系统中。I2C(Inter-Integrated Circuit)是一种串行通信协议,常用于微控制器与外部设备之间的通信。STM32 的 I2C 外设支持 I2C 总线上的主从通信模式。

相关优势

  1. 低功耗:I2C 总线在空闲时不需要高电流,适合电池供电的设备。
  2. 简单易用:I2C 协议相对简单,只需两根信号线(SDA 和 SCL),便于布线和设计。
  3. 多设备连接:一条 I2C 总线上可以连接多个设备,通过不同的地址进行区分。

类型

STM32 的 I2C 外设主要有两种类型:

  • I2C1:通常位于芯片的 PB6 和 PB7 引脚上。
  • I2C2:通常位于芯片的 PB10 和 PB11 引脚上。

应用场景

I2C 接口广泛应用于各种传感器、存储器、显示设备等与微控制器的通信,例如:

  • 读取温度传感器数据
  • 写入 EEPROM 数据
  • 控制 LCD 显示屏

设置步骤

以下是使用 STM32CubeMX 配置 I2C 外设的基本步骤:

  1. 打开 STM32CubeMX,选择你的 STM32 微控制器型号。
  2. 配置时钟树:确保 I2C 外设所需的时钟源已启用。
  3. 配置 I2C 外设
    • 在“Pinout & Configuration”选项卡中,找到“I2C”部分。
    • 选择你要使用的 I2C 外设(如 I2C1 或 I2C2)。
    • 配置引脚映射,选择相应的 SDA 和 SCL 引脚。
    • 设置 I2C 的时钟频率(通常为 100kHz 或 400kHz)。
  • 生成代码:点击“Generate Code”按钮,STM32CubeMX 将生成初始化代码。
  • 编写应用程序:在生成的代码基础上,编写你的应用程序代码。

示例代码

以下是一个简单的示例代码,展示如何在 STM32 上初始化 I2C 外设并进行读写操作:

代码语言:txt
复制
#include "stm32f4xx_hal.h"

I2C_HandleTypeDef hi2c1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_I2C1_Init();

  uint8_t data = 0x12;
  HAL_I2C_Master_Transmit(&hi2c1, 0x50 << 1, &data, 1, HAL_MAX_DELAY);
  uint8_t receivedData;
  HAL_I2C_Master_Receive(&hi2c1, 0x50 << 1, &receivedData, 1, HAL_MAX_DELAY);

  while (1)
  {
    // 主循环
  }
}

void MX_I2C1_Init(void)
{
  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)
  {
    // 初始化错误处理
  }
}

void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);

  /*Configure GPIO pins : PB6 PB7 */
  GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  GPIO_InitStruct.Alternate = GPIO_AF4_I2C1;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = 8;
  RCC_OscInitStruct.PLL.PLLN = 168;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = 7;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    // 初始化错误处理
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK)
  {
    // 初始化错误处理
  }
}

参考链接

常见问题及解决方法

  1. I2C 通信失败
    • 检查时钟频率是否正确设置。
    • 确保 SDA 和 SCL 引脚配置正确。
    • 检查设备地址是否正确。
    • 确保 I2C 总线上的上拉电阻已正确连接。
  • I2C 设备未响应
    • 检查设备是否已正确上电。
    • 确保设备地址未被其他设备占用。
    • 检查 I2C 总线上的信号质量,可能需要增加上拉电阻的值。

通过以上步骤和示例代码,你应该能够成功配置 STM32 的 I2C 外设并进行通信。如果遇到具体问题,请根据错误信息和调试结果进行进一步排查。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

如何设置 SSH 隧道(端口转发)

基本上,您可以转发任何TCP端口并通过安全的SSH连接隧道传输流量。 SSH 端口转发有三种类型: 本地端口转发。 - 将连接客户端主机转发到 SSH 服务器主机,然后转发到目标主机端口。...远程端口转发。 - 将端口服务器主机转发到客户端主机,然后转发到目标主机端口。 动态端口转发。 - 创建 SOCKS 代理服务器,允许跨一系列端口进行通信。...在本文中,我们将讨论如何设置本地,远程和动态加密的 SSH 隧道。...本文介绍如何配置 Firefox 和 Google Chrome 浏览器以使用 SOCKS 代理。 必须为要对其进行隧道传输的每个应用程序单独配置端口转发。...设置公钥验证将允许您在不输入密码的情况下连接到服务器。 总结 我们已经向您展示了如何设置 SSH 隧道并通过安全的 SSH 连接转发流量。

7.5K21

【通信专栏】STM32单片机I2C通信(上篇)

I2C通信协议层:传输过程 以STM32作为主设备发送数据为例: 步1:主机产生传输启示信号S,并联在总线上的所有设备都可以接收到 步2:所有机开始准备接收接下来主机广播的机地址,被选中设备(...但这只是在过程上是如此,在时序上是如何进行的呢?...上图是STM32做为主机发送数据等待机的应答信号。 当STM32需要做出应答或者非应答信号时,便比较简单了: ?...4:I2C_OwnAddress1设置的为STM32自己的I2C设备地址,每个连接在I2C总线上的设备都有一个自己的地址,作为主机也不例外。该地址可以自行设置,可以选择7位或者10位。...如何结合I2C时序编写对某外设的读写操作 这些内容我们在"STM32单片机/I2C通信(下篇)"进行介绍。

2K20
  • BME280传感器与STM32 Blue Pill连接并使用STM32CubeIDE

    在本教程中,我们将学习如何将 BME280 传感器与 STM32 Blue Pill 连接,并使用 HAL 库在 STM32CubeIDE 中对其进行编程。...I2C是Inter-Integrated Circuit的意思,工作原理是同步的多主多系统。...对于 BME280,STM32 Blue Pill 充当主设备,而 BME280 传感器充当设备,因为它是一个外部设备,充当设备。...选择 I2C 模式为“I2C”。然后转到“参数设置”并将 I2C 速度模式设置为“快速模式”。这对于 SSD1306 OLED 是必需的。 图片 现在我们将保存我们的文件。按 Ctrl + S。...要在 OLED 上显示传感器数据,首先,我们将设置文本开始的 x 和 y 轴位置。SSD1306_gotoXY() 函数用于设置写指针。我们将 (0,0) 作为参数传递,因此文本左上角开始。

    1.5K60

    STM32I2C框图详解及通讯过程

    所以只要遵守协议,就是标准的通讯,不管您如何实现它,不管是ST 生产的控制器还是ATMEL 生产的存储器, 都能按通讯标准交互。   ...STM32I2C 外设简介   STM32I2C 外设可用作通讯的主机及机,支持100Kbit/s 和400Kbit/s 的速率,支持7 位、10 位设备地址,支持DMA 数据传输,并具有数据校验功能...当STM32I2C 工作在从机模式的时候,接收到设备地址信号时,数据移位寄存器会把接收到的地址与STM32 的自身的“I2C 地址寄存器”的值作比较,以便响应主机的寻址。...主接收器   再来分析主接收器过程,即作为I2C 通讯的主机端时,外部接收数据的过程,见图24-11。   ...(3) 机端接收到地址后,开始向主机端发送数据。

    1.8K10

    STM32通信硬件 I2C

    20.1关于 I2C STM32F103系列的I²C控制器,可作为通信主机或机,因此有四种工作模式可选择:主机发送模式、主机接收模式、机发送模式、机接收模式。...初始化I2C协议相关参数:设置速度、寻址长度模式等; 初始化I2C硬件相关参数:I2C时钟使能、GPIO端口时钟使能、GPIO引脚设置I2C复用; 使用HAL提供的I2C对AP3426读写,封装AP3426...即低电平时间比高电平时间,可设置有I2C_DutyCycle_2(2:1)和 I2C_DutyCycle_16_9(16:9),一般要求不高,任意即可; – 16行:I2C作为机模式时,广播呼叫模式设置...,通常用不上,关闭即可; – 17行:I2C作为机模式时,禁止时钟延长,通常用不上,关闭即可; – 18行:设置I2C寻址长度模式,需要根据所接设备的地址长度决定,通常为7bit; – 19行:...STM32作为机模式时,支持同时对两个设备地址作出响应,这里作为主机,关闭即可; – 20行:设置STM32的设备地址1,这里作为主机,只要设备地址不与机一样即可; – 21行:设置STM32的设备地址

    1.1K10

    STM32 GPIO的原理、特性、选型和配置

    目录 1、基本结构 2、4种输入模式 3、4种输出模式 4、GPIO选型和配置 ---- 1、基本结构 STM32 GPIO是通用输入/输出端口的英文简称,其可实现输入、输出、驱动、通信等功能,STM32...,N-MOS管处于关闭状态,此时I/O端口的电平就不会由输出的高低电平决定,而是由I/O端口内部或者外部的上拉或者下拉决定;当设置输出的电平状态为低电平时,N-MOS管处于开启状态,此时I/O端口的电平就是低电平...P-MOS管决定:高电平;当设置输出的电平状态为低电平时,P-MOS管处于关闭状态,N-MOS管处于开启状态,此时I/O端口的电平就由N-MOS管决定:低电平。...复用功能开漏输出通常用于TX1、MOSI、MISO等引脚的配置,复用功能推挽输出通常用于I2C的SCL、SDA。以复用功能推挽输出模式为例,实现原理如下图所示: ?...4、GPIO选型和配置 如何选择适合其应用开发的GPIO模式和配置呢?请参考下图所示。 ? ?

    84721

    ov7740摄像头_雷威视监控摄像头二码是无

    分辨率: 现在的数字摄像头分辨率一般数十万到上千万;模拟摄像头的分辨率维持在41万左右,但由于输出的是模拟量,可以直接输入至电视或监视器,所以依据实际情况可以但没必要做那么高。...十分类似,在STM32中我们完全可以直接用I2C硬件外设来控制。...XCLK可以外接晶振或由外部控制器提供,若要类比XCLK之于OV7725就相当于HSE时钟输入引脚与STM32芯片的关系,PCLK引脚可类比STM32I2C外设的SCL引脚。...SCCB时序——外部控制器对OV7725寄存器的配置参数是通过SCCB总线传输过去的,而SCCB总线跟I2C十分类似(基本一致),所以在STM32驱动中可直接使用片上I2C外设与它通讯。...那么外部的控制器如何判断这些电平是否有效呢?总不可以全部数据都接收吧!因为数据无效期间HREF处于低电平,这样外部控制器可以在读取数据前先判断HREF是否为高电平,不是的话就不接收数据。

    88420

    单片机入门stm32知识学习的先后顺序

    这里大概的罗列了一些学习STM32的内容,以及学习顺序。...下面就是本人所罗列的一些STM32的内容,不需要看懂,只需要记住即可,在你以后慢慢深入的过程中,就会了解到的:   1、STM32基本配置(运行环境、编译器、下载器、板子等)。   ...2、GPIO(跑马灯,蜂鸣器、按键),其中还有端口复用和重映射,以后用到再给大家介绍,不过可以先看看中文手册。   3、时钟(系统时钟、RTC实时时钟)。   ...5、通信(串口UART通信、I2C / SPI、485/CAN、2.4G无线通讯、蓝牙模块HC05)。   6、看门狗(独立看门狗和窗口看门狗)。   ...10、MPU6050、温湿度传感器、弯曲度传感器(原理会用到 I2C、GPIO、ADC等)。

    72920

    如何设置 ASP.NET Core 程序监听的 IP 和端口

    如何设置 ASP.NET Core 程序监听的 IP 和端口 Web 服务需要配置监听的 IP 和端口才可以对外提供真正的服务。本文介绍如何设置 ASP.NET Core 程序监听的 IP 和端口。...因此,本文建议的大多数设置监听 IP 和端口的方法都是“临时方法”,即那种“配置出来”的方法,而不会直接写死在代码中。 如何选择应该监听的 IP 和端口?...如果打算直接让服务对外公开提供,则需要设置为 0.0.0.0 任意 IP。 一台计算机上不同的应用不能使用相同的端口,对于端口的选择只要不重复即可。...如果希望让 ASP.NET Core 程序自动选择一个不重复的端口,则将其指定为 0。 配置方法 方法一:直接在项目中设置 在项目上右击属性,在调试标签下可以修改应用的启动 URL。...虽然这里修改的是项目的设置,最终生成的 ASP.NET Core 程序并不会使用这个设置,但每次通过项目打开时仍然可以使用这个设置。 ? 这种方式仅仅影响调试时候采用的域名 / IP 和端口号。

    6.8K41

    学习笔记——STM32摄像头OV7725(一)

    ,它根据这些寄存器配置的参数来运行,而这些参数是由外部控制器通过 SCL 和 SDA 引脚写入的,SCL 与 SDA 使用的通讯协 议 SCCB 跟 I2C 十分类似,在 STM32 中我们完全可以直接用...I2C 硬件外设来控 制。...XCLK 可以外接晶振或由外部控制器提供,若要类比 XCLK 之于 OV7725 就相当 于 HSE 时钟输入引脚与 STM32 芯片的关系,PCLK 引脚可类比 STM32I2C 外 设的...SCCB时序 外部控制器对 OV7725 寄存器的配置参数是通过 SCCB 总线传输过去的,而 SCCB 总线跟 I2C 十分类似,所以在 STM32 驱动中可以直接使用片上 I2C 外设与它通讯。...协议读写其寄存器,而他输出图像时则使用VGA/QVGA时序,其中VGA为分辨率480640时采用,QVGA为Quarter VGA,其输出分辨率为240320,OV7725输出图像时为一帧帧输出,一般左至右

    3.5K21

    GPIO基本知识

    GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。那STM32引脚是如何分类的?...引脚图可以看出,GPIO 占用了 STM32 芯片大部分的引脚。并且每一个端口都有 16 个引脚,比如 PA 端口,它有 PA0-PA15。其他的 PB、PC 等端口是一样的。...三、GPIO内部结构图中最右端 I/O 端口STM32 芯片的引脚,其它部分都在 STM32 芯片内部。(1)保护二极管引脚内部加上这两个保护二级管可以防止引脚外部过高或过低的电压输入。...通俗讲就是浮空就是浮在空中,就相当于此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多。...这也是I2C,SMBus等总线判断总线占用状态的原理。

    1.4K31

    你不懂的这都有UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB、SD卡、1-WIRE

    推荐文章:STM32与51单片机串口通信实例。UART的串行数据传输不需要使用时钟信号来同步传输,而是依赖于发送设备和接收设备之间预定义的配置。...对于发送设备和接收设备来说,两者的串行通信配置应该设置为完全相同。 起始位:表示数据传输的开始,电平逻辑为“0” 。...该总线可以将多个I2C设备连接到该系统上。连接到I2C总线上的设备既可以用作主设备,也可以用作设备。 主设备负责控制通信,通过对数据传输进行初始化,来发送数据并产生所需的同步时钟脉冲。...SPI用片选信号选择机,I2C用地址选择机。 RS232串口通信 传输线有两根,地线一根。电平是负逻辑: -3V~-15V逻辑“1”,+3V~+15V逻辑“0”。...1-Wire线端口为漏极开路或三态门的端口,因此一般需要加上拉电阻Rp,通常选用5K~10KΩ 主要应用在:打印墨盒或医疗消耗品的识别;印刷电路板、配件及外设的识别和认证。

    4.2K21

    STM32的IO口的8种工作模式

    浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。 如果你外部上拉电阻,就是1;下拉电阻,就是0。...这也是I2C,SMBus等总线判断总线占用状态的原理。补充: 什么是“线与”?...由于浮空输入一般多用于外部按键输入,结合图上的输入部分电路,我理解为浮空输入状态下,IO的电平状态是不确定的,完全由外部输入决定,如果在该引脚悬空的情况下,读取该端口的电平是不确定的。...上拉输入/下拉输入/模拟输入:这几个概念很好理解,字面便能轻易读懂。...的SCL,SDA) (8)复用功能的开漏输出 _AF_OD ——片内外设功能 (TX1,MOSI,MISO.SCK.SS) STM32设置实例: (1)模拟I2C使用开漏输出_OUT_OD,接上拉电阻,

    93910

    STM32读取SHT3x系列温湿度传感器,标准库和HAL库

    STM32软件I2C读取AM2320温湿度传感器数据:https://blog.zeruns.tech/archives/695.html STM32使用硬件I2C读取SHTC3温湿度传感器:https...在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯机。...当 I2C 设备空闲时会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。 I2C通信时单片机GPIO口必须设置为开漏输出,否则可能会造成短路。...关于更多STM32I2C相关信息和使用方法可以看这篇文章:https://url.zeruns.tech/JC0Ah 我这里就不详细讲解了。...不过使用STM32硬件I2C时只需要输入0x88就行,最低位标准库会处理的。

    1.4K20

    STM32F103GPIO-LED点灯

    如今的MCU大都采用引脚复用技术,即一个GPIO,即可以直接控制其输出高低电平,也可以设置为某个协议的引脚之一,比如I2C的时钟信号引脚SCK。...对于GPIO模式,不同的MCU的功能细节略有差异,比如STM32的GPIO可以设置输出速度,51单片机就没有该功能。...如今的MCU大都采用引脚复用技术,即一个GPIO,即可以直接控制其输出高低电平,也可以设置为某个协议的引脚之一,比如I2C的时钟信号引脚SCK。...对于GPIO模式,不同的MCU的功能细节略有差异,比如STM32的GPIO可以设置输出速度,51单片机就没有该功能。...用上述设置GPIO_InitStruct成员讲解的方法设置每个成员的值之后,使用下述函数对选择的某组端口的GPIO引脚进行初始化。

    82910

    STM32软件I2C读取AM2320温湿度传感器数据

    STM32使用硬件I2C读取SHTC3温湿度传感器:https://blog.zeruns.tech/archives/692.html STM32单片机读取AHT10温湿度传感器数据:https://...在一个 I2C 通讯总线中,可连接多个 I2C 通讯设备,支持多个通讯主机及多个通讯机。...当 I2C 设备空闲时会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。 I2C通信时单片机GPIO口必须设置为开漏输出,否则可能会造成短路。...关于更多STM32I2C相关信息和使用方法可以看这篇文章:https://url.zeruns.tech/JC0Ah 我这里就不详细讲解了。...(i = 0; i < 1000; i++) //上电延时 { for (j = 0; j < 1000; j++) ; } OLED_I2C_Init(); //端口初始化

    78120

    STM32型号详解

    20世纪70年代中期开始,单芯片微型处理器几乎取代了所有其他类型的CPU,如今CPU这个术语几乎成为了所有微型处理器的代称。...STM32的用途 STM32 属于一个微控制器,自带了各种常用通信接口,比如 USART、I2C、SPI 等,可接非常多 的传感器,可以控制很多的设备。 串口—USART,用于跟跟串口接口的设备通信。...内部集成电路—I2C,用于跟I2C接口的设备通信。比如:EEPROM、电容屏、陀螺仪MPU6050、0.96寸OLED模块。 串行通信接口—SPI,用于跟SPI接口的设备通信。...STM32的选型 STM32 有很多系列,可以满足市场的各种需求,内核上分有 Cortex-M0、M3、M4 和M7这几种,每个内核又大概分为主流、高性能和低功耗。具体的分类参考下表。...STM32的命名方式 如图所示是STM32F103VET6的命名解释。 下面来介绍如何看STM32F103C8T6 STM32的引脚功能说明

    2.5K30
    领券