首页
学习
活动
专区
工具
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 外设并进行通信。如果遇到具体问题,请根据错误信息和调试结果进行进一步排查。

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

相关·内容

  • STM32型号详解

    微处理器(MPU)通常代表一个功能强大的CPU,但不是为任何已有的特定计算目的而设计的芯片。这种芯片往往是个人计算机和高端工作站的核心CPU。中央处理器,或简称为处理器,英文缩写为CPU,即Central Processing Unit,是电子计算机的主要设备之一,其功能主要是解译计算机指令以及处理计算机软件中的数据。CPU为电子计算机设计提供了基本的数字计算特性。CPU、存储设备和输入/输出设备是现代微型电脑的三大核心部件。由集成电路制造的CPU通常称为微型处理器。从20世纪70年代中期开始,单芯片微型处理器几乎取代了所有其他类型的CPU,如今CPU这个术语几乎成为了所有微型处理器的代称。

    03

    ov7725摄像头人脸识别_监控摄像头图像倒置怎么办

    前言: 摄像头的工作原理大致为:景物通过镜头(LENS)生成的光学图像投射到图像传感器表面上,然后转为电信号,经过A/D[1] (模数转换)转换后变为数字图像信号,再送到数字信号处理芯片(DSP)中加工处理,再传输给其他显示硬件就可以显示看到图像了 我要讲解的是0V7725摄像头,带FIFO缓存,以及通过STM32F103MCU进行控制,在采用ILI9341控制器芯片的液晶屏(分辨率240*320)上显示。 我会分两大板块介绍: 第一是摄像头图像数据采集的过程 第二是图像数据在液晶屏上显示的过程 摄像头图像数据采集 以下是要讲的几个小点: 0.OV7725的摄像头结构 1.摄像头(实际上是图像传感器在采集)采集图像获得图像数据(是怎么样获得彩色信息数据的呀这个我比较关心与好奇)是怎样的一个过程。 2.摄像头(从硬件电路上讲是0V7725芯片在传输数据)将数据传输给FIFO(起数据缓冲的作用)的过程是个什么样的过程。 3.(由数字电路基础知,硬件电路上传输数据是需要时钟的)通过什么时序,该时序又是什么样的。 5.然后根据程序讲解,引脚间的连接与配置。 6.然后根据程序讲解ov7725的芯片初始化过程。 0>OV7725摄像头的结构: 晶振、板载电路、镜头、FIFO存储器(AL422B芯片)、CMOS数字图像传感器(Ov7725CMOS感光芯片)、DSP数字算法处理芯片(用于处理采集到的图像数据) 结构功能介绍: CMOS图像传感器:首先什么是CMOS图像传感器,CMOS图像传感器通常由像敏单元阵列、行驱动器、列驱动器、时序控制逻辑、AD转换器、数据总线输出接口、控制接口等几部分组成,这几部分通常都被集成在同一块硅片上。其工作过程一般可分为复位、光电转换、积分、读出几部分。 我们采用的该Ov7725图像传感器的像素30万,分辨率:480*640支持使用 VGA 时序输出图像数据,也支持QVGA时序输出240*320(本实验为了妥协FIFO的存储量,只能存储一帧该分辨率大小的图形,而且我们的屏幕也是240*320的显示分辨率),输出图像的数据格式支持 YUV(422/420)(这个后面会介绍)、 YCbCr422(这个后面会介绍) 以及 RGB565 格式。它还可以对采集得到的图像进行补偿,支持伽玛曲线、 白平衡、饱和度、色度等基础处理(这些处理为什么明明不懂我还要说,因为程序配置时你会发现一些莫名其妙的配置,我们虽然不用,但是我们要配成不用,所以那些莫名其妙的程序就是对此的配置) DSP数字算法处理芯片:这个部分就是OV7725芯片中的结构,单独提出来知识为了便于我们对结构的理解。 FIFO存储器:接收图像传感器传过来的图像数据。

    04

    MP3、故事机MCU选型记录

    要弄一个mp3音频硬件。没有接触过,所以开始找了好多方案,by8001+51(stm32),vs1003+51(stm32)。后来发现stm32太贵了。所以开始琢磨51+vs1003,电路图找了好多。基本上就确定了vs1003+51+sd模块,开发板买了不少,代码也写好。后来又想加入wifi功能。感觉51就费劲了。偶然机会看到了乐鑫的esp32,于是又乐鑫网站翻资料。发现它是一款集成度很高的模块。双mcu,可以自己写代码,内置mp3解码,有sdio,gpio,spi,i2c,adc,dac,内置蓝牙,wifi,运行freertos,内置wifi,蓝牙协议栈。开发环境也挺好配置。于是就决定试试看esp32了。能省不少事。另外该琢磨哪里去找做玩具外壳,或者音箱外壳,或者mp3外壳的注塑厂了。。。

    02
    领券