首页 > 其他分享 >论STM32如何使用I2C协议

论STM32如何使用I2C协议

时间:2024-03-31 13:32:02浏览次数:16  
标签:协议 hi2c STM32 Init InitStruct GPIO I2C

前言

当提到STM32微控制器使用I2C协议时,通常意味着通过I2C总线与其他外设进行通信。I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,用于在微控制器和外部设备之间传输数据。ST公司的STM32系列微控制器广泛应用于各种嵌入式系统中。STM32微控制器通常具有内置的硬件支持,可轻松实现I2C通信。I2C总线由两根线构成:串行数据线(SDA)和串行时钟线(SCL)。通过这两根线,STM32微控制器可以与各种外部设备进行通信,如传感器、存储器芯片、显示屏等。在这篇博客中,我们将探讨如何在STM32微控制器上使用I2C协议与外部设备进行通信。


STM32使用I2C协议的示例

在这个示例中,我们将演示如何在STM32上配置I2C通信,并通过I2C协议与一个模拟的外部设备进行数据交换。假设我们要从外部设备读取温度传感器的数据。

步骤一:kill5配置

首先,打开STM32 kill5工具,配置I2C外设。在kill5中,选择对应的STM32型号,然后启用I2C外设并配置相关引脚。

步骤二:编写代码

接下来,编写STM32的代码来初始化I2C外设并与外部设备进行通信。以下是一个简单的示例代码:

#include "stm32f4xx_hal.h"

I2C_HandleTypeDef hi2c;

void I2C_Init(void)
{
    hi2c.Instance = I2C1;
    hi2c.Init.ClockSpeed = 100000;
    hi2c.Init.DutyCycle = I2C_DUTYCYCLE_2;
    hi2c.Init.OwnAddress1 = 0;
    hi2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    hi2c.Init.OwnAddress2 = 0;
    hi2c.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
    hi2c.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    HAL_I2C_Init(&hi2c);
}

void I2C_Read_Temperature(uint8_t device_address, uint8_t reg_address, uint8_t *data, uint16_t size)
{
    HAL_I2C_Master_Transmit(&hi2c, device_address, &reg_address, 1, HAL_MAX_DELAY);
    HAL_I2C_Master_Receive(&hi2c, device_address, data, size, HAL_MAX_DELAY);
}

int main(void)
{
    HAL_Init();
    I2C_Init();

    uint8_t temperature_data[2];
    I2C_Read_Temperature(0x50, 0x00, temperature_data, 2);

    // 处理温度数据

    while (1)
    {
    }
}

在这段代码中,我们首先初始化了I2C外设,并定义了一个函数I2C_Read_Temperature用于从外部设备读取温度数据。在main函数中,我们调用这个函数来读取温度传感器的数据。

其他的使用方式

配置STM32的I2C接口

在使用STM32的I2C功能之前,首先需要配置微控制器的I2C接口。这通常涉及到设置I2C的时钟速率、地址等参数。下面是一个简单的示例代码,展示了如何在STM32上配置I2C1接口:

#include "stm32f4xx.h"

void I2C_Configuration(void) {
    I2C_InitTypeDef I2C_InitStruct;
    GPIO_InitTypeDef GPIO_InitStruct;

    // 使能I2C1时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);

    // 配置GPIO为I2C功能
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStruct);

    // 配置I2C参数
    I2C_InitStruct.I2C_ClockSpeed = 100000;
    I2C_InitStruct.I2C_Mode = I2C_Mode_I2C;
    I2C_InitStruct.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_InitStruct.I2C_OwnAddress1 = 0x00;
    I2C_InitStruct.I2C_Ack = I2C_Ack_Enable;
    I2C_InitStruct.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
    I2C_Init(I2C1, &I2C_InitStruct);

    // 使能I2C
    I2C_Cmd(I2C1, ENABLE);
}

与外部设备通信

一旦配置好了I2C接口,就可以开始与外部设备进行通信。以下是一个简单的示例,演示了如何向一个I2C设备发送数据并接收响应:

void I2C_Communication(void) {
    uint8_t data_to_send = 0x55;
    uint8_t received_data;

    // 等待I2C准备就绪
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));

    // 发送数据
    I2C_SendData(I2C1, data_to_send);

    // 等待数据发送完成
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));

    // 等待数据接收完成
    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));

    // 读取接收到的数据
    received_data = I2C_ReceiveData(I2C1);
}

总结

通过这个简单的示例,我们演示了如何在STM32上使用I2C协议与外部设备进行通信。I2C是一种非常有用的串行通信协议,可以用于连接各种外部设备,如传感器、显示屏等。希望这篇博客能帮助您更好地理解如何在STM32上使用I2C协议进行通信。


希望这篇博客能够对您有所帮助,如果您有任何疑问或想要进一步了解,请随时留言。谢谢阅读!


这篇博客介绍了如何在STM32上使用I2C协议的示例,希望能够帮助您更好地理解和应用I2C通信协议。感谢您的阅读!

标签:协议,hi2c,STM32,Init,InitStruct,GPIO,I2C
From: https://blog.csdn.net/2301_78660211/article/details/137133988

相关文章

  • can协议
    CAN2.0B标准帧CAN标准帧信息为11个字节,包括两部分:信息和数据部分。前3个字节为信息部分。位置   7   6   5   4   3   2   1   0字节01   FF   RTR   ×   ×   DLC(数据长度)字节02   (报文识别码)   ID.10―ID.3字节0......
  • PPM协议的输出实现
    关于PPM输出的具体实现我们必然先知道其原理,本人是参考站内qiyuexin大佬的PPM信号解析这篇文章。基本要点1.ppm每个通道所占用的时间并不固定2.ppm的精度主要受制于时钟精度3.对于一个通道数据每次开头都有0.5ms的固定低电平,之后跟着0.5ms的固定的高电平,之后是0-1ms的数据......
  • 【BlossomRPC】如何自定义一个RPC协议?
    文章目录如何设计一个RPC协议?RPC项目配置中心项目网关项目如何设计一个RPC协议?在上面的需求描述中我们知道,RPC非常重要的一环,就是自己制定符合自己需求的通信协议,这里,我简单的列出了我的协议。publicclassRpcHeaderimplementsSerializable{//publicst......
  • 【BlossomRPC】手把手教你写一个RPC协议
    文章目录新的开始什么是RPC?设计一个RPC需要些什么?新的开始经常会遇到一些项目,看着看着就发现看不懂文档了,也就是会出现一些跳过讲解的文章,使得自己很难了解某种中间件的开发全貌,所以想着自己先设计一个比较简易的RPC框架,在实现所有功能的前提下,向公司内部的技术分享......
  • STM32中RFID模块(MFRC522)简单应用
    1.前言​ 此篇只是对RFID模块的简单概述以及应用,没有原理,对提供的店家提供的代码,进行注释,以及简单使用流程2.函数//功能:寻卡//参数说明:req_code[IN]:寻卡方式//0x52=寻感应区内所有符合14443A标准的卡//0x26=寻未进入休眠状......
  • SPI通信协议详解
    文章目录介绍SPI硬件电路移位示意图SPI时序开始与结束时序单元交换字节时序单元模式0(最常用)模式1模式2模式3发送时序指定地址写指定地址读介绍SPISPI由时钟线、主机发送线、主机接收线、从机选择线(一个或多个)组成,拥有高速的速率,使用比较简单,但是需要的线更多,更容......
  • 使用 wsl+makefile+clangd编辑stm32代码环境的搭建
    使用wsl+makefile+clangd编辑stm32代码环境的搭建安装wsl环境可以看看下面的文章安装与换源都提及,相信大家可以安装成功的https://www.cnblogs.com/banmei-brandy/p/16218660.html安装make、bear、clangd、arm-none-eabi-gcc、最新的构建库sudoaptinstallmakebearclang......
  • Java基础 TCP协议下,收发数据代码实现
     --------------------------------------------------------------------------------------------------------------------------------- 代码实现:1.发送数据:publicstaticvoidmain(String[]args)throwsException{//1.创建Socket对象。细节:在创建对象的同......
  • 【STM32项目】基于STM32多传感器融合的新型智能导盲杖设计(完整工程资料源码)
    基于STM32多传感器融合的新型智能导盲杖设计演示效果基于stm32智能盲杖  前言:      目前,中国盲人数量已突破两千万大关,而城市盲道设计不合理、盲道被非法侵占等危害盲人出行安全的问题屡禁不止[1-3]。随着科技发展,智能盲杖不断涌现,但这些智能盲杖并不智能[4,5]......
  • I2C系统框架(1)
    学习资料:韦东山第三期 i2c_adapter:nr:第几路i2c总线xfer:读写操作structi2c_adapter{structmodule*owner;unsignedintclass;/*classestoallowprobingfor*/conststructi2c_algorithm*algo;/*thealgorithmt......