推荐

分享一个大神的人工智能教程。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!http://www.captainbed.net/strongerhuang

Ⅰ、写在前面

关注我分享文章的朋友应该知道我在前面讲述过(软件、硬件)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  访问密码

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

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

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通信中,起始条件由硬件判断完成,我们检测的就需要这几步就能完成基本的接收数据功能。

 

Ⅵ、说明

理解本文之前请先理解I2C协议。

更多关于硬件I2C主从通信的例子(如:DMA发送、DMA接收等)就不再单独写文章讲述了,可以在微信公众号联系我。

以上总结仅供参考,若有不对之处,敬请谅解。

Ⅶ、最后

我的网站:https://www.strongerhuang.com

我的微信公众号(ID:strongerHuang)还在分享STM8、STM32、Keil、IAR、FreeRTOS、UCOS、RT-Thread、CANOpen、Modbus…等更多精彩内容,如果想查看更多内容,可以关注我的微信公众号。

微信公众号

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

  1. STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化

    STM32CUBEMX配置教程(八)STM32串口轮询发送中断接收+重定义+优化 基于STM32H743VI 使用STM32CUBEMX两年了,始终觉得这个工具非常的方便,但因为不是经常使用,导致有些 ...

  2. STM32单片机硬件I2C驱动程序(软件轮询方式)---摘自:FeoTech

    感谢原作者:FeoTech   原文网址:http://feotech.com/?p=69 本程序主要用于驱动STM32单片机芯片的硬件I2C寄存器,实现通过使用芯片自带的I2C寄存器进行数据的发送与 ...

  3. STM32F10x_硬件I2C读写EEPROM(标准外设库版本)

    Ⅰ.写在前面 上一篇文章是"STM32F10x_模拟I2C读写EEPROM",讲述使用IO口模拟I2C总线通信,对EEPROM(AT24Xxx)进行读写操作的过程. 上一篇文章主要 ...

  4. 蓝牙BLE芯片PHY6222之I2C主从通信

    蓝牙BLE芯片PHY6222之I2C主从通信 开发环境 I2C主机 I2C从机 注意事项 开发环境 1.PHY6222开发板 2.SDK版本以及路径:SDK\release_bbb_sdk-PHY62 ...

  5. java 硬件中断_Java异步事件:轮询与中断

    CPU几乎把所有的时间都花费在从内存获取指令并运行它们的过程中.然而,CPU和主存仅仅只是计算机硬件系统中众多组件的其中两个. 一个完整的系统还包含其他的设备,比如: 硬盘或者固态硬盘,用来存储程序和 ...

  6. S7-200SMART PLC进行MODBUS通信轮询卡死时重新开启轮询的具体方法演示

    S7-200SMART PLC进行MODBUS通信轮询卡死时重新开启轮询的具体方法演示 我们在进行MODBUS通信轮询时,若遇到轮询卡死时,如何重新开始轮询,具体可以参考以下内容: 如下图所示,正常轮 ...

  7. S7-200SMART_MODBUS RTU通信轮询中实现插队写入或条件写入的具体方法示例(1)

    S7-200SMART_MODBUS RTU通信轮询中实现插队写入或条件写入的具体方法示例(1) 前面的博文中和大家分享了MODBUS RTU通信轮询的具体方法,感兴趣的可以参考以下链接中的内容: S ...

  8. java 异步事件_Java编程入门——异步事件:轮询与中断

    CPU几乎把所有的时间都花费在从内存获取指令并运行它们的过程中.然而,CPU和主存仅仅只是计算机硬件系统中众多组件的其中两个.一个完整的系统还包含其他的设备,比如: 硬盘或者固态硬盘,用来存储程序和数 ...

  9. python 网络编程之Socket通信案例消息发送与接收

    背景 网络编程是python编程中的一项基本技术.本文将实现一个简单的Socket通信案例消息发送与接收 正文 在python中的socket编程的大致流程图如上所示 我们来首先编写客户端的代码: # ...

最新文章

  1. 135. 分发糖果(贪心算法)
  2. 卸载重装svn后原来项目不受管理,版本不对应还是,升级工作副本解决?
  3. WPF 从 .net core 3.1 到 .net 5.0
  4. 最小生成树的Prime算法的思想
  5. (三)cmockery中的消息打印以及可变参数相关总结
  6. 关于C++编写com和调用com组件的小例子以及个人所犯错误见解
  7. vue 修改路由名字_Vue 路由设置title
  8. BIOS知识枝桠——UEFI Driver
  9. 直接在html打开ppt,PPT内如何直接看网页
  10. 华为鸿蒙新闻短评,科技圈“某高管”发表对华为鸿蒙的看法,遭网友回怼
  11. Tomcat项目启动后,页面无法显示验证码
  12. nvd3使用(1)——多线图中的一个很隐蔽的bug
  13. wireshark检测广播风暴_带你走进网络世界:一文读懂广播风暴
  14. 在线编辑器CKeditor的应用
  15. 欢迎使用CSDN-markdown编辑器 新人报道
  16. 炫龙毁灭者P6-581S1NR笔记本重装win10系统教程
  17. TypeScript泛型与其他补充类型
  18. 中级微观经济学:Chap 7 显示偏好
  19. 『 高达 购物车案例 』jQuery + Java Script 全功能实现【超详细 代码分析】
  20. 君子先行其言,而后从之

热门文章

  1. antd modal 拖动_Package - antd-draggable-modal
  2. 有人机/无人机混合编队协同作战研究综述与展望
  3. 实验九:ENSP虚拟专用网络分析
  4. laravel 清空表 truncate()
  5. 面试超爱问的TopK问题,这篇彻底搞明白
  6. 【VC++学习日志】VCC++学习日志
  7. DLS11数据传输中继器
  8. Jq 复选框 全选,全不选,监听复选框,获取选中值
  9. swagger快速入门(springfox)
  10. 小程序事件绑定 传值和路由