IIC驱动OLED HAL库+CubeMX

一.IIC传输数据的格式

 

1.写操作

2.读操作 

3.IIC信号 

二. IIC底层驱动

#define SCL_PIN         GPIO_PIN_6
#define SDA_PIN         GPIO_PIN_7

#define SCL_PORT        GPIOB
#define SDA_PORT        GPIOB

/*********************
 * 函数宏定义
**********************/
#define SCL_H           HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, 1)
#define SCL_L           HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, 0)

#define SDA_H           HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, 1)
#define SDA_L           HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, 0)
#define SDA_IN          HAL_GPIO_ReadPin(SDA_PORT, SDA_PIN)

/*
 *  函数名:I2C_GPIO_ReInit
 *  功能描述:将模拟I2C的SCL和SDA引脚进行重新初始化
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
extern void I2C_GPIO_ReInit(void);

/*
 *  函数名:I2C_Start
 *  功能描述:模拟发出I2C的开始信号-->在SCL的高电平下,SDA的电平由高到低变化
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
extern void I2C_Start(void);

/*
 *  函数名:I2C_Stop
 *  功能描述:模拟发出I2C的停止信号-->在SCL的高电平下,SDA的电平由低到高变化
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
extern void I2C_Stop(void);

/*
 *  函数名:I2C_GetAck
 *  功能描述:模拟I2C获取从设备的响应信号-->在SCL的高电平下,从设备将SDA拉低
 *  输入参数:无
 *  输出参数:无
 *  返回值:成功得到响应返回0,否则返回-1
*/
extern int I2C_GetAck(void);

/*
 *  函数名:I2C_ACK
 *  功能描述:模拟I2C发出一个应答信号,在第九个时钟将SDA拉低
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
extern void I2C_ACK(void);

/*
 *  函数名:I2C_NACK
 *  功能描述:模拟I2C发出一个非应答信号,在第九个时钟将SDA拉高
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
extern void I2C_NACK(void);

/*
 *  函数名:I2C_WriteByte
 *  功能描述:模拟I2C发出一个字节的数据
 *  输入参数:data-->要发送出去的数据,范围0~255
 *  输出参数:无
 *  返回值:无
*/
extern void I2C_WriteByte(uint8_t data);

/*
 *  函数名:I2C_ReadByte
 *  返回值:返回读取到的数据
 *  输入参数:ack-->根据此参数判断在读到一个字节之后是否发出应答信号
 *  输出参数:无
*/
extern uint8_t I2C_ReadByte(uint8_t ack);

#endif /* __DRIVER_I2C_H */
void I2C_Delay(uint32_t t)
{
    volatile uint32_t tmp = t;
    while(tmp--);
}

/*
 *  函数名:I2C_GPIO_ReInit
 *  功能描述:将模拟I2C的SCL和SDA引脚进行重新初始化
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
void I2C_GPIO_ReInit(void)
{
    /* 1. 使用结构体定义硬件GPIO对象 */
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    
    /* 2. 将SCL和SDA的GPIO寄存器的值恢复为复位上电值 */
    HAL_GPIO_DeInit(SCL_PORT, SCL_PIN);
    HAL_GPIO_DeInit(SDA_PORT, SDA_PIN);
    
    /* 3. 使能SCL和SDA的GPIO的时钟,因为他们都是GPIOF组的,所以这里只使能GPIOF的时钟 */
    __HAL_RCC_GPIOF_CLK_ENABLE();
    
    /* 4. 设置GPIO的模式为开漏输出模式,响应速度设置为快速响应 */
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        
    /* 5. 选择要设置的GPIO引脚 */
    GPIO_InitStruct.Pin = SCL_PIN;
    
    /* 6. 调用init函数初始化GPIO */
    HAL_GPIO_Init(SCL_PORT, &GPIO_InitStruct);
    
    GPIO_InitStruct.Pin = SDA_PIN;
    HAL_GPIO_Init(SDA_PORT, &GPIO_InitStruct);
}

/*
 *  函数名:I2C_Start
 *  功能描述:模拟发出I2C的开始信号-->在SCL的高电平下,SDA的电平由高到低变化
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
void I2C_Start(void)
{
    SCL_H;
    SDA_H;
    I2C_Delay(100);
    SDA_L;
    I2C_Delay(100);
}

/*
 *  函数名:I2C_Stop
 *  功能描述:模拟发出I2C的停止信号-->在SCL的高电平下,SDA的电平由低到高变化
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
void I2C_Stop(void)
{
    SDA_L;
    SCL_H;
    I2C_Delay(100);
    SDA_H;
    I2C_Delay(100);
}

/*
 *  函数名:I2C_GetAck
 *  功能描述:模拟I2C获取从设备的响应信号-->在SCL的高电平下,从设备将SDA拉低
 *  输入参数:无
 *  输出参数:无
 *  返回值:成功得到响应返回0,否则返回-1
*/
int I2C_GetAck(void)
{
    int i = 0;
    SCL_L;
    SDA_H;
    I2C_Delay(100);
    SCL_H;
    while(SDA_IN != 0)
    {
        i++;
        if(i == 100)
        {
            SCL_L;
            return -1;
        }
        I2C_Delay(10);
    }
    SCL_L;
    return 0;
}

/*
 *  函数名:I2C_ACK
 *  功能描述:模拟I2C发出一个应答信号,在第九个时钟将SDA拉低
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
void I2C_ACK(void)
{
    SCL_L;
    SDA_L;
    I2C_Delay(100);
    SCL_H;
    I2C_Delay(100);
}

/*
 *  函数名:I2C_NACK
 *  功能描述:模拟I2C发出一个非应答信号,在第九个时钟将SDA拉高
 *  输入参数:无
 *  输出参数:无
 *  返回值:无
*/
void I2C_NACK(void)
{
    SCL_L;
    SDA_H;
    I2C_Delay(100);
    SCL_H;
    I2C_Delay(100);
}

/*
 *  函数名:I2C_WriteByte
 *  功能描述:模拟I2C发出一个字节的数据
 *  输入参数:data-->要发送出去的数据,范围0~255
 *  输出参数:无
 *  返回值:无
*/
void I2C_WriteByte(uint8_t data)
{
    uint8_t i = 0;
    for(i=0; i<8; i++)
    {
        SCL_L;
        I2C_Delay(100);
        if(data & 0x80)
        {
            SDA_H;
        }
        else
        {
            SDA_L;
        }
        data <<= 1; // 发出1bit数据后,要更新数据,将data的次高位移位到最高位
        SCL_H;
        I2C_Delay(100);
    }
    I2C_GetAck();
}

/*
 *  函数名:I2C_ReadByte
 *  返回值:返回读取到的数据
 *  输入参数:ack-->根据此参数判断在读到一个字节之后是否发出应答信号
 *  输出参数:无
*/
uint8_t I2C_ReadByte(uint8_t ack)
{
    uint8_t i = 0;
    uint8_t data = 0;
    
    SDA_H;
    for(i=0; i<8; i++)
    {
        SCL_L;
        I2C_Delay(100);
        SCL_H;
        I2C_Delay(100);
        data <<= 1; // 更新数据前,要将上一次数据左移1位用来保存接下来的这一位数据
        if(SDA_IN == 1)    
        {                 
            data++;
        }
        else
        {
            data = data;
        }
    }
    
    // 根据ack决定是否发出应答
    if(ack == 0)
    {
        I2C_ACK();
    }
    else if(ack == 1)
    {
        I2C_NACK();
    }
    
    return data;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

揭秘周杰伦《最伟大的作品》MV,绝美UI配色方案竟然藏在这里

色彩在UI设计的基本框架中占据着举足轻重的位置。实际上&#xff0c;精心挑选和组合的色彩配色&#xff0c;往往就是UI设计成功的不二法门。在打造出一个实用的UI配色方案过程中&#xff0c;我们需要有坚实的色彩理论知识&#xff0c;同时还需要擅于从生活中观察和提取灵感。以…

3、如何从0到1去建设数据仓库

1、数仓实施过程 1.1 数据调研 数据调研包括&#xff1a;业务调研、需求调研 业务调研 需要调研企业内有哪些业务线、业务线的业务是否还有相同点和差异点 各个业务线有哪些业务模块&#xff0c;每个模型下有哪些业务流程&#xff0c;每个流程下产生的数据 是怎样存储的 业务调…

Spring Boot集成MyBatis实现多数据源访问的“秘密”

文章目录 为什么需要多数据源&#xff1f;Spring Boot集成MyBatis的基础配置使用多数据源小结 &#x1f389;Spring Boot集成MyBatis实现多数据源访问的“秘密” ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&#xff1a;IT陈寒的博客&#x1f388;该系列文章专栏&…

技术面时,一定要掌握这3个关键点

前言 现在有这么多优秀的测试工程师&#xff0c;大家都知道技术面试是不可避免的一个环节&#xff0c;一般技术面试官都会通过自己的方式去考察你的技术功底与基础理论知识。 如果你参加过一些大厂面试&#xff0c;肯定会遇到一些这样的问题&#xff1a; 1、看你项目都用到了…

Navicat 技术指引 | 连接 GaussDB 主备版

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持对GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构同步、协同合作、数据迁移等&#xff09;&#xff0c;这…

【网络奇缘】- 计算机网络|分层结构|ISO模型

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 计算机网络分层结构 OSI参考模型 OSI模型起源 失败原因: OSI模型组成 协议的作用 &#x1f4dd;全文…

HTML实现简易计算器

随便写的&#xff0c;可能有bug&#xff0c;可以在评论区指出哈。 HTML代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>AI简易计算器</title> </head> <body> <table id"c…

二十四、RestClient操作文档

目录 一、新增文档 1、编写测试代码 二、查询文档 1、编写测试代码 三、删除文档 1、编写测试代码 四、修改文档 1、编写测试代码 五、批量导入文档 批量查询 一、新增文档 1、编写测试代码 SpringBootTest public class HotelDocumentTest {private RestHighLevelC…

Cesium 展示——地球以及渲染数据导出(下载)为图片或 pdf

文章目录 需求分析新加需求分析第一种方式第二种方式需求 将 Cesium 球体以及渲染数据导出为 jpg/png/pdf 分析 获取场景 scene 信息,转为image 的 octet-stream 流 进行下载为图片 /*** @todo canvas 导出图片* @param {string} dataurl - 地址* @return {Blob}*/ functio…

GeoTrust SSL数字安全证书介绍

一、GeoTrust OV证书的介绍 GeoTrust OV证书是由GeoTrust公司提供的SSL证书&#xff0c;它是一种支持OpenSSL的数字证书&#xff0c;具有更高的安全性和可信度。GeoTrust是全球领先的网络安全解决方案提供商&#xff0c;为各类用户提供SSL证书和信任管理服务。GeoTrust OV证书…

成为AI产品经理——模型评估概述

目录 一、模型宣讲和评估的原因 二、模型宣讲 三、模型评估 1. 重要特征 ① 特征来源 ②特征意义 2.选择测试样本 3.模型性能和稳定性 一、模型宣讲和评估的原因 刘海丰老师提到他们在做一个金融AI产品未注重模型指标&#xff0c;过于注重业务指标&#xff0c;导致产生…

C语言——深入理解指针(1)

目录 1.内存与地址 1.1 什么是内存 1.2 编址 2. 指针的变量和地址 2.1 取地址&#xff08;&&#xff09; 2.2 指针变量 2.3 解引用 2.4 指针变量大小 3. 指针变量类型存在的意义 3.1 不同类型指针的解引用 3.2 指针对整数的运算&#xff08;&#xff0c;-&#…

CentOS Stream 9系统Cgroup问题处理

安装docker容器启动失败 之前适配过Ubuntu系统的容器&#xff0c;由于版本比较高&#xff0c;没有挂载Cgroup的路径。这次使用Centos Stream 9系统安装docker容器时也遇到了这个情况。由于处理方式有些不一样&#xff0c;所以记录一下。 这是docker容器启动过报错的输出日志。…

实例讲解:在3dMax中如何使用python脚本?

如果你是Python或Maxscript的新手&#xff0c;你现在可以跟着这篇文章开始做一些代码了&#xff0c;本文将让我们从非常基本的东西开始学习。 如何在3dmax中获取选定的节点并打印出它们的名称&#xff1f;所有场景对象如何&#xff1f;我们直接看代码&#xff1a; import MaxP…

斯坦福大学引入FlashFFTConv来优化机器学习中长序列的FFT卷积

斯坦福大学的FlashFFTConv优化了扩展序列的快速傅里叶变换(FFT)卷积。该方法引入Monarch分解&#xff0c;在FLOP和I/O成本之间取得平衡&#xff0c;提高模型质量和效率。并且优于PyTorch和FlashAttention-v2。它可以处理更长的序列&#xff0c;并在人工智能应用程序中打开新的可…

预处理机制

跟着肯哥&#xff08;不是我&#xff09;学预处理机制 预处理类别 宏定义&#xff1a;#define 将文本替换为表达式或语句 条件编译&#xff1a;#ifdef、#ifndef和#if、#elif、#endif 根据标识符是否被定义选择编译代码 头文件包含&#xff1a;#include 将其他文件&#x…

万界星空科技商业开源MES/免费MES/低代码MES

万界星空科技商业开源MES可以提供包括制造数据管理、计划排程管理、生产调度管理、库存管理、质量管理、人力资源管理、工作中心/设备管理、工具工装管理、采购管理、成本管理、项目看板管理、生产过程控制、底层数据集成分析、上层数据集成分解等管理模块&#xff0c;打造一个…

Python+jieba+wordcloud实现文本分词、词频统计、条形图绘制及不同主题的词云图绘制

目录 序言&#xff1a;第三方库及所需材料函数模块介绍分词词频统计条形图绘制词云绘制主函数 效果预览全部代码 序言&#xff1a;第三方库及所需材料 编程语言&#xff1a;Python3.9。 编程环境&#xff1a;Anaconda3&#xff0c;Spyder5。 使用到的主要第三方库&#xff1a;…

gitee推荐-PHP面试准备的资料

该内容为giee项目。PHP-Interview: 这个项目是自己准备PHP面试整理的资料。包括PHP、MySQL、Linux、计算机网络等资料。方便自己以后查阅&#xff0c;会不定期更新&#xff0c;欢迎提交pr&#xff0c;如果错误&#xff0c;请指出&#xff0c;谢谢 在线预览地址&#xff1a;Intr…

【LeetCode】每日一题 2023_11_23 HTML 实体解析器(调库/打工)

文章目录 刷题前唠嗑题目&#xff1a;HTML 实体解析器题目描述代码与解题思路 结语 刷题前唠嗑 题目&#xff1a;HTML 实体解析器 题目链接&#xff1a;1410. HTML 实体解析器 题目描述 代码与解题思路 func entityParser(s string) (ans string) {return strings.NewRepla…