网站建设管理员,网站建设合同书下载,搜索引擎的优化方法有哪些,wordpress 优化提速Ⅰ、写在前面 关注我分享文章的朋友应该知道我在前面讲述过#xff08;软件、硬件#xff09;I2C主机控制从机EEPROM的例子。在I2C通信主机控制程序是比较常见的一种#xff0c;可以说在实际项目中#xff0c;很多应用都会使用到I2C通信。但在实际项目中作为I2C从机的应用相…Ⅰ、写在前面 关注我分享文章的朋友应该知道我在前面讲述过软件、硬件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云盘欢迎下载测试、参照学习。 提供下载的软件工程是基于KeilMDK-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接收等就不再单独写文章讲述了可以在微信公众号联系我。 以上总结仅供参考若有不对之处敬请谅解。 Ⅶ、最后 更多精彩文章我将第一时间在微信公众号里面分享对本文有什么疑问可微信留言。 本着免费分享的原则方便大家手机学习知识定期在微信平台分享技术知识。如果你觉得分享的内容对你有用又想了解更多相关的文章请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注将有更多精彩内容等着你。 转载于:https://www.cnblogs.com/strongerHuang/p/5787392.html