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)},

chatGPT辅助写硕士毕业论文

一、写作顺序 1.标题、研究问题、研究方法 2.文献综述&#xff08;占比1/5-1/6&#xff09; 3.论证章节 4.结论、不足、启示 5.处理图表、参考文献的格式 6.绪论或引言 7.摘要、关键词 8.查重、装订 http://【硕士毕业论文写不下去&#xff0c;多亏听了张博士的论文写…

【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。 我们…

三、详解Redis分布式锁Redisson分布式锁

一、什么是分布式锁&#xff1f; 在传统的java进程中&#xff0c;我们常常用Synchronized三、详解Synchronized-CSDN博客或者ReentrantLock五、详解ReentrantLock-CSDN博客来对临界区进行加锁,防止多个线程之间并行访问,导致数据读写异常。但是这种锁的粒度仅限于当前jvm中&am…

淘宝/天猫API:电商卖家的数据之源

淘宝/天猫API是电商卖家的数据之源&#xff0c;它提供了丰富的功能和数据&#xff0c;帮助卖家更好地管理自己的店铺和业务。通过淘宝/天猫API&#xff0c;卖家可以获取商品信息、订单信息、用户信息等数据&#xff0c;并对这些数据进行处理、分析和利用&#xff0c;以提高自己…

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

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

<网络安全>《7 网络资产测绘和脆弱性管理系统》

1 概念 互联网资产通常大致分为Web类和设备类。Web类包括网站、APP、微信小程序&#xff1b;设备类包括路由器、交换机、网关、防火墙、WAF等。这些信息资产暴露在互联网上的信息包括IP地址、域名、端口、中间件、应用、技术架构等。通常包括且不限于在用、试用和停用的IP地址…

服务器常遇的响应状态码和应对处理

在互联网交互中&#xff0c;服务器返回的状态码是我们理解和处理请求结果的重要依据。了解这些状态码&#xff0c;可以帮助我们更好地诊断问题、优化服务&#xff0c;以及提供更稳定、更高效的用户体验。 以下是一些常见的服务器响应状态码及其处理方法&#xff1a; 状态码 5…

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

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

讲清楚浅拷贝和深拷贝

先放出实现浅拷贝和深拷贝的一些方法(直接食用)&#xff1a; 1.浅拷贝&#xff1a; 浅拷贝在拷贝对象的时候&#xff0c;对于对象最外一层实现的是普通的值拷贝&#xff0c;对于对象里面的对象是浅拷贝&#xff0c;只复制地址不复制地址对应的值。 /* 方法1.1&#xff1a;扩…

英特尔正式发布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…