0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32F10x_硬件I2C主从通信 (轮询发送,中断接收)

黄工的嵌入式技术圈 ? 来源:黄工的嵌入式技术圈 ? 2020-03-25 10:59 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

Ⅰ、写在前面

关注我分享文章的朋友应该知道我在前面讲述过(软件、硬件)I2C主机控制从机EEPROM的例子。在I2C通信主机控制程序是比较常见的一种,可以说在实际项目中,很多应用都会使用到I2C通信。但在实际项目中作为I2C从机的应用相对要少的多,本文主要讲述关于【STM32F10x_硬件I2C主从通信】中STM32作为从机的例子。

在学习本问内容之前,如果对I2C协议还不太了解的朋友请先去了解一下I2C协议,或看我之前关于I2C通信的文章(我微信公众号和博客都有)。

关于STM32硬件I2C作为从机的文章网上很少(我在写本文之前也在百度、谷歌等网站上搜索了解过),我猜测大概的原因主要是两点:1.使用该功能的人比较少; 2.说STM32硬件I2C存在BUG。

“使用该功能的人比较少”这个可以理解。其实我不能理解的是,普遍说这个有BUG的现象。我只觉得,你选择了使用这个芯片来作为开发,你选择之前应该是认可它的,什么东西都不可能尽善尽美,一点小的瑕疵,只要可以避免就行。就像Windos系统一样,偶尔死机、蓝屏,但是你还是依然会选择使用它。

关于STM32硬件I2C自身BUG也不否认,但官方给出了解决的办法,作为程序员,解决一项BUG,也是对自身能力的一种提升。所以,遇到困难,勇于面对才是正确的做法。

实例实验:

本文提供两个实例:一个主机发送(硬件I2C轮询发送数据)、一个从机接收并打印接收数据(硬件I2C中断接收数据)。

主机间隔500ms发送10字节,从机接收10字节检测到I2C停止,将收到的数据通过串口打印出来。【发送的数据及长度可修改,从机自动检测停止条件,也就是可以检测得到主机发送了多少字节数据】

关于本文的更多详情请往下看。

Ⅱ、实例工程下载

笔者针对于初学者提供的例程都是去掉了许多不必要的功能,精简了官方的代码,对初学者一看就明白,以简单明了的工程供大家学习。

笔者提供的实例工程都是在板子上经过多次测试并没有问题才上传至360云盘,欢迎下载测试、参照学习。

提供下载的软件工程是基于Keil(MDK-ARM) V5版本、STM32F103ZE芯片,但F1其他型号也适用(适用F1其他型号: 关注微信,回复“修改型号”)。

STM32F10x_硬件I2C主机(发送数据 - 轮询方式)实例源代码工程:

https://yunpan.cn/cMKS6muF6643V访问密码 8e16

STM32F10x_硬件I2C从机(接收数据 - 中断方式)实例源代码工程:

https://yunpan.cn/cMKSMCkcn8tKv访问密码 f3ad

STM32F1资料:

https://yunpan.cn/crBUdUGdYKam2访问密码 ca90

Ⅲ、关于I2C协议

这里再次提示一下I2C协议重要的几点:

1.开始和停止条件

SCL时钟电平为高:

SDA数据线由高 -> 低 为总线开始条件;

SDA数据线由低 -> 高 为总线结束条件;

(IO模拟I2C时注意:开始之后将SCL变为低电平,防止误操作SDA使其通信停止)

时序图:

2.数据位传输

SCL时钟电平为低, 可以改换SDA数据线的电平,在SCL上升沿的过程将SDA数据发送出去。

(IO模拟I2C时切记:请先将SCL变为低电平,再改变SDA电平状态)

时序图:

3.数据传输

I2C是以字节(8位)的方式进行传输,总线上每传输完1字节之后会有一个应答信号,主器件(主机)需要产生对应的一个额外时钟。

传输格式:8位数据 + 1位应答

数据传输必须带响应,相关的响应时钟脉冲由主机产生,在响应的时钟脉冲期间,发送器释放 SDA 线(高)。

在响应的时钟脉冲期间 接收器必须将 SDA 线拉低,使它在这个时钟脉冲的高电平期间保持稳定的低电平。

应答位的产生及接收:

1.在(主机)写数据的时候是从机应答(给主机),主机检测;

2.在(主机)读数据的时候是主机应答(给从机),从机检测;

(这里可以借助I2C读写函数一起理解)

1.时序图(主机写,从机应答,主机读取应答):


2.时序图(主机读,主机产生应答):

更多关于I2C协议的文档可以网上查询,也可以参看我下面下载链接的文档(周立功翻译的版本):https://yunpan.cn/cMJxKJzpWFtHE访问密码 82f3

Ⅳ、硬件I2C主机发送数据

硬件I2C主机的配置其实很简单,和前面读写EEPROM的(主机)配置一样。

可参考我之前的文章:STM32F10x_模拟I2C读写EEPROM

这里就不再描述。主要讲述一下主机发送数据这一块的代码。

我封装的发送数据函数:

I2C_Master_BufferWrite(uint8_t* pBuffer, uint32_t NumByteToWrite, uint8_t SlaveAddress)

主要就是3个参数:数据BUF、数据长度、从设备地址


看过我前面主机读写EEPEOM代码的人应该很清楚,这里很相似。读写EEPROM比这里多了一个步骤,那就是多了写数据地址的步骤。

必须要有的三大步骤:

1.开始

2.设备地址/写

3.停止

主程序间隔500ms调用一次该函数,发送一串(我们定义10字节),从机也是间隔500ms收到一串数据并打印出来。

Ⅴ、硬件I2C从机中断接收数据

硬件I2C的从机接收数据一般分为三类:中断接收、DMA接收和轮询接收;

在实际项目中中断接收和DMA接收比较常见,因为不用占据CPU资源,有数据来了才响应接收【需要CPU具有硬件I2C功能】。

而轮询接收数据很占用CPU资源,一般是CPU没有硬件I2C资源,处理的数据不多的情况下。

硬件I2C从机配置I2C这一块比较简单,和上面主机类似,请参看源代码或参考我之前文章的讲述。

可参考我之前的文章:STM32F10x_模拟I2C读写EEPROM

提醒:配置中注意关于I2C事件中断这一块(请看源代码)。

中断接收函数源代码如下:


位于stm32f10x_it.c文件下。

进入I2C事件中断,判断是I2C从机事件,此时,作为从机接收数据需要检测三个标示:

1.检测主机已发生地址(ADDR = 1);

2.检测有接收数据(RXNE = 1);

3.检测到停止条件(STOPF =1)。

硬件I2C通信中,起始条件由硬件判断完成,我们检测的就需要这几步就能完成基本的接收数据功能。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32F10x
    +关注

    关注

    1

    文章

    81

    浏览量

    21106
  • I2C
    I2C
    +关注

    关注

    28

    文章

    1541

    浏览量

    128421
  • 主从通信
    +关注

    关注

    0

    文章

    7

    浏览量

    3611
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    第十八章 I2C通信测试

    本章介绍了I2C协议,其物理层用SDA和SCL双线,支持多设备:协议层含起始/停止信号、应答机制等。还讲解W55MH32的I2C外设及初始化,并进行了通信测试代码的分析。
    的头像 发表于 06-19 17:07 ?688次阅读
    第十八章 <b class='flag-5'>I2C</b><b class='flag-5'>通信</b>测试

    STM32H7CubeMX配置硬件I2C,读写失败是什么问题呀?

    STM32H7CubeMX配置硬件I2C,读写失败什么问题呀,同样的操作F4和F1都能正常使用,应该不存在
    发表于 06-12 06:21

    ADuM2250/ADuM2251热插拔双通道I2C隔离器技术手册

    ADuM2250/ADuM2251 为热插拔数字隔离器,内置非闩锁双向通信通道,且与I2C接口兼容。这样就不需要将I2C信号分成单独的发送信号与接收
    的头像 发表于 06-06 14:22 ?526次阅读
    ADuM2250/ADuM2251热插拔双通道<b class='flag-5'>I2C</b>隔离器技术手册

    STM32F103 I2C从机接收数据的问题

    我使用STM32F103做一个I2C从机接收数据的功能,通过查阅函数手册,使用了2种方法 方法1: 1、调用HAL_I2C_EnableLi
    发表于 06-06 12:29

    第十六章 一文浅谈I2C

    本篇文章介绍了W55MH32的I2C总线,其由SDA和SCL构成,具设备寻址等特点,协议含起始 / 停止信号等。阐述主从模式,介绍了相关例程,用于验证 I2C 通信功能。
    的头像 发表于 05-28 16:07 ?597次阅读
    第十六章 一文浅谈<b class='flag-5'>I2C</b>

    CYPD3177 I2C通信无应答怎么解决?

    SOC端通过I2C与CYPD3177进行通信,在读芯片ID时(0x0002寄存器),主机发送数据后无应答。目前SOC端和CYPD3177只连接了两根
    发表于 05-12 07:10

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-I2C设备驱动之Linux下的I2C驱动简介

    的物理细节,如时钟频率、总线状态管理、起始和停止条件等。I2C设备驱动:I2C设备驱动是用于与特定I2C设备通信的软件模块。每个I2C设备都
    发表于 04-15 10:39

    飞凌嵌入式ElfBoard ELF 1板卡-I2C设备驱动之Linux下的I2C驱动简介

    的物理细节,如时钟频率、总线状态管理、起始和停止条件等。I2C设备驱动:I2C设备驱动是用于与特定I2C设备通信的软件模块。每个I2C设备都
    发表于 04-15 10:19

    I2C总线通信原理 如何设计I2C总线电路

    I2C总线通信原理 I2C(Inter-Integrated Circuit)总线是一种用于集成电路之间进行通信的串行通信协议。它最早由飞利
    的头像 发表于 01-31 15:01 ?1315次阅读

    I2C总线的优缺点分析

    设备之间的通信,这大大减少了所需的引脚数量,降低了硬件成本。此外,由于其简单性,I2C总线也易于实现和维护。 2. 多主机和多从机支持 I2C
    的头像 发表于 01-17 15:50 ?1352次阅读

    I2C总线与Arduino的接口示例

    在现代电子设计中,I2C总线因其简单性和灵活性而广受欢迎。它允许多个设备共享同一通信线路,从而节省空间和成本。Arduino,作为一个多功能的微控制器平台,自然也支持I2C通信
    的头像 发表于 01-17 15:34 ?1772次阅读

    I2C总线故障排除技巧

    导致整个系统的功能受到影响。 1. 检查硬件连接 1.1 确认电源和接地 首先,确保I2C设备的电源和接地连接正确无误。不良的电源或接地连接可能导致信号不稳定,从而引发通信错误。 1.2 检查总线线缆 检查SDA和SCL线是否正
    的头像 发表于 01-17 15:20 ?2743次阅读

    I2C总线设备地址设置方法

    通常是一个7位或10位的数字,用于标识总线上的每个设备。在7位寻址模式下,地址范围是0x00到0x7F,而在10位寻址模式下,地址范围是0x
    的头像 发表于 01-17 15:17 ?4906次阅读

    I2C总线应用实例分析

    在现代电子系统中,I2C总线因其简单、灵活和高效的特点而被广泛应用于各种设备之间的通信I2C总线概述 I2C总线由Philips(现为NXP)在1980年代初期开发,最初用于音频和
    的头像 发表于 01-17 15:09 ?904次阅读

    RISC V的I2C操作

    。tsuData中,1代表10ns;Timeout中,1表示10nstLow和tHigh的1代表10ns10.1.3 软件部分(Risc V)l? I2C
    的头像 发表于 11-01 11:06 ?803次阅读