STM32 I2C硬件配置库函数

单片机学习!

目录

前言

一、I2C_DeInit函数

二、I2C_Init函数

三、I2C_StructInit函数

四、I2C_Cmd函数

五、I2C_GenerateSTART函数

六、I2C_GenerateSTOP函数

七、I2C_AcknowledgeConfig函数

八、I2C_SendData函数

九、I2C_ReceiveData函数

十、I2C_Send7bitAddress函数

十一、I2C状态监控功能

十二、标志位函数

12.1 I2C_GetFlagStatus函数

12.2 I2C_ClearFlag函数

12.3 I2C_GetITStatus函数

12.4 I2C_ClearITPendingBit函数


前言

        本文介绍了I2C硬件配置常用的一些库函数。


一、I2C_DeInit函数

        I2C_DeInit函数将外设 I2Cx 寄存器重设为缺省值

二、I2C_Init函数

        I2C_Init函数用于I2C的初始化。函数第二个参数是初始化的结构体。

I2C_Mode 用以设置 I2C 的模式。下表给出了该参数可取的值:

I2C_DutyCycle 用以设置 I2C 的占空比。下表给出了该参数可取的值:

注意:该参数只有在 I2C 工作在快速模式(时钟工作频率高于 100KHz)下才有意义。

I2C_OwnAddress1 该参数用来设置第一个设备自身地址,它可以是一个 7 位地址或者一个 10 位地址。

I2C_Ack 使能或者失能应答(ACK),下表给出了该参数可取的值:

I2C_AcknowledgedAddress 定义了应答 7 位地址还是 10 位地址。下表给出了该参数可取的值:

I2C_ClockSpeed 该参数用来设置时钟频率,这个值不能高于 400KHz

三、I2C_StructInit函数

下表给出了 I2C_InitStruct 各个成员的缺省值:

四、I2C_Cmd函数

        使能或失能I2C外设用I2C_Cmd函数来完成。

五、I2C_GenerateSTART函数

        调用I2C_GenerateSTART函数,就可以生成起始条件。

 程序源码:

/*** @brief  Generates I2Cx communication START condition.* @param  I2Cx: where x can be 1 or 2 to select the I2C peripheral.* @param  NewState: new state of the I2C START condition generation.*   This parameter can be: ENABLE or DISABLE.* @retval None.*/
void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState)
{/* Check the parameters */assert_param(IS_I2C_ALL_PERIPH(I2Cx));assert_param(IS_FUNCTIONAL_STATE(NewState));if (NewState != DISABLE){/* Generate a START condition */I2Cx->CR1 |= CR1_START_Set;}else{/* Disable the START condition generation */I2Cx->CR1 &= CR1_START_Reset;}
}

如果 NewState 不等于 DISABLE,就把CR1寄存器的 START 位置1;否则,把 START 位清0.

        START 位意义可以从手册里的寄存器描述中来了解:

START 置1

  • 在从模式下是产生起始条件。
  • 在主模式下是产生重复起始条件。

就是 START 这一位置1,产生起始条件。

六、I2C_GenerateSTOP函数

        调用I2C_GenerateSTOP函数,生成终止条件。

程序源码:

/*** @brief  Generates I2Cx communication STOP condition.* @param  I2Cx: where x can be 1 or 2 to select the I2C peripheral.* @param  NewState: new state of the I2C STOP condition generation.*   This parameter can be: ENABLE or DISABLE.* @retval None.*/
void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState)
{/* Check the parameters */assert_param(IS_I2C_ALL_PERIPH(I2Cx));assert_param(IS_FUNCTIONAL_STATE(NewState));if (NewState != DISABLE){/* Generate a STOP condition */I2Cx->CR1 |= CR1_STOP_Set;}else{/* Disable the STOP condition generation */I2Cx->CR1 &= CR1_STOP_Reset;}
}

        I2C_GenerateSTOP函数其实就是操作 CR1 的 STOP 位,查询手册中I2C寄存器的内容:

        STOP 是产生停止条件的。STOP位置1,产生停止条件。

七、I2C_AcknowledgeConfig函数

        I2C_AcknowledgeConfig函数是用来配置 CR1 的 ACK 这一位。就是配置,在收到一个字节后是否给从机应答。

程序源码:

/*** @brief  Enables or disables the specified I2C acknowledge feature.* @param  I2Cx: where x can be 1 or 2 to select the I2C peripheral.* @param  NewState: new state of the I2C Acknowledgement.*   This parameter can be: ENABLE or DISABLE.* @retval None.*/
void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState)
{/* Check the parameters */assert_param(IS_I2C_ALL_PERIPH(I2Cx));assert_param(IS_FUNCTIONAL_STATE(NewState));if (NewState != DISABLE){/* Enable the acknowledgement */I2Cx->CR1 |= CR1_ACK_Set;}else{/* Disable the acknowledgement */I2Cx->CR1 &= CR1_ACK_Reset;}
}

手册ACK寄存器描述:

        ACK就是应答使能。STM32作为主机,在接收到一个字节后,是给从机应答还是非应答,就取决于ACK这一位。

在应答的时候:

  • 如果ACK是1,就给从机应答。
  • 如果ACK是0,就不给从机应答。

八、I2C_SendData函数

        I2C_SendData函数用于写数据到数据寄存器DR。

程序源码:

/*** @brief  Sends a data byte through the I2Cx peripheral.* @param  I2Cx: where x can be 1 or 2 to select the I2C peripheral.* @param  Data: Byte to be transmitted..* @retval None*/
void I2C_SendData(I2C_TypeDef* I2Cx, uint8_t Data)
{/* Check the parameters */assert_param(IS_I2C_ALL_PERIPH(I2Cx));/* Write in the DR register the data to be sent */I2Cx->DR = Data;
}

        分析源码,I2C_SendData函数实际就是把Data这个数据直接写入到DR寄存器。

手册DR寄存器描述:

        DR数据寄存器用于存放接收到的数据或放置用于发送到总线的数据。在发送器模式下,当写一个字节至DR寄存器时,自动启动数据传输。一旦传输开始,也就是TxE=1,发送寄存器空,如果能及时把下一个需传输的数据写入DR寄存器,I2C模块将保持连续的数据流。

        从上面可以看出两个信息:

  • 一个是,写入DR,自动启动数据传输。也就是产生发送一个字节的波形。
  • 另一个是,在上一个数据移位传输过程中,如果及时把下一个数据放在DR里等着,这样就能保持连续的数据流。

九、I2C_ReceiveData函数

        I2C_ReceiveData函数用于读取DR数据,作为返回值。

程序源码:

/*** @brief  Returns the most recent received data by the I2Cx peripheral.* @param  I2Cx: where x can be 1 or 2 to select the I2C peripheral.* @retval The value of the received data.*/
uint8_t I2C_ReceiveData(I2C_TypeDef* I2Cx)
{/* Check the parameters */assert_param(IS_I2C_ALL_PERIPH(I2Cx));/* Return the data in the DR register */return (uint8_t)I2Cx->DR;
}

 手册DR寄存器描述:

        

        在接收器模式下,接收到的字节被拷贝到DR寄存器,这时就是RxNE=1,接收寄存器非空。在接收到下一个字节(RxNE=1)之前读出数据寄存器,即可实现连续的数据传送。

        这里也可以看出两个信息:

  • 一个是,接收移位完成时,收到的一个字节由移位寄存器转到数据寄存器。读取数据寄存器就能接收一个字节了。
  • 另一个是,要在下一个字节收到之前,及时把上一个字节取走,防止数据覆盖。这样才能实现连续的数据流。

十、I2C_Send7bitAddress函数

        I2C_Send7bitAddress函数是发送7位地址的专用函数。

程序源码:

/*** @brief  Transmits the address byte to select the slave device.* @param  I2Cx: where x can be 1 or 2 to select the I2C peripheral.* @param  Address: specifies the slave address which will be transmitted* @param  I2C_Direction: specifies whether the I2C device will be a*   Transmitter or a Receiver. This parameter can be one of the following values*     @arg I2C_Direction_Transmitter: Transmitter mode*     @arg I2C_Direction_Receiver: Receiver mode* @retval None.*/
void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, uint8_t Address, uint8_t I2C_Direction)
{/* Check the parameters */assert_param(IS_I2C_ALL_PERIPH(I2Cx));assert_param(IS_I2C_DIRECTION(I2C_Direction));/* Test on the direction to set/reset the read/write bit */if (I2C_Direction != I2C_Direction_Transmitter){/* Set the address bit0 for read */Address |= OAR1_ADD0_Set;}else{/* Reset the address bit0 for write */Address &= OAR1_ADD0_Reset;}/* Send the address */I2Cx->DR = Address;
}

        从源码可以看出,Address这个参数实际上也是通过DR发送的。只不过是Address参数在发送之前设置了Address最低位的读写位。

        代码意思是:如果I2C_Direction不是发送,就把Address的最低位置1,也就是读;否则就把Address的最低位清0,也就是写。

        在发送地址的时候,可以用一下这个函数。当然也可以手动设置最低位,调用I2C_SendData函数来发送地址。

十一、I2C状态监控功能

源码说明:

/*** @brief******************************************************************************************                         I2C State Monitoring Functions*                       ****************************************************************************************   * This I2C driver provides three different ways for I2C state monitoring*  depending on the application requirements and constraints:*        *  * 1) Basic state monitoring:*    Using I2C_CheckEvent() function:*    It compares the status registers (SR1 and SR2) content to a given event*    (can be the combination of one or more flags).*    It returns SUCCESS if the current status includes the given flags *    and returns ERROR if one or more flags are missing in the current status.*    - When to use:*      - This function is suitable for most applications as well as for startup *      activity since the events are fully described in the product reference manual *      (RM0008).*      - It is also suitable for users who need to define their own events.*    - Limitations:*      - If an error occurs (ie. error flags are set besides to the monitored flags),*        the I2C_CheckEvent() function may return SUCCESS despite the communication*        hold or corrupted real state. *        In this case, it is advised to use error interrupts to monitor the error*        events and handle them in the interrupt IRQ handler.*        *        @note *        For error management, it is advised to use the following functions:*          - I2C_ITConfig() to configure and enable the error interrupts (I2C_IT_ERR).*          - I2Cx_ER_IRQHandler() which is called when the error interrupt occurs.*            Where x is the peripheral instance (I2C1, I2C2 ...)*          - I2C_GetFlagStatus() or I2C_GetITStatus() to be called into I2Cx_ER_IRQHandler()*            in order to determine which error occurred.*          - I2C_ClearFlag() or I2C_ClearITPendingBit() and/or I2C_SoftwareResetCmd()*            and/or I2C_GenerateStop() in order to clear the error flag and source,*            and return to correct communication status.*            **  2) Advanced state monitoring:*     Using the function I2C_GetLastEvent() which returns the image of both status *     registers in a single word (uint32_t) (Status Register 2 value is shifted left *     by 16 bits and concatenated to Status Register 1).*     - When to use:*       - This function is suitable for the same applications above but it allows to*         overcome the limitations of I2C_GetFlagStatus() function (see below).*         The returned value could be compared to events already defined in the *         library (stm32f10x_i2c.h) or to custom values defined by user.*       - This function is suitable when multiple flags are monitored at the same time.*       - At the opposite of I2C_CheckEvent() function, this function allows user to*         choose when an event is accepted (when all events flags are set and no *         other flags are set or just when the needed flags are set like *         I2C_CheckEvent() function).*     - Limitations:*       - User may need to define his own events.*       - Same remark concerning the error management is applicable for this *         function if user decides to check only regular communication flags (and *         ignores error flags).*     **  3) Flag-based state monitoring:*     Using the function I2C_GetFlagStatus() which simply returns the status of *     one single flag (ie. I2C_FLAG_RXNE ...). *     - When to use:*        - This function could be used for specific applications or in debug phase.*        - It is suitable when only one flag checking is needed (most I2C events *          are monitored through multiple flags).*     - Limitations: *        - When calling this function, the Status register is accessed. Some flags are*          cleared when the status register is accessed. So checking the status*          of one Flag, may clear other ones.*        - Function may need to be called twice or more in order to monitor one *          single event.*            */

以上描述的是I2C的状态监控函数。

STM32有的状态可能会同时置多个标志位,

  • 如果只检查某一个标志位就认为这个状态已经发生了,就不太严谨。
  • 如果用I2C_GetFlagStatus函数读多次,再进行判断,又可能比较麻烦。

所以这里库函数就给了多种监控标志位的方案:

第一种,基本状态监控,使用I2C_CheckEvent函数。这种方式就是同时判断一个或多个标志位,来确定几个EVx,从而判断某个状态是否发生。和下图的流程是对应的。

第二种,高级状态监控,使用I2C_GetLastEvent函数,是直接把SR1和SR2这两个状态寄存器拼接成16位的数据。

第三种,基于标志位的状态监控,使用I2C_GetFlagStatus函数判断某一个标志位是否置1了。

十二、标志位函数

12.1 I2C_GetFlagStatus函数

        I2C_GetFlagStatus函数用于读取标志位。

 下表给出了所有可以被函数 I2C_ GetFlagStatus 检查的标志位列表:

12.2 I2C_ClearFlag函数

        I2C_ClearFlag函数用于清除标志位。

下表给出了所有可以被函数 I2C_ ClearFlag 清除的标志位列表:

12.3 I2C_GetITStatus函数

        I2C_GetITStatus函数用于读取中断标志位。

下表给出了所有可以被函数 I2C_ GetITStatus 检查的中断标志位列表:

12.4 I2C_ClearITPendingBit函数

        I2C_ClearITPendingBit函数用于清除中断标志位。

下表给出了所有可以被函数 I2C_ ClearITPendingBit 清除的中断待处理位列表:

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

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

相关文章

MT6835天玑6100平台规格参数_MTK联发科安卓核心板方案定制开发

联发科MT6835平台集成了蓝牙、FM、WLAN 和 GPS 模块,是一个高度集成的基带平台。该芯片集成了两个 Arm Cortex-A76 内核(运行频率高达 2.2GHz)、六个 Arm Cortex-A55 内核(运行频率高达 2.0 GHz)和强大的多标准视频编解…

【微服务与K8S】

微服务核心概念 配置中心 定义:集中管理微服务配置的组件。作用:微服务数量多,配置复杂,配置中心让配置集中化,便于管理与修改。支持动态更新配置,无需重启服务,提升运维效率与灵活性。如开发、…

记录一个移动端表格布局,就是一行标题,下面一列是对应的数据,一条一条的数据,还有点击数据进入详情的图标,还可以给一列加input输入框,还可以一对多

注&#xff1a;以下字段名都是随手写&#xff0c;并不规范&#xff0c;自己替换自己的&#xff0c;&#xff0c;只参考样式 注&#xff1a;以下重要的是布局&#xff0c;样式&#xff0c;宽高什么的再自己去搞吧 <view class"search"> <u-…

浅析大语言模型安全和隐私保护国内外标准和政策

过去两年&#xff0c;大模型技术已经普及并逐步渗透到各行各业&#xff0c;2025年注定是大模型应用井喷式发展的一年&#xff0c;AI在快速发展的同时&#xff0c;其带来的安全风险也逐渐凸显。人工智能系统的安全性和隐私保护已经成为社会关注的重点。 附下载&#xff1a;600多…

ELK日志分析实战宝典之ElasticSearch从入门到服务器部署与应用

目录 ELK工作原理展示图 一、ElasticSearch介绍&#xff08;数据搜索和分析&#xff09; 1.1、特点 1.2、数据组织方式 1.3、特点和优势 1.3.1、分布式架构 1.3.2、强大的搜索功能 1.3.3、数据处理与分析 1.3.4、多数据类型支持 1.3.5、易用性与生态系统 1.3.6、高性…

【老白学 Java】项目演练 - Quizzes #2

项目演练 - Quizzes #2 文章来源&#xff1a;《Head First Java》修炼感悟。 上一篇文章老白仔细分析了 Quizzes 的类结构&#xff0c;本文接上一章继续对功能模块逐步完善。 整个程序没有复杂的算法&#xff0c;仅仅用到了一些基础知识&#xff0c;如果大家已经了解了这部分内…

计算机网络 (33)传输控制协议TCP概述

一、定义与基本概念 TCP是一种面向连接的、可靠的、基于字节流的传输层通信协议。它工作在OSI模型的第四层&#xff0c;即传输层&#xff0c;为用户提供可靠的、有序的和无差错的数据传输服务。TCP协议与UDP协议是传输层的两大主要协议&#xff0c;但两者在设计上有明显的不同&…

JuiceFS 2024:开源与商业并进,迈向 AI 原生时代

即将过去的 2024 年&#xff0c;是 JuiceFS 开源版本推出的第 4 年&#xff0c;企业版的第 8 个年头。回顾过去这一年&#xff0c;JuiceFS 社区版依旧保持着快速成长的势头&#xff0c;GitHub 星标突破 11.1K&#xff0c;各项使用指标增长均超过 100%&#xff0c;其中文件系统总…

4、SDH为基础的多业务传送-MSTP

1、SDH&#xff08;Synchronous Digital Hierarchy&#xff0c;同步数字体系&#xff09; SDH 就像是一条超级高速公路&#xff0c;它的规则很严格&#xff0c;所有的车辆&#xff08;数据信号&#xff09;都要按照它规定的速度和车道&#xff08;标准的传输体制&#xff09;行…

初级前端面试题 - js

前言&#xff1a;众所周知&#xff0c;HTML,CSS,JS是学习前端所必备的。js的基础学好了&#xff0c;框架类的vue,react等都会接受的很快&#xff0c;因此js是前端很总要的一个部分&#xff0c;这篇文章将会结合面试题&#xff0c;对js的知识点进行总结 号外号外&#xff0c;这是…

使用 Maxwell 计算母线的电动势

三相短路事件的动力学 三相短路事件在电气系统中至关重要&#xff0c;因为三相之间的意外连接会导致电流大幅激增。如果管理不当&#xff0c;这些事件可能会造成损坏&#xff0c;因为它们会对电气元件&#xff08;尤其是母线&#xff09;产生极大的力和热效应。 短路时&#x…

Unity自定义编辑器:基于枚举类型动态显示属性

1.参考链接 2.应用 target并设置多选编辑 添加[CanEditMultipleObjects] using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;[CustomEditor(typeof(LightsState))] [CanEditMultipleObjects] public class TestInspector :…

利用 Python 脚本批量创建空白 Markdown 笔记

文章目录 利用 Python 脚本批量创建空白 Markdown 笔记1 背景介绍2 需求描述3 明确思路4 具体实现4.1. 遍历 toc.md 文件&#xff0c;收集文件名和对应的文件内容4.2. 实现文件批量生成逻辑4.3. 补全缺失的工具函数4.4. 进一步补全工具函数中的工具函数 5 脚本运行6 注意事项 利…

Apache XMLBeans 一个强大的 XML 数据处理框架

Apache XMLBeans 是一个用于处理 XML 数据的 Java 框架&#xff0c;它提供了一种方式将 XML Schema (XSD) 映射到 Java 类&#xff0c;从而使得开发者可以通过强类型化的 Java 对象来访问和操作 XML 文档。下面将以一个简单的案例说明如何使用 Apache XMLBeans 来解析、生成和验…

计算机毕业设计Python机器学习农作物健康识别系统 人工智能 图像识别 机器学习 大数据毕业设计 算法

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

2024-2029年中国毛绒玩具行业市场分析及发展前景预测报告

引言&#xff1a;重要性及市场增长趋势 在快节奏的现代生活中&#xff0c;毛绒玩具以其柔软触感和温馨陪伴&#xff0c;成为了许多人心灵的慰藉。它们不仅是儿童的忠实玩伴&#xff0c;更是成人世界里不可或缺的情感寄托。近年来&#xff0c;随着消费者情感需求的日益增长和个…

安装vue脚手架出现的一系列问题

安装vue脚手架出现的一系列问题 前言使用 npm 安装 vue/cli2.权限问题及解决方法一&#xff1a;可以使用管理员权限进行安装。方法二&#xff1a;更改npm全局安装路径 前言 由于已有较长时间未进行 vue 项目开发&#xff0c;今日着手准备开发一个新的 vue 项目时&#xff0c;在…

YARN WebUI 服务

一、WebUI 使用 与HDFS一样&#xff0c;YARN也提供了一个WebUI服务&#xff0c;可以使用YARN Web用户界面监视群集、队列、应用程序、服务、流活动和节点信息。还可以查看集群详细配置的信息&#xff0c;检查各种应用程序和服务的日志。 1.1 首页 浏览器输入http://node2.itc…

JavaSE——网络编程

一、InetAddress类 InetAddress是Java中用于封装IP地址的类。 获取本机的InetAddress对象&#xff1a; InetAddress localHost InetAddress.getLocalHost();根据指定的主机名获取InetAddress对象&#xff08;比如说域名&#xff09; InetAddress host InetAddress.getByNa…

互联网全景消息(10)之Kafka深度剖析(中)

一、深入应用 1.1 SpringBoot集成Kafka 引入对应的依赖。 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupI…