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.rhkb.cn/news/245375.html

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

相关文章

FinBert模型:金融领域的预训练模型

文章目录 模型及预训练方式模型结构训练语料预训练方式 下游任务实验结果实验一&#xff1a;金融短讯类型分类实验任务数据集实验结果 实验二&#xff1a;金融短讯行业分类实验任务数据集实验结果 实验三&#xff1a;金融情绪分类实验任务数据集实验结果 实验四&#xff1a;金融…

认识数学建模

文章目录 1 什么是数学建模2 数学建模的比赛形式3 参加数学建模的好处4 数学建模的流程5 数学建模成员分工6 数学建模常用软件7 数学建模竞赛7.1 美国大学生数学建模竞赛7.2 MathorCup高校数学建模挑战赛7.3 华中杯大学生数学建模挑战赛7.4 认证杯数学建模网络挑战赛7.5 华东杯…

简化java代码:mapstruct + 策略模式

目录 目的 准备 注意 相同类型-属性名不同 实体类 映射 使用 验证-查看实现类 测试 不同类型(策略模式) 实体类 映射 工具类 使用&#xff1a;对象拷贝 验证-查看实现类 测试 使用&#xff1a;集合拷贝 测试 策略模式说明 准备-依赖 目的 简化 BeanUtils.…

【C#】基础巩固

最近写代码的时候各种灵感勃发&#xff0c;有了灵感&#xff0c;就该实现了&#xff0c;可是&#xff0c;实现起来有些不流畅&#xff0c;总是有这样&#xff0c;那样的卡壳&#xff0c;总结下来发现了几个问题。 1、C#基础内容不是特别牢靠&#xff0c;理解的不到位&#xff…

oracle运维只磁盘

官网地址&#xff1a;管理磁盘使用&#xff08;任务列表&#xff09; - Oracle Solaris 管理&#xff1a;常见任务 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. 管理磁盘使用&#xff08;任务列表&#xff09;…

python:socket基础操作(4)-《tcp客户端基础》

tcp就和udp不一样了&#xff0c;tcp是客户端和服务器端&#xff0c;如果想通过tcp发送数据&#xff0c;要先让tcp进行连接服务器端 tcp客户端 先让服务器端进行启动 import socketdef main():# 创建套接字tcp_client_socket socket.socket(socket.AF_INET,socket.SOCK_STREAM…

关于达梦认证DCA DCP,TIDB认证PCTA PCTP考试那点事儿

文章最后有彩蛋&#xff0c;一定要看到最后... 一、正确的道路上遇到正确的你 伴随中国数据库领域的快速技术进步&#xff0c;国内数据库生态蓬勃发展&#xff0c;并不断涌现出极具创新力的产品&#xff0c;推动了数据库应用的遍地开花。截至2024年1月&#xff0c;墨天轮数据社…

MySQL的外键和连接,如何做到关联查询?

目录 一、MySQL介绍 二、什么是外键 三、什么是连接 四、如何实现关联查询 一、MySQL介绍 MySQL是一种开源的关系型数据库管理系统&#xff0c;它是目前最流行的数据库之一。MySQL由瑞典MySQL AB公司开发&#xff0c;后被Sun Microsystems收购&#xff0c;随后又被Oracle收…

github ssh ssh-keygen

生成和使用 SSH 密钥对是一种安全的身份验证方式&#xff0c;用于在你的本地系统和 GitHub 之间进行身份验证。以下是在 GitHub 上生成和使用 SSH 密钥对的基本步骤&#xff1a; 1. 生成 SSH 密钥对 在命令行中执行以下命令来生成 SSH 密钥对&#xff1a; ssh-keygen -C &q…

PHP - Yii2 异步队列

1. 前言使用场景 在 PHP Yii2 中&#xff0c;队列是一种特殊的数据结构&#xff0c;用于处理和管理后台任务。队列允许我们将耗时的任务&#xff08;如发送电子邮件、push通知等&#xff09;放入队列中&#xff0c;然后在后台异步执行。这样可以避免在处理大量请求时阻塞主应用…

0125-1-vue3初体验

vue3尝鲜体验 初始化 安装vue/clinext&#xff1a; yarn global add vue/clinext # OR npm install -g vue/clinext然后在 Vue 项目运行&#xff1a; vue upgrade --next项目目录 vue3-template ├── index.html // html模板 ├── mock // mock数据 │ └── user.…

【技术分享】Ubuntu 20.04如何更改用户名

产品简介 本文适用于所有RK3568/RK3588平台产品在Ubuntu 20.04系统上如何更改用户名&#xff0c;本文以IDO-EVB3588开发板为例&#xff0c;在ubuntu20.04系统上修改用户名industio为usernew。 IDO-EVB3588开发板是一款基于RK3588平台的产品。该开发板集成了四核Cortex-A76和四…

2023年CSDN年底总结-独立开源创作者第一年

2023年最大的变化&#xff0c;就是出来创业&#xff0c;当独立开源创作者&#xff0c;这一年发起SolidUI开源项目&#xff0c;把知乎重新开始运营起来。CSDN粉丝破万&#xff0c;CSDN博客专家和AI领域创作者。 2023年年度关键词&#xff1a;创业 https://github.com/CloudOrc…

【pdf技巧】pdf无法编辑的原因是什么?如何编辑pdf?

打开PDF文件之后发现没有办法编辑PDF文件&#xff0c;都有哪些原因呢&#xff1f; 首先我们可以考虑一下&#xff0c;PDF文件中的内容是否是图片&#xff0c;如果确认是图片文件&#xff0c;那么我们想要编辑&#xff0c;就可以先使用PDF编辑器中的OCR扫描功能&#xff0c;将图…

uniapp 解决键盘弹出页面内容挤压问题

page.json 配置 加 “app-plus”: { “softinputMode”: “adjustResize” } {"path": "pages/jxx/xx","style": {"navigationBarTitleText": "贺卡DIY","enablePullDownRefresh": false,"app-plus": {…

科技发展趋势,墨水屏电子桌牌将发挥更重要作用

随着科技的不断发展&#xff0c;电子桌牌作为信息展示和宣传的新型设备&#xff0c;逐渐在各个行业得到广泛应用。在国企单位、政府部门、大企业、外企等&#xff0c;墨水屏电子桌牌作为一种新型的数字化展示工具&#xff0c;也已经得到了越来越多的应用。下面&#xff0c;中科…

抖音VR直播:沉浸式体验一键打通360度精彩

随着5G技术的发展&#xff0c;VR直播近年来也逐步进入到大众的视野中&#xff0c;相比于传统直播&#xff0c;VR直播能够提供更加丰富的内容和多样化的互动方式&#xff0c;让观众更有沉浸感和参与感。现如今&#xff0c;抖音平台也上线了VR直播&#xff0c;凭借沉浸式体验和有…

视频尺寸魔方:分层遮掩3D扩散模型在视频尺寸延展的应用

▐ 摘要 视频延展(Video Outpainting)是对视频的边界进行扩展的任务。与图像延展不同&#xff0c;视频延展需要考虑到填充区域的时序一致性&#xff0c;这使得问题更具挑战性。在本文中&#xff0c;我们介绍了一个新颖的基于扩散模型的视频尺寸延展方法——分层遮掩3D扩散模型(…

Linux shell编程学习笔记42:hdparm命令

ChatGPT 和文心一言哪个更好用&#xff1f; 从智能回复、语言准确性、知识库丰富度等方面比较&#xff0c;两大AI助手哪个更胜一筹&#xff1f;快来和我们分享一下你的看法吧~ 0 前言 获取硬盘序列号是信息资产管理和信息安全检测中经常要收集的信息&#xff0c;对于Linux来说…

SpringBoot_基础

学习目标 基于SpringBoot框架的程序开发步骤 熟练使用SpringBoot配置信息修改服务器配置 基于SpringBoot的完成SSM整合项目开发 一、SpringBoot简介 1. 入门案例 问题导入 SpringMVC的HelloWord程序大家还记得吗&#xff1f; SpringBoot是由Pivotal团队提供的全新框架&…