STM32实现软件IIC协议操作OLED显示屏(1)

时间记录:2024/1/25

一、IIC协议介绍

(1)协议介绍
    IIC(又称I2C,Inter-Integrated Circuit),即集成电路总线,是一种两线式串行总线,由PHILIPS公司开发,用于连接微控制器及其外围设备。多用于主机和从机在数据量不大且传输距离短的场合下的主从通信。I2C总线由数据线SDA和时钟线SCL构成通信线路,既可用于发送数据,也可接收数据,是一种半双工通信协议。总线上的主设备与从设备之间以字节(8位)为单位进行双向的数据传输。
(2)传输模式

  • 标准模式:100K bit/s
  • 快速模式:400K bit/s
  • 高速模式:3.4M bit/s

(3)连接线路
连接线路
(4)通信时序图分析
1.4.1 空闲状态:IIC总线的SCL和SDA线同时处于高电平
1.4.2 起始信号S:SCL和SDA都处于高电平空闲状态(时间大于4.7us)时,将SDA线从高电平拉到低电平(时间大于4us)产生起始信号
起始信号
1.4.3 终止信号P:SCL处于高电平,SDA处于低电平(时间大于4us),将SDA线从低电平拉到高电平(时间大于4.7us)产生终止信号
终止信号
1.4.4 应答信号:8位1字节数据传输完毕后,第九位为应答信号,此时SCL由低电平转变为高电平,4us内读取SDA的电平状态,0表示从机应答,1表示无应答,主机发送应答信号时时间应大于4us
应答0
应答1
1.4.5 数据发送:SCL为高电平,SDA需要数据稳定,高电平发送数据1,低电平发送数据0,SCL为低电平时,SDA变换状态,改变要发送的数据位,且一字节数据高位先发,低位后发
发送数据

二、软件IIC实现

(1)初始化GPIO口

void vIICInit(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOB,&GPIO_InitStruct);GPIO_SetBits(GPIOB,GPIO_Pin_14);//默认处于空闲状态高电平GPIO_SetBits(GPIOB,GPIO_Pin_15);Delay_Init();
}

(2)SDA总线切换输入/输出模式

static void vSdaOut(void)
{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;//开漏输出GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOB,&GPIO_InitStruct);
}static void vSdaIn(void)
{GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;//上拉输入GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOB,&GPIO_InitStruct);
}

(3)起始信号

void vIICStart(void)
{vSdaOut();//切换SDA总线为输出模式SCL=1;SDA=1;Delay_Us(5);//拉高SCL和SDA,维持5usSDA=0;Delay_Us(5);//拉低SDA,维持5us
}

(4)终止信号

void vIICStop(void)
{vSdaOut();SCL=1;SDA=0;Delay_Us(5);//SCL高电平,SDA低电平,维持5usSDA=1;Delay_Us(5);//SDA电平拉高,维持5us
}

(5)发送校验位

void vIICSendAck(u8 ack)//做从机设备时需要
{vSdaOut();SCL=0;Delay_Us(2);//发送数据,SCL拉低,SDA信号变换if(ack==ACK)SDA=0;//变换SDA电平elseSDA=1;//变换SDA电平Delay_Us(2);//发送数据,SCL拉低,SDA信号变换SCL=1;Delay_Us(5);//拉高SCL将SDA数据发送出去SCL=0;
}

(6)接收校验位

u8 vIICCheckAck(void)
{u8 ack;vSdaIn();//切换SDA总线为输入模式SCL=0;Delay_Us(3);SCL=1;Delay_Us(3);//拉高后延时3us等待信号稳定if(SDA_STATE)//无应答ack=NACK;else//有应答ack=ACK;Delay_Us(3);SCL=0;return ack;
}

(7)发送1字节数据

void vIICSendByte(u8 byte_data)
{u8 i;vSdaOut();for(i=0;i<8;i++){SCL=0;Delay_Us(5);//拉低SCL等待SDA数据变换if(byte_data&0x80)//最高位为1,高位先发SDA=1;elseSDA=0;SCL=1;Delay_Us(5);//拉高SCL将SDA的一位数据发送出去byte_data<<=1;}SCL=0;Delay_Us(5);//拉低SCL等待SDA数据变换
}

(8)接收1字节数据

u8 vIICGetByte(void)
{vSdaIn();u8 temp,i;for(i=0;i<8;i++){SCL=0;Delay_Us(5);//拉低SCL等待接收数据SCL=1;Delay_Us(2);temp<<=1;if(SDA_STATE)temp|=0x01;Delay_Us(2);}SCL=0;Delay_Us(5);return temp;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/649167.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OSS上传下载乱码问题

配置headers&#xff1a; "Content-Disposition": attachment; filename*UTF-8${encodeURIComponent(file.file.name)},

【GitHub项目推荐--开源小游戏】【转载】

01 回合制生存游戏 Cataclysm-DDA 是一款回合制生存游戏&#xff0c;背景设置在后世界末日的世界中。虽然有些人将其描述为“僵尸游戏”&#xff0c;但《大灾变》远不止这些。努力在一个严酷、持久、程序生成的世界中生存。 为食物、设备寻找一个死去的文明的残余物。或者&am…

ThinkPHP+uni-app框架熊猫电竞赏金电竞系统源码PHP含APP+H5

熊猫电竞赏金电竞系统源码&#xff0c;包含APP、H5和搭建视频教程&#xff0c;支持运营级搭建&#xff0c;这套源码是基于ThinkPHPUniaapp框架开发的。 赏金电竞系统源码 APPh5搭建视频 可搭建&#xff01;运营级&#xff01; 赏金赛源码&#xff0c;用户通过平台打比赛&#x…

小白水平理解面试经典题目LeetCode 594 Longest Harmonious Subsequence(最大和谐字符串)

594 最大和谐字符串 这道题属于字符串类型题目&#xff0c;解决的办法还是有很多的&#xff0c;暴力算法&#xff0c;二分法&#xff0c;双指针等等。 题目描述 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 现在&#xff0c;给你一个整数数组 nums …

用vue实现微信小程序的点餐首页-纯前端效果

一、效果图 图片来源于网络 二、代码 <template><view class"container"><view class"top"><image src"../../static/img/home.png" class"home"></image></view><view class"content&…

安装好IntelliJ IDEA点击无反应,如何解决配置文件不一致导致的启动问题

在我们的开发生涯中&#xff0c;遇到IDE工具出现问题是在所难免的。最令人头疼的莫过于&#xff0c;你的IDEA(IntelliJ IDEA)无法启动&#xff0c;而且没有任何错误提示。这篇文章将详细讲解如何解决IntelliJ IDEA 2023.3.3版本启动失败的问题&#xff0c;这个问题可能也适用于…

Linux的文件系统、软硬链接、动静态库

前要&#xff1a;本次我想给您带来关于 IO 和文件的知识&#xff0c;而文件在本系列中分为内存上的文件和磁盘上的文件。 1.文件概念 1.1.文件读写 在谈及系统接口之前&#xff0c;我们先来从 C 语言的角度来谈及一些前要知识&#xff0c;以辅助我们后续来理解系统 IO。 我们…

LeetCode.2859. 计算 K 置位下标对应元素的和

题目 题目链接 分析 这道题的题意很明确。就是求每一个下标的二进制中1的个数为k的下标所对应的元素值之和。 Java 中有 库函数 Integer.bitCount(num)&#xff0c;这个函数的返回值就是 num 中 1 的个数。 代码 class Solution {public int sumIndicesWithKSetBits(List…

uniapp状态管理Vuex介绍及vuex核心概念

状态管理Vuex Vuex 是什么&#xff1f; Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。 uni-app 内置了 Vuex 什么是“状态管理模式”&#xff1f; <!…

英特尔正式发布OpenVINO™ 2023.3版本

2024年1月24日&#xff0c;英特尔正式发布了OpenVINO™ 2023.3版本&#xff08;Release Notes for Intel Distribution of OpenVINO Toolkit 2023.3&#xff09;。OpenVINO™是英特尔针对自家硬件平台开发的一套深度学习工具库&#xff0c;包含推断库&#xff0c;模型优化等等一…

决策树的基本构建流程

决策树的基本构建流程 决策树的本质是挖掘有效的分类规则&#xff0c;然后以树的形式呈现。 这里有两个重点&#xff1a; 有效的分类规则&#xff1b;树的形式。 有效的分类规则&#xff1a;叶子节点纯度越高越好&#xff0c;就像我们分红豆和黄豆一样&#xff0c;我们当然…

【Java基础】聊聊你不知道的注解那些事

在实际的开发中&#xff0c;我们大量使用了注解&#xff0c;无论是spring、还是本身jdk提供的&#xff0c;注解都是围绕一个java程序员的开发生活&#xff0c;所以本篇主要介绍注解相关的概念、理论、实践。 定义注解 注解和异常非常相似&#xff0c;都可以自定义&#xff0c…

如何在html5中的canvas绘制文本自动换行?

在这篇文章中我们讲解了怎么解决canvas绘图过程中,drawText的换行问题,先看一个大家平时在canvas绘制文本都会遇到的问题: 一个150*100的canvas画布,加个边框明显边界 <canvas id="canvas" style="border:solid 1px darkgoldenrod;" width="2…

ubuntuNginx反向代理和负载均衡

配置两台服务器确保nginx启动并且可以访问 配置nginx代理服务器 可以选择直接安装或者编译安装nginx rootubuntu:~# apt install libgd-dev #安装依赖 rootubuntu:~# apt update rootubuntu:~# apt install libpcre3 libpcre3-dev rootubuntu:~# apt-get install openssl…

jQuery遍历(其他遍历)

1、.add&#xff08;&#xff09;: 添加元素到匹配的元素集合 例一&#xff1a; <script> $(document).ready(function(){ $("div").add("p").css("background-color","red") }) </script…

前端canvas项目实战——简历制作网站(二)——右侧属性栏(颜色)

目录 前言一、效果展示二、实现步骤1. 实现一个自定义的选色板2. 创建属性工厂&#xff0c;为每个对象定制属性3. 为canvas对象注册监听器&#xff0c;点击不同对象时更新属性列表 三、Show u the code后记 前言 上一篇博文中&#xff0c;我们实现了左侧工具栏&#xff0c;通过…

kubernetes实战教程:kubernetes简介

kubernetes实战教程:kubernetes简介 简介 官网:https://kubernetes.io/zh-cn/ 一款生产级别的容器编排系统,也成为k8s,用于自动部署,扩展和管理容器化应用的开源系统.Google在2014年开源了kubernetes(后续就用k8s来代替了)这个项目.k8s建立在Google大规模运行生产工作负载十几…

解决vue 2.6通过花生壳ddsn(frp内网穿透)实时开发报错Invalid Host header和websocket

请先核对自己的vue版本&#xff0c;我的是2.6.14&#xff0c;其他版本未测试 起因 这两天在维护一个基于高德显示多个目标&#xff08;门店&#xff09;位置的项目&#xff0c;由于高德要求定位必须使用https服务&#xff0c;遂在本地无法获取到定位坐标信息&#xff0c;于是…

OpenCV笔记之图像处理中遮罩和掩模的关系

OpenCV笔记之图像处理中遮罩和掩模的关系 code review 文章目录 OpenCV笔记之图像处理中遮罩和掩模的关系1.遮罩详解遮罩的创建遮罩的应用遮罩的主要应用遮罩的类型如何创建遮罩遮罩在图像处理中的应用方式 2.遮罩和掩模的关系 1.遮罩详解 在图像处理中&#xff0c;遮罩&#…

字符串和格式化输入/输出

本文参考C Primer Plus进行C语言学习 文章目录 strlen()函数sizeof使用数据类型 1.strlen()函数 之前提到的sizeof运算符它以字节为单位给出对象的大小。strlen()函数给出字符串中的字符长度。 #include<stdio.h> #include<string.h> #define PRAISE "You ar…