再造STM32---第十九部分:I2C—读写 EEPROM

2023-11-08

       本章参考资料:《STM32F4xx 参考手册》、《STM32F4xx 规格书》、库帮助文档《stm32f4xx_dsp_stdperiph_lib_um.chm》及《I2C 总线协议》。
       若对 I2C 通讯协议不了解,可先阅读《I2C 总线协议》文档的内容学习。若想了解SMBUS,可阅读《smbus20》文档。
       关于 EEPROM 存储器,请参考“ 常用存储器介绍”章节, 实验中的 EEPROM,请参考其规格书《AT24C02》来了解。


19.1 I2C协议简介:

       I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USART、 CAN等通讯协议的外部收发设备,现在被广泛地使用在系统内多个集成电路(IC)间的通讯。

① I2C物理层:

I2C物理层的特点

• 它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通讯从机。
• 一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA) ,一条串行时钟线 (SCL)。数据线即用来表示数据,时钟线用于数据收发同步。
• 每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址进行不同设备之间的访问。
总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。
• 多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定由哪个设备占用总线
• 具有三种传输模式:标准模式传输速率为100kbit/s ,快速模式为400kbit/s ,高速模式下可达 3.4Mbit/s,但目前大多I2C设备尚不支持高速模式。
• 连接到相同总线的 IC 数量受到总线的最大电容 400pF 限制

② I2C的协议层:

I2C的协议定义了通讯的起始和停止信号、数据有效性、响应、仲裁、时钟同步和地址广播等环节。
1. I2C基本读写过程:
主机写数据到从机:

主机由从机中读数据:

通讯复合格式:

2.通讯的起始和停止信号:

• 当 SCL 线是高电平时 SDA 线从高电平向低电平切换,这个情况表示通讯的起始
• 当 SCL 是高电平时 SDA 线由低电平向高电平切换,表示通讯的停止
• 起始和停止信号一般由主机产生。

3.数据有效性:
I2C使用SDA信号线来传输数据,使用SCL信号线进行数据同步。SDA数据线在SCL的每个时钟周期传输一位数据。

SCL为高电平的时候SDA表示的数据有效,即此时的SDA为高电平时表示数据“1”,为低电平时表示数据“0”。
• 当SCL为低电平时, SDA的数据无效,一般在这个时候SDA进行电平切换,为下一次表示数据做好准备。
4.地址及数据方向:

• I2C总线上的每个设备都有自己的独立地址,主机发起通讯时,通过SDA信号线发送设备地址(SLAVE_ADDRESS)来查找从机。设备地址可以是7位或10位。
• 紧跟设备地址的一个数据位R/W用来表示数据传输方向, 数据方向位为“1”时表示主机由从机读数据,该位为“0”时表示主机向从机写数据。

5.响应:
I2C的数据和地址传输都带响应。响应包括“应答(ACK)”和“非应答(NACK)”两种信号。

传输时主机产生时钟,在第9个时钟时,数据发送端会释放SDA的控制权,由数据接收端控制SDA,若SDA为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)。
 

19.2 STM32的I2C特性及架构:

        软件模拟协议:使用CPU直接控制通讯引脚的电平,产生出符合通讯协议标准的逻辑。
        硬件实现协议:由STM32的I2C片上外设专门负责实现I2C通讯协议,只要配置好该外设,它就会自动根据协议要求产生通讯信号,收发数据并缓存起来, CPU只要检测该外设的状态和访问数据寄存器,就能完成数据收发。这种由硬件外设处理I2C协议的方式减轻了CPU的工作,且使软件设计更加简单。
        STM32的I2C外设可用作通讯的主机及从机,支持100Kbit/s和400Kbit/s的速率,支持7位、 10位设备地址,支持DMA数据传输,并具有数据校验功能。

19.3 STM32的I2C架构剖析:

• 通讯引脚
• 时钟控制逻辑
• 数据控制逻辑
• 整体控制逻辑


1.通讯引脚:
        STM32芯片有多个I2C外设,它们的I2C通讯信号引出到不同的GPIO引脚上,使用时必须配置到这些指定的引脚,以《STM32F4xx规格书》 为准。

2.时钟控制逻辑:
SCL线的时钟信号,由I2C接口根据时钟控制寄存器(CCR)控制,控制的参数主要为时钟频率。
• 可选择I2C通讯的“标准/快速”模式,这两个模式分别I2C对应100/400Kbit/s的通讯速率。
• 在快速模式下可选择SCL时钟的占空比,可选Tlow/Thigh=2或Tlow/Thigh=16/9模式。
• CCR寄存器中12位的配置因子CCR,它与I2C外设的输入时钟源共同作用,产生SCL时钟。 STM32的I2C外设输入时钟源为PCLK1。

3.数据控制逻辑:
        I2C的SDA信号主要连接到数据移位寄存器上,数据移位寄存器的数据来源及目标是数据寄存器(DR)、地址寄存器(OAR)、 PEC寄存器以及SDA数据线。
当向外发送数据的时候,数据移位寄存器以“数据寄存器”为数据源,把数据一位一位地通过SDA信号线发送出去;
当从外部接收数据的时候,数据移位寄存器把SDA信号线采样到的数据一位一位地存储到“数据寄存器”中。
4.整体控制逻辑:
         整体控制逻辑负责协调整个I2C外设,控制逻辑的工作模式根据我们配置的“控制寄存器(CR1/CR2)”的参数而改变。
        在外设工作时,控制逻辑会根据外设的工作状态修改“状态寄存器(SR1和SR2)” ,只要读取这些寄存器相关的寄存器位,就可以了解I2C的工作状态。


19.4 STM32的I2C通讯过程:

       使用I2C外设通讯时,在通讯的不同阶段它会对“状态寄存器(SR1及SR2)”的不同数据位写入参数,通过读取这些寄存器标志来了解通讯状态。
1.主发送器

① 主发送器通讯过程
• 控制产生起始信号(S),当发生起始信号后,它产生事件“EV5”,并会对SR1寄存器的“SB”位置1,表示起始信号已经发送;
• 发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”及“EV8”,这时SR1寄存器的“ADDR”位及“TXE”位被置1, ADDR 为1表示地址已经发送, TXE为1表示数据寄存器为空;

• 往I2C的“数据寄存器DR”写入要发送的数据,这时TXE位会被重置0,表示数据寄存器非空, I2C外设通过SDA信号线一位位把数据发送出去后,又会产生“EV8”事件,即TXE位被置1,重复这个过程,可以发送多个字节数据;
• 发送数据完成后,控制I2C设备产生一个停止信号(P),这个时候会产生EV2事件, SR1的TXE位及BTF位都被置1,表示通讯结束。
② 主接收器

• 起始信号(S)是由主机端产生的,控制发生起始信号后,它产生事件“EV5”,并会对SR1寄存器的“SB”位置1,表示起始信号已经发送;
• 发送设备地址并等待应答信号,若有从机应答,则产生事件“EV6”这时SR1寄存器的“ADDR”位被置1,表示地址已经发送。
• 从机端接收到地址后,开始向主机端发送数据。当主机接收到这些数据后,会产生“EV7”事件, SR1寄存器的RXNE被置1,表示接收数据寄存器非空,读取该寄存器后,可对数据寄存器清空,以便接收下一次数据。 此时可以控制I2C发送应答信号(ACK)或非应答信号(NACK),若应答,则重复以上步骤接收数据,若非应答,则停止传输;
• 发送非应答信号后,产生停止信号(P),结束传输。

19.5 I2C初始化结构体详解

typedef struct {
uint32_t I2C_ClockSpeed; /*!< 设置 SCL 时钟频率,此值要低于 40 0000*/
uint16_t I2C_Mode; /*!< 指定工作模式,可选 I2C 模式及 SMBUS 模式 */
uint16_t I2C_DutyCycle; /*指定时钟占空比,可选 low/high = 2:1 及 16:9 模式*/
uint16_t I2C_OwnAddress1; /*!< 指定自身的 I2C 设备地址 */
uint16_t I2C_Ack; /*!< 使能或关闭响应(一般都要使能) */
uint16_t I2C_AcknowledgedAddress; /*!< 指定地址的长度,可为 7 位及 10 位 */
} I2C_InitTypeDef;

• I2C_ClockSpeed
        设置I2C的传输速率,在调用初始化函数时,函数会根据我们输入的数值经过运算后把时钟因子写入到I2C的时钟控制寄存器CCR。而我们写入的这个参数值不得高于400KHz
        实际上由于CCR寄存器不能写入小数类型的时钟因子,影响到SCL的实际频率可能会低于本成员设置的参数值,这时除了通讯稍慢一点以外,不会对I2C的标准通讯造成其它影响。
• I2C_Mode
       选择I2C的使用方式,有I2C模式(I2C_Mode_I2C )和SMBus主、从模式(I2C_Mode_SMBusHost、 I2C_Mode_SMBusDevice ) 。I2C不需要在此处区分主从模式,直接设置I2C_Mode_I2C即可。
• I2C_DutyCycle
       设置I2C的SCL线时钟的占空比。该配置有两个选择,分别为低电平时间比高电平时间为2: 1 ( I2C_DutyCycle_2)和16: 9(I2C_DutyCycle_16_9)。其实这两个模式的比例差别并不大,一般要求都不会如此严格,这里随便选就可以了。
• I2C_OwnAddress1
       配置STM32的I2C设备自己的地址,每个连接到I2C总线上的设备都要有一个自己的地址,作为主机也不例外。地址可设置为7位或10位(受下面I2C_AcknowledgeAddress成员决定),只要该地址是I2C总线上唯一的即可。STM32的I2C外设可同时使用两个地址,即同时对两个地址作出响应,这个结构成员I2C_OwnAddress1配置的是默认的、 OAR1寄存器存储的地址,若需要设置第二个地址寄存器OAR2,可使用I2C_OwnAddress2Config函数来配置, OAR2不支持10位地址。
• I2C_Ack_Enable
        配置I2C应答是否使能, 设置为使能则可以发送响应信号。 一般配置为允许应答(I2C_Ack_Enable),这是绝大多数遵循I2C标准的设备的通讯要求,改为禁止应答(I2C_Ack_Disable)往往会导致通讯错误。
• I2C_AcknowledgeAddress
        选择I2C的寻址模式是7位还是10位地址。这需要根据实际连接到I2C总线上设备的地址进行选择,这个成员的配置也影响到I2C_OwnAddress1成员,只有这里设置成10位模式时,I2C_OwnAddress1才支持10位地址。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

再造STM32---第十九部分:I2C—读写 EEPROM 的相关文章

  • Linux下快速查看CPU使用情况的相关命令

    Linux下快速查看CPU使用情况比较常用的命令是free top ps 这篇文章来看下如何在Linux下检查服务器的CPU使用情况 我的Linux是Linux Ubuntu server 15 04 如果是图形界面 有些统计会看起来更直观
  • Intellij Idea创建一个简单的java项目

    2016年11月12日 我即将要离开象牙塔 校园 踏入社会 想想未来我是某个公司的一个程序员 再对比一下小时的梦想 好像出入挺大的 今天我不得不为即将的工作准备 一个java开发工程师 但是我现在是一个小小的菜鸟 所以要学习 好了 不说这些
  • 简单说说对QT中moveToThread实现多线程操作的理解

    在平时的编码过程中经常碰到QT的多线程问题 也大量接触了QT中的两种主流多线程写法 一种是继承QThread类并重载run函数 在run函数中写一个状态机或者计时器来实现对线程运作 一种是通过moveToThread的方式实现事件托管从而实
  • nginx在Linux上搭建

    一 Nginx介绍和常用功能 1 Nginx介绍 Nginx是一个高性能的HTTP和反向代理 服务器 百度百科的介绍 常见功能 Http代理 反向代理 作为web服务器最常用的功能之一 尤其是反向代理 正向代理和反向代理不理解的可以看htt
  • 轮播图插件使用

    React使用最广泛的轮播图插件之一是 react slick react slick 是一个基于React的响应式轮播图组件 具有许多可定制的选项和功能 要使用 react slick 插件 您可以按照以下步骤进行 1 安装 react
  • 华为数据中心产品汇总介绍

    AR G3路由器产品定位 AR G3系列企业路由器是秉承华为在数据通信 无线 接入网 核心网领域的深厚积累 依托自主知识产权的VRP平台 通用路由平台 主要是以TCP IP协议为核心 实现了数据链路层 网络层和应用层的多种协议 推出的面向企
  • yagmail发送带图片和链接的邮件

    方法 在正文中插入图片 yagmail inlne 图片路径 在正文中插入链接 a href 链接地址 链接名称 a 效果如图 经过测试的完整代码 导入yagmail第三方库 import yagmail yagmail SMTP user
  • 冻结表格列PyQt

    QT有个官方的例子 Frozen Column Example 在Qt Creator例子查找即可 官方例子python版本 Frozen Column Example Qt for Python 不过官方python版应该是机器直接翻译的
  • C++ continue 语句

    C 中的 continue 语句有点像 break 语句 但它不是强迫终止 continue 会跳过当前循环中的代码 强迫开始下一次循环 对于 for 循环 continue 语句会导致执行条件测试和循环增量部分 对于 while 和 do
  • 十进制转换为二进制代码

    十进制转换为二进制代码 十进制转换为二进制 十进制如何转二进制 将该数字不断除以2直到商为零 然后将余数由下至上依次写出 即可得到该数字的二进制表示 以将数字21转化为二进制为例 当商为零时 将余数由下至上依次写出 即为21的二进制表示 i
  • SpringBoot整合框架——数据库

    目录 一 整合JDBC使用 1 1 SpringData简介 1 2 创建测试项目测试数据源 1 3 JDBCTemplate JdbcTemplate主要提供以下几类方法 1 4 测试 二 整合Druid
  • java 有限状态机_有限状态机的4种Java实现对比

    写在前面 2020年面试必备的Java后端进阶面试题总结了一份复习指南在Github上 内容详细 图文并茂 有需要学习的朋友可以Star一下 GitHub地址 https github com abel max Java Study Not
  • 【Redis】Redis安装与配置:

    文章目录 一 下载与安装 二 服务启动与停止 1 启动 2 设置后台运行 3 设置密码 解开注释 将默认密码foobared修改为你的 4 设置远程连接 一 下载与安装 redis https redis io download tar z
  • python详细安装教程-Pycharm及python安装详细教程(图解)

    首先我们来安装python 1 首先进入网站下载 点击打开链接 或自己输入网址https www python org downloads 进入之后如下图 选择图中红色圈中区域进行下载 2 下载完成后如下图所示 3 双击exe文件进行安装
  • sqli-labs Less-4

    本系列文章使用的靶场环境为sqli labs 环境下载地址 https github com Audi 1 sqli labs 持续跟新 一直到通过此靶场为止 1 判断注入类型 index php id 1 单引号回显正常 双引号会报错 然
  • Pyhon加载模块的两种方法

    一 在Python中添加 1 找到Settings 2 找到Project Interpreter 3 点击加号 4 在搜索栏搜索想要的模块 二 利用cmd安装 1 打开cmd 2 输入python 查看能否显示版本信息 不能的话需要配置环
  • APP 测试过程中缺陷总结

    1 拍照视频 问题1 视频拍照 文案和图标不一致 操作1 拍摄照片 点击拍摄视频 查看照片大图 确认 操作2 看系统是否存在两模式 定制和非定制 且都拥有这个视频和拍照功能 定制模式下切换到视频时 退出登录 登录到非定制版 2 上传 问题1
  • Log4j2 日志脱敏

    日志脱敏首先要搞清楚 影响的数据范围 是要全局支持日志脱敏 还是只针对部分代码 如果涉及到敏感数据的业务代码较少 建议写个数据脱敏工具类 在打印日志的时候调用 灵活可靠 影响范围小 一 第一种方案 全局方式 针对log4j2的日志脱敏实现方
  • MySql数据库基础--数据类型优化

    文章目录 数据类型的优化 各类型的特点 整数 实数 字符串 TEXT BLOB 日期时间 选择标识符 约束 数据类型的优化 优化原则 从小 更小通常更快 占用更小的磁盘空间 内存 cpu缓存 更少的cpu周期 从简 更少的cpu周期 整形比

随机推荐

  • vue 父子孙页面传值的多种方法

    父给子 第一种 props 缺点 只能一级一级的传值 子页面不能修改这个参数 父页面
  • 【单片机】UART、I2C、SPI、TTL、RS232、RS422、RS485、CAN、USB、SD卡、1-WIRE、Ethernet等常见通信方式

    在单片机开发中 UART I2C RS485等普遍在用 这里做一个简单的介绍 UART通用异步收发器 UART口指的是一种物理接口形式 硬件 UART是异步 指不使用时钟同步 依靠帧长进行判断 全双工 收发可以同时进行 串口总线 它比同步串
  • android 常用机型尺寸_Android中图片大小与各种hdpi

    前言 大家都知道开发android会涉及到UI的涉及 一般都是给到通用的分辨率进行设计 但是具体适配是需要代码控制的 由于网上分辨率dp的文章实在太多 对这些不了解的朋友可以去自行百度 这里主要是对UI的设计过程与原理进行一个简要的分析 术
  • 【数据结构】链表

    数据结构 链表 1 链表的概念及结构 链表是一种物理存储单元上非连续 非顺序的存储结构 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表由一系列结点 链表中每一个元素称为结点 组成 结点可以在运行时动态生成 每个结点包括两个部分 一
  • Qt 安装包制作(基于Qt Installer Framework)

    目录 下载 Qt Installer Framework 程序打包发布 创建安装包程序 下载 Qt Installer Framework 官方下载 http download qt io official releases qt inst
  • 此URL不支持Http方法GET

    出现删除问题的解决办法是 需要把代码中的super注释掉 super doGet req resp super doPost req resp 原来报错的代码 修改之后的代码 记得修改之后 重启一下tomcat就可以了
  • java连接多个mysql_Java连接到多个数据库

    我正在创建一个连接到多个数据库的Java应用程序 用户将能够从下拉框中选择要连接的数据库 然后 程序通过将名称传递给创建初始上下文的方法来连接到数据库 以便它可以与oracle Web逻辑数据源进行通信 public class dbMai
  • 用tensorflow实现基本的word2vec

    Basic word2vec implementation through tensorflow from future import absolute import from future import division from fut
  • 第四步:STM32F4 GPIO介绍

    1 0 STM32F407ZGT6引脚说明 STM32F407ZGT6 一共有7组IO口 每组IO口有16个IO 一共16X7 112个IO 外加2个PH0和PH1 一共114个IO口 GPIOA GPIOB GPIOG PH0 PH1 1
  • mac电脑安装Android studio

    1 安装Android studio 在官网下载安装包https developer android google cn studio 下载时需要根据mac电脑的处理器选择不同版本 在关于本机中查看一下处理器类型就行 然后点击dmg安装包进
  • 鸿蒙应用开发:安装DevEco Studio及环境配置

    一 安装DevEco Studio 1 找到官网下载开发工具 DevEco Studio官网 2 解压下载好的压缩包 3 关闭杀毒软件并以管理员身份运行 4 在如下界面勾选DevEco Studio 直到安装完成 二 下载HarmonyOS
  • 8种日志级别

    优先级从高到低依次为 OFF FATAL ERROR WARN INFO DEBUG TRACE ALL ALL 最低等级的 用于打开所有日志记录 TRACE 很低的日志级别 一般不会使用 DEBUG 指出细粒度信息事件对调试应用程序是非常
  • docker容器的网络信息查看

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 查看容器的IP地址 可以在主机上运行 sudo docker ps 查看正在运行的容器的id等信息 sudo docker inspect 容器id 查看到容器的相关信息
  • win2003 DNS服务器配置方法[图文详解]

    目前很多企业事业单位都建立了单位内部的局域网 网络内部都配备相关的服务器 如web ftp等服务器 内部网络的用户都希望所有的服务器都用域名来访问 网络管理员可以采用在内部搭建DNS服务器的方式来实现 width 680 height 20
  • 蓝牙BLE---DA14585的外部中断使用

    DA14585的标准SDK中并没有找到GPIO外部中断的使用例程 但是外部中断并不难配置 看看GPIO C和GPIO H这两个文件就知道怎么做了 下面三行代码是初始化设置 void gpio init GPIO SetPinFunction
  • 基于SpringBoot的电子招标投标管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SpringBoot 前端 HTML Vue 数据库 MySQL5 7 数据库管理工具 Navicat 12 服务器 Tomcat8 5 开发软件 IDEA Ecl
  • 京东首页实战(带商品栏)

    效果展示 在这里插入图片描述 https img blog csdnimg cn cdb0bf89b2b9415f814 项目结构 需要联系 224 855 7717
  • MySQL进阶面试题完全攻略

    除了基础题部分 本文还收集整理的MySQL面试题还包括如下知识点或题型 MySQL高性能索引 SQL语句 MySQL查询优化 MySQL高扩展高可用 MySQL安全性 问题1 char varchar的区别是什么 varchar是变长而ch
  • 雪过天晴:OTA熬过旅游业寒冬

    旅游业新年开门红的热闹余音犹在 OTA平台走入三年来最具总结意义的一个财报季 继携程 途牛后 同程旅行于3月21日公布了2022年全年财报 数据显示 2022年 同程旅行实现收入65 8亿元 经调整净利润6 5亿元 其中每个季度都保持了盈利
  • 再造STM32---第十九部分:I2C—读写 EEPROM

    本章参考资料 STM32F4xx 参考手册 STM32F4xx 规格书 库帮助文档 stm32f4xx dsp stdperiph lib um chm 及 I2C 总线协议 若对 I2C 通讯协议不了解 可先阅读 I2C 总线协议 文档的