解码内部集成电路(IIC)与OLED屏

news/2026/1/26 20:14:28/文章来源:https://www.cnblogs.com/YouEmbedded/p/19535443

内部集成电路(IIC/I2C)

图片04

基本概念

  • 英文全称Inter Integrated Circuit,简称IIC或I2C,是半双工同步串行通信接口协议
  • 1982年由飞利浦公司(现恩智浦半导体)设计推出
  • 设计初衷:为微控制器(MCU)与外围芯片提供简洁、可靠、低成本的通信方案,简化硬件设计和系统集成

图片01

引脚说明

图片02

  • 仅需两根引脚即可通信,硬件设计简洁:
    • 数据线(SDA,Serial Data):传输实际数据信息
    • 时钟线(SCL,Serial Clock):同步数据传输的时序控制
  • 所有支持IIC接口的外围设备(传感器、存储器等)可直接挂载在两根总线上
  • 支持多机通信架构:
    • 主从结构:单一主设备控制多个从设备
    • 多主结构:多个主设备协同工作
  • 核心机制:通过地址识别和仲裁机制实现设备间有序通信

总线结构

图片03

  • 采用开漏输出结构,可实现多设备双向通信与总线仲裁,避免电平冲突
  • 连接方式:所有外围器件的SCL和SDA均挂载在主控芯片提供的IIC总线上,形成共享信号通道
  • 空闲状态:上拉电阻将SCL和SDA均拉至高电平,总线处于待命状态,随时响应起始条件

线与逻辑

  • 多设备共享同一总线,某设备输出低电平时总线被拉低
  • 仅当所有设备释放总线(输出高阻态),上拉电阻才将总线恢复高电平
  • 核心作用:是IIC多主设备通信的基础,实现总线冲突检测与仲裁,保证数据传输有序性,简化硬件设计、降低系统成本

仲裁过程

当两个或多个主设备同时尝试发起通信时,仲裁过程如下:

  • 同时启动‌:假设主设备A和主设备B同时检测到总线空闲,并开始发送各自的起始条件和设备地址。
  • 逐位比对‌:在每一个时钟周期(SCL为高电平时),两个设备会同时在SDA线上输出一位数据,并立即采样SDA线的实际电平。
  • 仲裁失败判定‌:‌如果一个设备试图发送逻辑“1”(即释放SDA,让上拉电阻拉高),但采样到的总线电平为逻辑“0”,则说明有另一个设备正在发送逻辑“0”并成功拉低了总线。此时,试图发送“1”的设备立即判定为仲裁失败。‌‌12
  • 失败方退出‌:仲裁失败的设备会立即停止驱动SCL和SDA总线,转为监听模式,不再发送任何时钟或数据,以避免干扰胜出方的通信。‌1
  • 胜出方继续‌:仲裁成功的设备会继续完成其完整的通信过程(发送地址、读写数据、停止条件等),整个过程对胜出方来说是透明且无中断的。‌1
  • 失败方重试‌:仲裁失败的设备在检测到总线再次变为空闲后,可以重新尝试发起通信。

通信速率

  • 支持多种速率,适配不同场景:
    • 标准速率:100KHZ(满足多数基本控制和配置需求)
    • 快速速率:400KHZ(适用于高性能外围器件的高速应用场景)
  • 通信机制:半双工,同一时间仅能执行接收或发送操作,无法双向同时传输
  • 适用场景:侧重控制指令传输(设备控制、传感器读取、配置管理),不适合大规模数据交换

通信过程与时序分析

通信流程

  • 主机生成开始信号
  • 主机发送从设备地址(7位或10位)+ 读写控制位(bit0=0写操作,bit0=1读操作)
  • 从设备识别地址后应答,主机开始传输或接收数据
  • 数据传输完成后,主机生成停止信号,通信结束

图片03

空闲状态

图片05

  • SCL时钟线和SDA数据线均为高电平,由IIC总线的上拉电阻拉高

开始条件

图片06

  • SCL处于高电平期间,将SDA数据线的电平拉低,标志通信开始

传输数据

图片07

  • 时序同步方式:IIC以时钟脉冲的电平进行同步(区别于SPI的边沿同步)
  • 数据稳定性要求:
    • SCL低电平期间:SDA可切换电平(准备下一位数据)
    • SCL高电平期间:SDA必须保持稳定(确保数据可靠读取)
  • 传输规则:以字节为单位传输,MSB(高位)在前,需持续8个时钟脉冲

应答条件

图片08

  • 时序位置:字节传输8个时钟周期后,第9个时钟脉冲期间
  • 应答标志:接收方将SDA拉低表示应答(ACK),保持高电平表示非应答(NACK)
  • 控制方式:应答位可通过软件使能或禁止

停止条件

图片09

  • SCL处于高电平期间,将SDA数据线的电平拉高,标志通信结束

器件地址

图片010

  • 常规格式:7位二进制数(数据手册明确标注)
  • 扩展格式:10位二进制数(需占用两个字节传输)
  • 地址类型:包括设备自身地址和广播呼叫地址(广播呼叫地址检测可通过软件使能/禁止)
  • 作用:实现多设备识别,确保数据准确传输到目标设备

时序模拟

  • 硬件限制:MCU内部硬件IIC接口数量有限(如部分MCU仅3个)
  • 两种实现方式:
    • 硬件IIC:使用专用IIC引脚,需复用引脚功能并配置初始化
    • IO口模拟IIC:通过普通IO口模拟IIC时序,不受硬件接口数量限制,可移植性更高

代码(此处为了理解时序,引脚配置为推挽,实际要配置为开漏)

/* Private define ------------------------------------------------------------*/
// 引脚定义 自行选择要用的引脚 此处不做定义
#define IIC_SDA_PIN                        
#define IIC_SDA_GPIO_PORT                  
#define IIC_SDA_GPIO_CLK                   #define IIC_SCL_PIN                        
#define IIC_SCL_GPIO_PORT                  
#define IIC_SCL_GPIO_CLK                   // IIC引脚电平操作
#define IIC_SDA_LOW()       GPIO_ResetBits(IIC_SDA_GPIO_PORT, IIC_SDA_PIN)
#define IIC_SDA_HIGH()      GPIO_SetBits(IIC_SDA_GPIO_PORT, IIC_SDA_PIN)   #define IIC_SCL_LOW()       GPIO_ResetBits(IIC_SCL_GPIO_PORT, IIC_SCL_PIN)
#define IIC_SCL_HIGH()      GPIO_SetBits(IIC_SCL_GPIO_PORT, IIC_SCL_PIN)   #define IIC_SDA_READ()      GPIO_ReadInputDataBit(IIC_SDA_GPIO_PORT, IIC_SDA_PIN)/* Private functions ---------------------------------------------------------*/
/*** @brief  IIC底层GPIO初始化* @param  None* @retval None*/
void IIC_LowLevel_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;// 使能GPIO时钟RCC_AHB1PeriphClockCmd(IIC_SDA_GPIO_CLK | IIC_SCL_GPIO_CLK , ENABLE);// IIC引脚配置(推挽输出+上拉,符合IIC总线规范)GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;  // 上拉// SDA引脚配置GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;GPIO_Init(IIC_SDA_GPIO_PORT, &GPIO_InitStructure);// SCL引脚配置GPIO_InitStructure.GPIO_Pin = IIC_SCL_PIN;GPIO_Init(IIC_SCL_GPIO_PORT, &GPIO_InitStructure);// 总线空闲状态:SDA/SCL均为高IIC_SDA_HIGH();IIC_SCL_HIGH();delay_us(10); // 初始延时
}/*** @brief  IIC SDA引脚模式切换(输出/输入)* @param  Mode: 引脚模式(GPIO_Mode_OUT/GPIO_Mode_IN)* @retval None*/
void IIC_SDAPinModeSet(GPIOMode_TypeDef Mode)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(IIC_SDA_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Mode  = Mode;        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;  // 上拉GPIO_InitStructure.GPIO_Pin = IIC_SDA_PIN;GPIO_Init(IIC_SDA_GPIO_PORT, &GPIO_InitStructure);
}/*** @brief  IIC起始信号(SCL高时,SDA从高拉低)* @param  None* @retval None*/
void IIC_Start(void)
{IIC_SDAPinModeSet(GPIO_Mode_OUT);IIC_SDA_HIGH();IIC_SCL_HIGH();delay_us(5);  // 时序延时,保证总线稳定IIC_SDA_LOW();delay_us(5);IIC_SCL_LOW(); 
}/*** @brief  IIC停止信号(SCL高时,SDA从低拉高)* @param  None* @retval None*/
void IIC_Stop(void)
{IIC_SDAPinModeSet(GPIO_Mode_OUT);IIC_SCL_LOW();IIC_SDA_LOW();delay_us(5);IIC_SCL_HIGH();delay_us(5);IIC_SDA_HIGH();delay_us(5);
}/*** @brief  IIC发送1字节数据(MSB先行)* @param  byte: 待发送字节* @retval None*/
void IIC_Send(uint8_t byte)  
{uint8_t cnt = 0;IIC_SDAPinModeSet(GPIO_Mode_OUT);for(cnt=0; cnt<8; cnt++){IIC_SCL_LOW(); delay_us(2);// 输出当前位(最高位先行)if(byte & 0x80)IIC_SDA_HIGH();elseIIC_SDA_LOW();delay_us(2);byte <<= 1;IIC_SCL_HIGH();            delay_us(2);}IIC_SCL_LOW();delay_us(2);
}/*** @brief  检测IIC从机应答* @param  None* @retval true: 应答成功  false: 无应答*/
bool IIC_IsACK(void)  
{bool status = false;IIC_SDAPinModeSet(GPIO_Mode_IN);  // 切换为输入模式读应答delay_us(2);IIC_SCL_LOW();delay_us(2);IIC_SCL_HIGH();delay_us(2);// 从机应答:SDA拉低if(!IIC_SDA_READ())status = true;elsestatus = false;IIC_SCL_LOW();delay_us(2);return status;
}/*** @brief  主机发送应答/非应答* @param  ack: 0=应答  1=非应答* @retval None*/
void IIC_SendAck(uint8_t ack)  
{IIC_SDAPinModeSet(GPIO_Mode_OUT);IIC_SCL_LOW();delay_us(2);if(ack)IIC_SDA_HIGH();  // 非应答elseIIC_SDA_LOW();   // 应答delay_us(2);IIC_SCL_HIGH();delay_us(2);IIC_SCL_LOW();delay_us(2);
}/*** @brief  IIC读取1字节数据(MSB先行)* @param  None* @retval 读取到的字节*/
uint8_t IIC_Read(void)  
{uint8_t cnt  = 0;uint8_t data = 0;IIC_SDAPinModeSet(GPIO_Mode_IN);for(cnt=0; cnt<8; cnt++){IIC_SCL_LOW(); delay_us(2);IIC_SCL_HIGH();delay_us(2);data <<= 1;data |= IIC_SDA_READ();  // 读取当前位delay_us(1);}IIC_SCL_LOW();delay_us(2);return data;
}

OLED屏的原理与应用

基本概念

  • 英文全称Organic Light Emitting Diode(有机发光二极管)
  • 核心特性:自发光(无需背光)、对比度高、厚度薄、视角广、反应速度快、可挠曲、使用温度范围广、构造及制程简单
  • 0.96寸OLED屏关键参数:
    • 分辨率:128*64
    • 颜色选项:黄蓝(1/4黄光+3/4蓝光,固定区域)、纯白(黑底白字)、纯蓝(黑底蓝字)
    • 接口方式:5种(6800并行、8080并行、3线SPI、4线SPI、IIC),通过屏上BS0~BS2引脚配置
    • 模块类型:七针SPI/IIC兼容模块、四针IIC模块

驱动芯片

  • 主流芯片:SSD1306(本屏所用)

  • 核心特点:内置升压功能,无需额外设计升压电路(也支持外部升压,参考数据手册)

  • 存储结构:每页128字节,共8页,刚好匹配128**64点阵*

    image

  • 与SSD1106的区别:

    • SSD1106每页132字节,共8页
    • 移植注意:用0.96寸OLED移植1.3寸(SSD1106)程序时,需将显示地址向右偏移2,否则右侧4个像素点显示异常

器件地址

图片011

  • IIC从设备地址:默认0x78(7位地址)
  • 地址构成:011110 + SA0 + R/W#
    • SA0位:地址扩展位,可选择0111100(0x78)或0111101(0x79),由D/C#引脚控制
    • R/W#位:操作模式选择,R/W#=1为读模式,R/W#=0为写模式
  • 硬件要求:SDA和SCL引脚需连接上拉电阻

硬件接线

图片012

  • 核心引脚:VCC(电源)、GND(地)、SCL(IIC时钟线)、SDA(IIC数据线)
  • 接线原则:按模块引脚定义与MCU的IIC引脚(或模拟IIC的IO口)对应连接,确保电源电压匹配(参考模块数据手册)

点击此处获取移植代码
效果

1

取模操作

取模软件

需使用专用字模软件生成汉字、图片的点阵数据,存入字模库(oledfont.h)

图片取模参数

图片013

汉字取模参数

图片014

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

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

相关文章

深圳朋友圈广告代理:厚拓科技11年实战经验,精准触达12亿微信用户

在移动社交营销时代,微信朋友圈广告已成为品牌触达目标用户的核心阵地。作为腾讯生态中流量最密集、用户粘性最强的广告形式,朋友圈广告凭借其原生体验、精准定向和社交裂变能力,正为企业带来前所未有的营销转化机遇…

2026年干燥设备厂家推荐:常州市元泽干燥设备有限公司,多类型桨叶/流化床/喷雾干燥机供应

在工业干燥领域,设备的技术适配性与运行稳定性直接影响生产效率与产品质量。常州市元泽干燥设备有限公司作为国内专注于工业级干燥设备研发、定制、生产与服务的技术型企业,凭借多年技术积累与行业经验,已成为食品加…

2026年螺旋输送机厂家推荐:山东木子原环境工程,U型/双螺旋/食品级不锈钢输送机全系供应

在工业输送设备领域,螺旋输送机凭借其结构紧凑、密封性好、适应性强等特点,成为物料输送的核心设备之一。山东木子原环境工程有限公司作为行业技术驱动型企业,依托多年研发积累,形成了覆盖U型螺旋输送机、双螺旋输…

2026年气垫搬运设备推荐:陕西海创电子有限公司,全系气垫搬运装置车/工具供应

在工业搬运领域,气垫搬运设备因其高效、安全、灵活的特性,逐渐成为设备生产商、工程公司及国防工业等领域的核心工具。陕西海创电子有限公司作为该领域的深耕者,凭借其技术积累与产品创新,成为行业关注的焦点。公司…

Flutter for OpenHarmony 实战:碰撞检测算法与游戏结束处理

Flutter for OpenHarmony 实战&#xff1a;碰撞检测算法与游戏结束处理 文章目录Flutter for OpenHarmony 实战&#xff1a;碰撞检测算法与游戏结束处理一、前言二、碰撞检测概述2.1 墙壁碰撞2.2 自身碰撞2.3 检测时机三、墙壁碰撞检测3.1 边界判断算法3.2 坐标越界示例3.3 代码…

2026年旧变压器回收厂家推荐:铜陵市泰源物资回收有限公司,废旧/干式/厢式变压器全品类回收

在工业设备更新换代加速的背景下,变压器回收行业迎来发展机遇。据统计,2024年全国废旧变压器年产生量突破120万吨,其中干式变压器占比达35%,厢式变压器占比28%。铜陵市泰源物资回收有限公司凭借全品类回收能力,成…

基于Matlab的双边滤波去噪:图像的美颜魔法

基于Matlab的双边滤波去噪在图像处理领域&#xff0c;噪声就像是不速之客&#xff0c;破坏了图像原本的清晰与美感。双边滤波作为一种强大的去噪技术&#xff0c;如同图像的“美颜滤镜”&#xff0c;能在有效去除噪声的同时&#xff0c;最大程度保留图像的边缘细节。今天咱就来…

数据安全与合规:大数据治理的关键挑战与解决方案

数据安全与合规:大数据治理的关键挑战与解决方案 关键词:数据安全、合规性、大数据治理、隐私保护、数据泄露、监管法规、解决方案 摘要:在数字化时代,数据已成为企业的“数字石油”,但数据泄露、滥用等问题也频发。本文从“数据安全”与“合规”两大核心出发,结合生活案…

质量管理体系是什么,包括哪些内容?

谢邀。 质量管理体系是什么&#xff0c;包括哪些内容&#xff1f;很多老板一听质量管理体系&#xff0c;脑子里浮现的一般都是&#xff1a;“哦&#xff0c;就是那堆 ISO 文件和流程图吧&#xff1f;”实际上&#xff0c;企业真正头疼的并不是有没有文件&#xff0c;而是日常生…

Flutter for OpenHarmony 实战:贪吃蛇蛇的移动逻辑详解

Flutter for OpenHarmony 实战&#xff1a;贪吃蛇蛇的移动逻辑详解 文章目录 Flutter for OpenHarmony 实战&#xff1a;贪吃蛇蛇的移动逻辑详解一、前言二、坐标系统设计2.1 30x20网格坐标系2.2 坐标与像素映射2.3 Point类实现 三、Timer定时器实现自动移动3.1 Timer.periodic…

完整教程:Node.js 编程实战:自定义模块与包发布全流程解析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

强烈安利!8个AI论文网站测评:本科生毕业论文全攻略

强烈安利&#xff01;8个AI论文网站测评&#xff1a;本科生毕业论文全攻略 2026年AI论文写作工具测评&#xff1a;为何你需要这份指南&#xff1f; 随着人工智能技术的不断发展&#xff0c;越来越多的本科生开始借助AI工具辅助完成毕业论文的撰写。然而&#xff0c;面对市场上…

微信小程序开发一般多少钱?10年程序员给你讲透

我是专注小程序生态解决方案的技术,过去10年服务过近200家企业。每天被问最多的问题就是:“开发一个小程序到底要花多少钱?” 这就像问“装修一套房子多少钱”一样,答案差距很大,今天我就用真实行业经验帮你彻底搞…

Flutter for OpenHarmony 实战:贪吃蛇游戏核心架构设计

Flutter for OpenHarmony 实战&#xff1a;贪吃蛇游戏核心架构设计 文章目录Flutter for OpenHarmony 实战&#xff1a;贪吃蛇游戏核心架构设计一、前言二、贪吃蛇游戏功能拆解2.1 核心游戏机制2.2 技术实现要点三、核心数据结构设计3.1 Direction方向枚举3.2 Point坐标类设计3…

P10137 [USACO24JAN] Walking in Manhattan G

大概想到了。 考虑行走过程,从某个点向右上方行走,将这个点先固定到遇到的第一个交点,那么我们现在的问题就仅针对于这 \(n^2\) 个交点了。 考察一个很关键的事情是,假设一条直线上有 \(k\) 个交点,这 \(k\) 个交…

基于S7-300 PLC和组态王的恒压供水系统搭建与实现

基于S7-300 PLC和组态王组态控制的恒压供水系统在工业自动化领域&#xff0c;恒压供水系统是保障稳定供水的关键环节。今天咱们就唠唠基于S7-300 PLC和组态王组态控制的恒压供水系统。 1. 系统整体架构 恒压供水系统主要目的是保证供水压力稳定&#xff0c;不管用水情况如何变化…

基于Tent映射的混合灰狼优化改进算法:Matlab代码复现与解析

一种基于Tent映射的混合灰狼优化的改进算法(Matlab&#xff0c;代码复现&#xff0c;效果与原文一致&#xff0c;数值为运行30次数据) 1.tent映射 2.非线性控制参数策略(有代码&#xff0c;可以出图) 3.pso思想 在优化算法的领域里&#xff0c;不断的创新与改进是推动问题高效…

自适应巡航 Carsim + Simulink 联合仿真:两车固定间距的奇妙之旅

自适应巡航Carsimsimulink联合仿真&#xff0c;两车仿真 不支持三车 固定间距&#xff0c;carsim纯电车&#xff0c;PID控制。 ACC固定间距策略。在自动驾驶领域&#xff0c;自适应巡航&#xff08;ACC&#xff09;是一项非常关键的技术。今天咱们就来聊聊基于 Carsim 和 Simul…

无人驾驶车辆高速MPC例子复现:从理论到实践

无人驾驶车辆第七章高速mpc的例子复现&#xff0c;包含caraim文件&#xff0c;simulink文件和m文件&#xff0c;不包含指导&#xff0c;目前成功退换为双移线 版本是18matlab 19carsim最近在搞无人驾驶车辆相关项目&#xff0c;第七章高速MPC的例子复现真是个有趣又有挑战的活儿…

基于TensorRT、YOLOv5和QT构建智能监控平台

tensorrt yolov5 QT 智能监控平台。 yolov5使用 tensorrt推理封装成dll&#xff0c;支持多线程多任务&#xff0c;可同时并行加载不同模型&#xff0c;同时检测。 Qt开发的监控平台&#xff0c;支持不同平台部署&#xff0c;视频监控&#xff0c;录像回放&#xff0c;电子地图&…