STM32的I2C主从机通信

2023-10-30

最近一段时间在做I2C通信协议,需要在两块STM32之间做I2C通信,定的是主机用IO口模拟,从机用的是STM32的硬件I2C,我的项目要求是需要主从机之间能够进行一串数据收发而不出错,实验时在主机方面,利用IO口模拟主机,只需要理解时序就够了,同时将速度能够控制在100K(标准)左右,基本的时序理解网上大把的资料,所以主机这一块几个小时就搞定了,而在做从机时,遇到了困难,本来从机也想用IO口模拟的,但是速度达不到那么快,因此只能选择硬件做从机,现就从机用中断方式开说,总结过程中遇到的几点问题:

1、由于STM32的硬件问题,建议在使用I2C时,将其优先级设为最高。

2、针对程序中除了I2C数据收发,还有别的中断程序或者指令要执行而导致I2C数据传输堵塞时,可以在执行完该段程序后重新初始化I2C。

主机程序如下:

  1 #include "Hal_IIC/I2C.h"
  2 #include "Hal_delay/delay.h"
  3 #include "common.h"
  4 #include "gizwits_product.h"
  5 
  6 extern void delayUs(uint32_t nus);
  7 uint8_t b[5];
  8 extern uint8_t Cookr[5];
  9 extern uint8_t WR_flag;
 10 uint8_t Wifi_SET;  //WIFI状态脚
 11 extern uint8_t Power_flag;         //电磁炉开启关闭标志位
 12 uint8_t Give_Up;
 13 /*--------------------------------------------------------------------------------
 14 调用方式:void IIC_Init(void) 
 15 函数说明:私有函数,I2C专用,函数初始化
 16 ---------------------------------------------------------------------------------*/ 
 17 void IIC_Init(void) 18 { 19  GPIO_InitTypeDef GPIO_InitStructure; 20 RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE ); //使能GPIOA时钟 21 22 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12; 23 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出 24 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 25 GPIO_Init(GPIOA, &GPIO_InitStructure); 26 GPIO_SetBits(GPIOA,GPIO_Pin_11|GPIO_Pin_12); //PA11,PA12 输出高 27 } 28 /*-------------------------------------------------------------------------------- 29 调用方式:void I2CStart(void) 30 函数说明:私有函数,I2C专用,开始信号 31 ---------------------------------------------------------------------------------*/ 32 void IIC_Start(void) 33 { 34 SDA_OUT(); //sda线输出 35 IIC_SDA=1; 36 IIC_SCL=1; 37 delayUs(4); 38 IIC_SDA=0;//START:when CLK is high,DATA change form high to low 39 delayUs(4); 40 IIC_SCL=0; //钳住I2C总线,准备发送或接收数据 41 } 42 /*-------------------------------------------------------------------------------- 43 调用方式:void I2CStop(void) 44 函数说明:私有函数,I2C专用,停止信号 45 ---------------------------------------------------------------------------------*/ 46 void IIC_Stop(void) 47 { 48 SDA_OUT();//sda线输出 49 IIC_SCL=0; 50 IIC_SDA=0;//STOP:when CLK is high DATA change form low to high 51 delayUs(4); 52 IIC_SCL=1; 53 IIC_SDA=1;//发送I2C总线结束信号 54 delayUs(4); 55 } 56 /*-------------------------------------------------------------------------------- 57 调用方式:I2CAck(void) 58 函数说明:私有函数,I2C专用,等待从器件接收方的应答&#x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32的I2C主从机通信 的相关文章

随机推荐

  • Nginx启动时提示nginx: [emerg] still could not bind()

    今天跟着视频学习Nginx时 启动Nginx报这个nginx emerg still could not bind 于是在网上找了解决方法在这里分享出来 报错界面 解决方法 1 根据Nginx配置文件查看配置的端口默认的是80端口 然后我们
  • PTA 浙大版《C语言程序设计(第3版)》题目集 练习5-2

    本题要求对两个整数a和b 输出其中较大的数 函数接口定义 int max int a int b 其中a和b是用户传入的参数 函数返回的是两者中较大的数 裁判测试程序样例 include
  • 小博客练习

    博客 简单的综合运用 一 了解博客需求 1 主要的分为前台和后台 后台 注册登录 登录 登录 分类管理 显示分类 编辑分类 添加分类 删除分类 文章管理 显示文章 编辑文章 添加文章 删除文章 用户管理 标签管理 等等功能 前台 首页面 列
  • linux常用命令总结

    linux常用命令总结 1 在根目录下查找xxx文件 2 列出程序启动时搜索库路径的过程 3 查看程序或so的依赖 1 查看Test程序依赖的so文件 2 也可以查看so依赖的文件 4 SSH相关 5 查看当前登录的用户 6 查看重启 登录
  • Java面试题整理-高并发篇

    1 synchronized的实现原理以及锁优化 synchronized原理分析 遇见更好的自己 的博客 CSDN博客Java 高并发专题之synchronized关键字1 synchronized作为jvm关键字有三个作用域synchr
  • rancher部署

    Rancher 管理 Kubernetes 集群 Rancher 简介 Rancher 是一个开源的企业级多集群 Kubernetes 管理平台 实现了 Kubernetes 集群在混合云 本地数据中心的集中部署与管理 以确保集群的安全性
  • 在脚本中 使用数组 获取列表中选中的复选框id + 获取选中的单选框的值

    var chk value 定义一个数组 input name communicateTeacher claIds checked each function 遍历每一个名字为interest的复选框 其中选中的执行函数 chk value
  • Pandas提取指定行列

    取列 1 通过列名称来提取指定列 推荐 列名 irline sentiment gold name negativereason gold retweet count text get data data airline sentiment
  • kafka基础学习(六):kafka 代码示例

    kafka 代码示例 生成者API在不同版本间无较大变动 消费者 Consumer 提供了两套API 低版本 8 0版本及其以前 API 高版本 8 0版本后 API 两种API的优缺点 高版本Consumer API 优点 高级API写起
  • Qt-UI 界面工具库简介

    一 关于Qt UI界面工具库 Qt UI界面工具库是武汉维仕杰科技有限公司基于Qt上进行扩展开发的控件包和界面工具 并且拥有完全自主的知识产权 得益于丰富的界面开发经验和强大的支持团队 使得Qt UI界面开发工具成为最专业 功能强大的Qt开
  • 他在 B 站有 178 万粉丝,今天免费带你玩转 Python

    近几年 编程越来越火 网上也是铺天盖地的免费教程 中小学生都开始投入到学习中 编程学习从娃娃抓起 甚至有些小学生都做起了 UP 主 教大家学编程 光从编程的难易度来说 Python 简单 易学 零基础 跨专业都很容易上手 想学全网超详细 P
  • Linux内核配置选项详解

    对于每一个配置选项 用户可以回答 y m 或 n 其中 y 表示将相应特性的支持或设备驱动程序编译进内核 m 表示将相应特性的支持或设备驱动程序编译成可加载模块 在需要时 可由系统或用户自行加入到内核中去 n 表示内核不提供相应特性或驱动程
  • Qt连接SQL server数据库

    Qt连接SQL server数据库 由于课程设计需要 需要用qt设计一个界面来操作数据库 在建立数据库连接时 期间遇到各种问题 Qt 连接SQL server数据大致可以概括为下图的三层模型 箭头代表他们之间的依赖关系 第一步 建立目标数据
  • FeignClient的参数传递给服务提供方的方式(简单数据类型、对象)

    1 简单数据类型的参数采用的restFull的方式 发送Get请求 服务提供方的controller 类名加了窄化请求 RequestMapping path house produces application json charset
  • 前端制作简单的“注册页面——阅读协议”页面及效果

    注 如对文中的scrollHeight scrollTop clientHeight属性有所一伙 请参考博文 JavaScript中元素client offset scroll相关属性的应用 链接 https blog csdn net m
  • 开源进展

    作为一个友好的 功能丰富的区块链中间件平台 WeBASE一直致力于降低区块链开发者的研发门槛 提高区块链开发效率 如今 WeBASE v1 5 4来了 此次更新新增区块链应用实训课程案例集 以及管理台操作指引与设计说明 助力社区开发者更快捷
  • 自定义指令 v-clickoutside 使用方法

    引入 import Clickoutside from element ui src utils clickoutside 声明 export default directives Clickoutside data function re
  • CentOS 安装Vim 编辑器

    在CentOS环境下使用vim提示 vim command not found时 说明系统还没有安装vim 安装步骤 1 检查是否已安装 查看一下你本机已经存在的包 确认一下你的VIM是否已经安装 输入 rpm qa grep vim 如果
  • 【详解】Thymeleaf中的基本表达式:@{},#{},${},*{}

    1 thymeleaf中的超链接表达式 话说例子如下 a a a a 2 thymeleaf中的消息表达式 或者是资源表达式 一般和 th text一起使用多一点 取出来的值取代了标签中的值 key 对应的value 如果标签中间已经有值
  • STM32的I2C主从机通信

    最近一段时间在做I2C通信协议 需要在两块STM32之间做I2C通信 定的是主机用IO口模拟 从机用的是STM32的硬件I2C 我的项目要求是需要主从机之间能够进行一串数据收发而不出错 实验时在主机方面 利用IO口模拟主机 只需要理解时序就