STM32中I2C通信的完整C语言代码范例

在嵌入式系统开发中,STM32芯片是一种广泛应用的微控制器,具有强大的性能和丰富的外设功能。其中,I2C(Inter-Integrated Circuit)是一种常用的串行通信协议,用于在微控制器之间或者微控制器与外设之间进行数据传输。本文将介绍如何使用STM32芯片编写一段I2C通信的C语言程序,包含I2C的初始化、数据收发以及中断处理,同时提供完整的代码文件和注释。

1. 硬件准备

在开始编写I2C通信程序之前,首先需要准备好以下硬件设备:

  • 一块搭载STM32芯片的开发板(例如STM32F4 Discovery)
  • 一个I2C外设设备(例如传感器、EEPROM等)
  • 连接线

2. 环境搭建

在编写STM32的程序之前,需要搭建好开发环境,包括安装好相应的开发工具(如Keil、STM32CubeMX等)和配置好工程项目。

3. 编写程序

3.1 I2C初始化

首先,在C语言程序中包含必要的头文件和宏定义:

#include "stm32f4xx.h"
#include "stm32f4xx_i2c.h"
#include "stm32f4xx_rcc.h"

然后,在main函数中进行I2C外设的初始化:

void I2C_Init()
{I2C_InitTypeDef I2C_InitStruct;GPIO_InitTypeDef GPIO_InitStruct;// 使能I2C外设时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);// 配置I2C引脚GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_9;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOB, &GPIO_InitStruct);// 配置I2C外设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_InitStruct.I2C_ClockSpeed = 100000;I2C_Init(I2C1, &I2C_InitStruct);// 使能I2C外设I2C_Cmd(I2C1, ENABLE);
}
3.2 数据收发

接下来,编写I2C数据收发的函数:

void I2C_Write(uint8_t addr, uint8_t data)
{// 发送起始信号I2C_GenerateSTART(I2C1, ENABLE);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));// 发送从设备地址I2C_Send7bitAddress(I2C1, addr, I2C_Direction_Transmitter);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));// 发送数据I2C_SendData(I2C1, data);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));// 发送停止信号I2C_GenerateSTOP(I2C1, ENABLE);
}
uint8_t I2C_Read(uint8_t addr)
{uint8_t data;// 发送起始信号I2C_GenerateSTART(I2C1, ENABLE);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));// 发送从设备地址I2C_Send7bitAddress(I2C1, addr, I2C_Direction_Receiver);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));// 接收数据while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));data = I2C_ReceiveData(I2C1);// 发送停止信号I2C_GenerateSTOP(I2C1, ENABLE);return data;
}
3.3 中断处理

如果需要在I2C通信中使用中断,可以编写相应的中断处理函数:

void I2C1_EV_IRQHandler()
{// 处理I2C事件中断if (I2C_GetITStatus(I2C1, I2C_IT_EVT)){// 处理事件}
}void I2C1_ER_IRQHandler()
{// 处理I2C错误中断if (I2C_GetITStatus(I2C1, I2C_IT_ERR)){// 处理错误}
}

4. 完整代码文件

以上只是简单的示例代码,完整的I2C通信程序需要根据具体的应用需求进行扩展和优化。读者可以根据本文提供的代码片段,结合STM32的官方文档和相关资料,编写完整的I2C通信程序。

结语

通过本文的介绍,读者可以了解如何使用STM32芯片编写一段I2C通信的C语言程序,包含I2C的初始化、数据收发以及中断处理。希望本文对嵌入式系统开发者有所帮助。祝愿大家在STM32开发中取得成功!

感谢阅读!


本文为作者原创,转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/4837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高并发实现高效内存管理

高并发下传统方式的弊端 void *malloc(size_t size);在内存的动态存储区中分配一块长度为size字节的连续区域返回该区域的首地址. void *calloc(size_t nmemb, size_t size);与malloc相似,参数size为申请地址的单位元素长度,nmemb为元素个数&#xff0…

开发中git的常用操作

Git 是一款分布式版本控制系统,广泛应用于软件开发中,用于管理项目的版本和修改历史。在开发过程中,有许多常用的 Git 操作可以帮助团队协作、版本管理和代码管理。下面将详细讲解常用的 Git 操作,并通过举例说明它们的用法和作用…

软考高级 | 系统架构设计师笔记(一)

一. 系统规划 1.1 项目的提出与选择 该步骤生成” 产品/项目建议书”. 1.2 可行性研究与效益分析 包括经济可行性/技术可行性/法律可行性/执行可行性/方案选择 5 个部分. 该步骤生 成”可行性研究报告”. 1.3 方案的制订和改进 包括确定软件架构/确定关键性要素?/确定计算…

spring-boot控制bean的创建顺序

1、order注解(不一定有效) org.springframework.core.annotation.Order 2、dependsOn注解(有效) org.springframework.context.annotation.DependsOn 3、提前将bean注册为BeanDefinition 1、实现BeanDefinitionRegistryPostP…

商城数据库88张表结构(八)

DDL 29.商品规格表 CREATE TABLE wang_goods_specs (id int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,shopId int(11) NOT NULL DEFAULT 0 COMMENT 店铺ID,goodsid int(11) NOT NULL DEFAULT 0 COMMENT 商品ID,productNo varchar(20) NOT NULL COMMENT 商品货号,specids v…

Python 自定义日志输出

Python 有着内置的日志输出模块:logging 使用也很方便,但我们今天不说这个,我们用文件读写模块,实现自己的日志输出模块;这样在项目中,可以存在更高的自由度及更高的扩展性; 先来看看日志输出…

TDengine高可用架构之TDengine+Keepalived

之前在《TDengine高可用探讨》提到过,TDengine通过多副本和多节点能够保证数据库集群的高可用。单对于应用端来说,如果使用原生连接方式(taosc)还好,当一个节点下线,应用不会受到影响;但如果使用…

探索AI作画算法的原理:从深度学习到创造性艺术

引言 介绍AI在不同领域的应用,以及AI作画算法对于创造性艺术的影响。概述将在本文中讨论的主要内容。 第一部分:深度学习与计算机视觉 深度学习的基本原理:神经网络的结构和训练过程。计算机视觉的重要性:图像识别、生成和处理…

Python爬虫--Scrapy框架安装

Scrapy框架安装 , Scrapy 是 Python 领域专业的爬虫开发框架,已经完成爬虫程序的大部分通用工具 它使用了 Twisted 异步网络库来处理网络通讯。整体架构大致如下 第一步:挂小灰机或者将要安装的文件下载到本地 Scrapy 框架安装踩坑中 为什…

Blender曲线操作

1.几种常见建模方式 -多边形建模:Blender,C4D,3DsMax,MaYa -曲线: -曲面:Rhino(Nurbs) -雕刻:Blender,ZBrush -蜡笔:Blender 1)新…

【办公类-22-14】周计划系列(5-6)“周计划-06 19周的周计划教案合并打印PDF(最终打印版))

背景需求: 花了十周,终于把周计划教案的文字都写满、加粗、节日替换了。为了便于打印,我把19周的周计划教案全部合并在一起PDF。制作打印用PDF 思路 1、周计划是单独打印一张,因此要在第2页插入空白页, 2、教案有3页…

鸿蒙launcher浅析

鸿蒙launcher浅析 鸿蒙launcher源码下载鸿蒙launcher模块launcher和普通的应用ui展示的区别 鸿蒙launcher源码下载 下载地址如下: https://gitee.com/openharmony/applications_launcher 鸿蒙launcher模块 下载页面已经有相关文件结构的介绍了 使用鸿蒙编辑器D…

CMDB系统的目标

CMDB即配置管理数据库(Configuration Management Database, CMDB)系统被广泛应用于实现IT资产管理和IT服务管理。CMDB系统的目标是建立一个全面的、精确的信息数据库,用于追踪、管理和记录IT基础设施的配置信息及其相关关系,从而提…

Spring Cloud Gateway直接管理Vue.js的静态资源

1. 构建Vue.js应用 像之前一样,构建你的Vue.js应用,并将生成的静态资源(位于dist目录)复制到Spring Boot项目的某个目录,比如src/main/resources/static。 2. 配置Spring Boot静态资源处理 Spring Boot默认会处理sr…

linux文件夹映射到本地win系统

在Linux上安装和配置Samba服务器相对简单,以下是基本的步骤: 1. **安装Samba软件包**:使用你的Linux发行版的包管理器来安装Samba软件包。例如,在基于Debian的发行版(如Ubuntu)上,你可以使用以…

OpenHarmony开发实例:【电话簿联系人Contacts】

样例简介 Contacts应用是基于OpenHarmony SDK开发的安装在润和HiSpark Taurus AI Camera(Hi3516d)开发板标准系统上的应用;应用主要功能是展示联系人列表,并点击某一列弹出联系人详细信息; 运行效果 样例原理 样例主要有一个list组件和dia…

Docker本地部署overleaf后,挖掘用户加密逻辑

overleaf的用户信息,保存在mongo数据库的users集合中。 用户密码则存在hashedPassword字段中 从开源的代码services\web\app\src\Features\Authentication\AuthenticationManager.js第303行可以找到密码加密逻辑。 本地可以通过下面的代码生成overleaf用户密码信息…

如何在每天特定的时间打开指定的网页?教你设置每天自动打开指定网页

在现代社会,互联网已成为我们日常生活和工作中不可或缺的一部分。随着科技的 发展,我们可以利用各种工具和技术来提高我们的工作效率和生活品质。其中,定 时自动打开指定的网址便是一个实用的功能,它可以帮助我们节省时间&#xf…

从零开始搭建SpringCloud

从零开始搭建Spring Cloud涉及到多个步骤和组件的配置。以下是一个大致的指南,帮助你逐步搭建Spring Cloud环境: 安装Java开发环境: 安装JDK(Java开发工具包)并确保环境变量配置正确。选择一个合适的IDE(集…

【element-ui】el-table横向滚动后,通过is-scrolling-left获取滚动高度失效的问题

el-table横向滚动后,通过is-scrolling-left获取滚动高度失效的问题 需求 现在有一个需求,需要监听el-table的纵向滚动,当滚动高度达到特定值时进行一些操作。 代码如下: methods:{throttledHandleScroll() {// 如果已经有定时器…