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;
}

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

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

相关文章

短视频账号矩阵系统saas化批量管理部署搭建/技术

一、短视频矩阵系统建模----技术api接口--获取用户授权 技术文档分享&#xff1a; 本系统采用MySQL数据库进行存储&#xff0c;数据库设计如下&#xff1a; 1.用户表&#xff08;user&#xff09;&#xff1a; - 用户ID&#xff08;user_id&#xff09; - 用户名&#xff08;…

【Proteus仿真】【51单片机】智能垃圾桶设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用报警模块、LCD1602液晶模块、按键模块、人体红外传感器、HCSR04超声波、有害气体传感器、SG90舵机等。 主要功能&#xff1a; 系统运行后&#xf…

【CCF-PTA】第03届Scratch第01题 -- 梦醒时分

梦醒时分 【题目描述】 睡眠是人体正常的生理需要&#xff0c;同年龄男女睡眠时间无明显差别&#xff0c;一般是8小时左右。居家的小明作息生活很规律&#xff0c;晚上11点睡觉&#xff0c;早晨7点起床学习。请你编写程序来判断&#xff0c;每周&#xff08;共168小时&#x…

【UE5】资源(Asset)

了解UE游戏的基本构成 资源&#xff08;Asset&#xff09;: 在UE中&#xff0c;资源&#xff08;Asset&#xff09;是指游戏中使用到的各种素材&#xff0c;例如模型、纹理、材质、声音、动画、蓝图、数据表格、关卡等&#xff08;通常以uasset结尾&#xff09;&#xff0c;他…

【C++】list的介绍与使用

&#x1f9d1;‍&#x1f393;个人主页&#xff1a;简 料 &#x1f3c6;所属专栏&#xff1a;C &#x1f3c6;个人社区&#xff1a;越努力越幸运社区 &#x1f3c6;简 介&#xff1a;简料简料&#xff0c;简单有料~在校大学生一枚&#xff0c;专注C/C/GO的干货分…

如何使用ArcGIS Pro制作一张陆地和海洋对调后图

你是否有想过如果海洋和陆地对调一下——陆地变海洋&#xff0c;海洋变陆地后的世界地图会是什么样子&#xff0c;对于这个大胆的想法&#xff0c;我们可以通过ArcGIS Pro来制作地图&#xff0c;这里为大家介绍一下制作方法&#xff0c;希望能对你有所帮助。 数据来源 本教程…

idea git将某个分支内的commit合并到其他分支

idea git将某个分支内的commit合并到其他分支 1.打开旧分支的代码提交记录 在IDEA中切换到新分支的代码&#xff0c;点击Git打开代码管理面板&#xff0c;在顶部点击Log:标签页&#xff08;这个标签页内将来可以选择不同分支的个人/所有人的代码commit记录&#xff09;&#x…

01-详细介绍函数式接口和Lambda表达式语法

函数式接口介绍 如果在一个接口中只声明了一个抽象方法,则此接口就被称为函数式接口(该接口可以包含其他非抽象方法) 接口上使用FunctionalInterface注解可以验证该接口是否为函数式接口,javadoc生成的文档时也会保留该注解, 若接口中有多个抽象方法编译器会报错 随着Python…

OpenHarmony之NAPI框架介绍

张志成 诚迈科技高级技术专家 NAPI是什么 NAPI的概念源自Nodejs&#xff0c;为了实现javascript脚本与C库之间的相互调用&#xff0c;Nodejs对V8引擎的api做了一层封装&#xff0c;称为NAPI。可以在Nodejs官网&#xff08;https://nodejs.org/dist/latest-v20.x/docs/api/n-api…

利用企业被执行人信息查询API保障商业交易安全

前言 在当今竞争激烈的商业环境中&#xff0c;企业为了保障商业交易的安全性不断寻求新的手段。随着技术的发展&#xff0c;利用企业被执行人信息查询API已经成为了一种强有力的工具&#xff0c;能够帮助企业在商业交易中降低风险&#xff0c;提高合作的信任度。 企业被执行人…

小红书达人类型特点有哪些,创作形式总结!

小红书自带的社交电商属性&#xff0c;吸引了众多优秀的内容创作者和品牌达人。他们以不同的风格和主题&#xff0c;赢得了粉丝们的喜爱和关注。今天为大家分享下小红书达人类型特点有哪些&#xff0c;创作形式总结&#xff01; 1. 内容创作风格 我们从内容上来区分小红书达人类…

关闭vscode打开的本地服务器端口

vscode开了本地的一个端口“8443”当本地服务器端口&#xff0c;然后随手把VScode一关&#xff0c;后来继续做发现8443端口已经被占用了。   原来&#xff0c;即便关闭了编译器VScode&#xff0c;服务器依然是被node.exe运行着的。那这个端口怎么才能关掉呢&#xff1f;   …