当前位置: 首页 > news >正文

STM32模拟I2C通讯的驱动程序

目录

STM32模拟I2C通讯的驱动程序

开发环境

引脚连接

驱动程序


STM32模拟I2C通讯的驱动程序

开发环境
立创天空星开发板、主控芯片为STM32F407VxT6
引脚连接
使用stm32的PB9引脚模拟I2C时钟线SCL、PB8引脚模拟I2C数据线SDA
驱动程序
i2c.h文件如下:
#ifndef _I2C_H
#define _I2C_H#include "stm32f4xx.h"//端口宏定义
#define RCC_I2C_GPIO          RCC_AHB1Periph_GPIOB
#define PORT_I2C_GPIO         GPIOB#define GPIO_SDA             GPIO_Pin_8
#define GPIO_SCL             GPIO_Pin_9//设置SDA输出模式
#define SDA_OUT()   {        \GPIO_InitTypeDef  GPIO_InitStructure; \GPIO_InitStructure.GPIO_Pin = GPIO_SDA; \GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; \GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; \GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; \GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; \GPIO_Init(PORT_I2C_GPIO, &GPIO_InitStructure); \}
//设置SDA输入模式
#define SDA_IN()    {        \GPIO_InitTypeDef  GPIO_InitStructure; \GPIO_InitStructure.GPIO_Pin = GPIO_SDA; \GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; \GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; \GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; \GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; \GPIO_Init(PORT_I2C_GPIO, &GPIO_InitStructure); \}
//获取SDA引脚的电平
#define SDA_GET()       GPIO_ReadInputDataBit(PORT_I2C_GPIO, GPIO_SDA)//SDA与SCL输出高低电平
#define SDA(x)          GPIO_WriteBit(PORT_I2C_GPIO, GPIO_SDA, (x?Bit_SET:Bit_RESET) )
#define SCL(x)          GPIO_WriteBit(PORT_I2C_GPIO, GPIO_SCL, (x?Bit_SET:Bit_RESET) )//模拟I2C引脚初始化
void I2C_GPIO_Init(void);//I2C起始时序
void I2C_Start(void);//I2C停止时序
void I2C_Stop(void);//主机发送应答或者非应答信号
void I2C_Send_Ack(unsigned char ack);//主机等待从机应答
unsigned char I2C_WaitAck(void);//主机发送一个字节数据
void Send_Byte(uint8_t dat);//主机接收一个字节数据
unsigned char Read_Byte(void);#endif
i2c.c文件如下:
#include "i2c.h"/******************************************************************* 函 数 名 称:I2C_GPIO_Init* 函 数 说 明:模拟IIC引脚初始化* 函 数 形 参:无* 函 数 返 回:无* 备       注:无
******************************************************************/
void I2C_GPIO_Init(void)
{RCC_AHB1PeriphClockCmd(RCC_I2C_GPIO, ENABLE); // 使能GPIO时钟GPIO_InitTypeDef  GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_SDA | GPIO_SCL;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(PORT_I2C_GPIO, &GPIO_InitStructure);
}/******************************************************************* 函 数 名 称:I2C_Start* 函 数 说 明:IIC起始时序* 函 数 形 参:无* 函 数 返 回:无* 备       注:无
******************************************************************/
void I2C_Start(void)
{SDA_OUT();SCL(1);SDA(0);SDA(1);delay_us(5);SDA(0);delay_us(5);SCL(0);
}/******************************************************************* 函 数 名 称:I2C_Stop* 函 数 说 明:I2C停止信号* 函 数 形 参:无* 函 数 返 回:无* 备       注:无
******************************************************************/
void I2C_Stop(void)
{SDA_OUT();SCL(0);SDA(0);SCL(1);delay_us(5);SDA(1);delay_us(5);
}/******************************************************************* 函 数 名 称:I2C_Send_Ack* 函 数 说 明:主机发送应答或者非应答信号* 函 数 形 参:0发送应答  1发送非应答* 函 数 返 回:无* 备       注:无
******************************************************************/
void I2C_Send_Ack(unsigned char ack)
{SDA_OUT();SCL(0);SDA(0);delay_us(5);if(!ack) SDA(0);else     SDA(1);SCL(1);delay_us(5);SCL(0);SDA(1);
}/******************************************************************* 函 数 名 称:I2C_WaitAck* 函 数 说 明:主机等待从机应答* 函 数 形 参:无* 函 数 返 回:0有应答  1超时无应答* 备       注:无
******************************************************************/
unsigned char I2C_WaitAck(void)
{char ack = 0;unsigned char ack_flag = 10;SCL(0);SDA(1);SDA_IN();SCL(1);while( (SDA_GET()==1) && ( ack_flag ) ){ack_flag--;delay_us(5);}if( ack_flag <= 0 ){I2C_Stop();return 1;	//应答超时返回1}else{SCL(0);SDA_OUT();}return ack;		//正常通讯返回应答
}/******************************************************************* 函 数 名 称:Send_Byte* 函 数 说 明:主机发送一个字节数据* 函 数 形 参:dat要发送的数据* 函 数 返 回:无* 备       注:无
******************************************************************/
void Send_Byte(uint8_t dat)
{int i = 0;SDA_OUT();SCL(0);//拉低时钟开始数据传输for( i = 0; i < 8; i++ ){SDA( (dat & 0x80) >> 7 );delay_us(1);SCL(1);delay_us(5);SCL(0);delay_us(5);dat<<=1;}
}/******************************************************************* 函 数 名 称:Read_Byte* 函 数 说 明:主机接收一个字节数据* 函 数 形 参:无* 函 数 返 回:接收到的数据* 备       注:无
******************************************************************/
unsigned char Read_Byte(void)
{unsigned char i,receive=0;SDA_IN();for(i=0;i<8;i++ ){SCL(0);delay_us(5);SCL(1);delay_us(5);receive<<=1;if(SDA_GET()){receive |= 1;}delay_us(5);}SCL(0);return receive;
}

​ ​

相关文章:

STM32模拟I2C通讯的驱动程序

目录 STM32模拟I2C通讯的驱动程序 开发环境 引脚连接 驱动程序 STM32模拟I2C通讯的驱动程序 开发环境 立创天空星开发板、主控芯片为STM32F407VxT6 引脚连接 使用stm32的PB9引脚模拟I2C时钟线SCL、PB8引脚模拟I2C数据线SDA 驱动程序 i2c.h文件如下&#xff1a;#ifndef…...

Unity简单操作及使用教程

Unity 是一款强大的跨平台游戏引擎&#xff0c;它不仅支持 2D 和 3D 游戏的开发&#xff0c;还可以用于虚拟现实 (VR)、增强现实 (AR)、动画、建筑可视化等多个领域。Unity 提供了完整的开发环境&#xff0c;具有丰富的功能、工具和资源&#xff0c;可以帮助开发者快速实现创意…...

网络安全法-监测预警与应急处置

第五章 监测预警与应急处置 第五十一条 国家建立网络安全监测预警和信息通报制度。国家网信部门应当统筹协调有关部门加强网络安全信息收集、分析和通报工作&#xff0c;按照规定统一发布网络安全监测预警信息。 第五十二条 负责关键信息基础设施安全保护工作的部门&#xf…...

qt 设置系统缩放为150%,导致的文字和界面的问题

1 当我们设置好布局后&#xff0c;在100%的设置里面都是正常的&#xff0c;但是当我们修改缩放为150%后&#xff0c;字体图标&#xff0c;界面大小就出现问题了&#xff0c;这就需要我们设置一些参数。 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QCoreAppl…...

Scala的正则表达式二

验证用户名是否合法 规则 1.长度在6-12之间 2.不能数字开头 3.只能包含数字&#xff0c;大小写字母&#xff0c;下划线def main(args: Array[String]): Unit {val name1 "1admin"//不合法&#xff0c;是数字开头val name2 "admin123"//合法val name3 &quo…...

软考系分:今日成绩已出

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间&#xff1a;11月9日。 总体感觉偏简单&#xff0c;但是知识点记得不牢&#xff0c;估计机会不大。 今日 12.11 &#xff0c;成绩已出&#xff0c;每科总分 75分&#xff0c;全部45分以上为通过。 成绩总…...

DevExpress WPF中文教程:Grid - 如何移动和调整列大小?(一)

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...

Docker 安装 sentinel

Docker 安装系列 1、拉取 [rootTseng ~]# docker pull bladex/sentinel-dashboard Using default tag: latest latest: Pulling from bladex/sentinel-dashboard 4abcf2066143: Pull complete 1ec1e81da383: Pull complete 56bccb36a894: Pull complete 7cc80011dc6f: Pull…...

PyCharm 2024.1 解锁版 (Python集成开发IDE)详细安装步骤

分享文件&#xff1a;PyCharm 2024.1 解锁版 (Python集成开发IDE) 链接&#xff1a;https://pan.xunlei.com/s/VOAa_CiVVvZnyQgLfpmCIOABA1 提取码&#xff1a;cx4h 安装步骤 1、下载解压后点击如下进行安装 2、选择安装路径 3、默认勾选将PyCharm创建桌面快捷方式 4、默认…...

SQL中的函数介绍

大多数SQL实现支持以下类型 文本函数&#xff1a;用于处理文本字符串&#xff08;如删除或填充值&#xff0c;转换值为大写或小写&#xff09;。数值函数&#xff1a;用于在数值数据上进行算术操作&#xff08;如返回绝对值&#xff0c;进行代数运算&#xff09;。日期和时间函…...

【工业机器视觉】基于深度学习的水表盘读数识别(2-数据采集与增强)

【工业机器视觉】基于深度学习的仪表盘识读&#xff08;1&#xff09;-CSDN博客 数据采集与增强 为了训练出适应多种表型和环境条件的模型&#xff0c;确保数据集的质量与多样性对于模型的成功至关重要。高质量的数据不仅需要准确无误、具有代表性&#xff0c;还需要涵盖尽可能…...

爬虫基础知识点

最近看了看爬虫相关知识点&#xff0c;做了记录&#xff0c;具体代码放到了仓库&#xff0c;本文仅学习使用&#xff0c;如有违规请联系博主删除。 这个流程图是我使用在线AI工具infography生成的&#xff0c;这个网站可以根据url或者文本等数据自动生成流程图&#xff0c;挺…...

高效利用资源:分布式有状态服务的高可靠性设计

在分布式系统设计中&#xff0c;实现有状态服务的高可靠性通常采用主备切换的方式。当主服务停止工作时&#xff0c;备服务接管任务&#xff0c;例如通过Keepalive实现VIP的切换以保证可用性。然而&#xff0c;这种方式存在资源浪费的问题&#xff0c;因为备服务始终处于空转状…...

aws(学习笔记第十六课) 使用负载均衡器(ELB)解耦webserver以及输出ELB的日志到S3

aws(学习笔记第十六课) 使用负载均衡器(ELB)以及输出ELB的日志到S3 学习内容&#xff1a; 使用负载均衡器(ELB)解耦web server输出ELB的日志到S3 1. 使用负载均衡器(ELB) 全体架构 使用ELB(Elastic Load Balancer)能够解耦外部internet访问和web server之间的耦合&#xff0c…...

关于php://filter过滤器

常规的php://filter过滤器&#xff1a; <?php //index.php include($_REQUEST[file]); ?> <?php //flag.php $flagflag{test_flag}; ?> 同过base64读取flag.php的类容&#xff1a; 常用payload&#xff1a; &#xff08;这是最常用的payload&#xff09; ph…...

数据安全法-政务数据安全与开放

第五章 政务数据安全与开放 第三十七条 国家大力推进电子政务建设&#xff0c;提高政务数据的科学性、准确性、时效性&#xff0c;提升运用数据服务经济社会发展的能力。 第三十八条 国家机关为履行法定职责的需要收集、使用数据&#xff0c;应当在其履行法定职责的范围内依…...

MySQL数据库的数据类型

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 MySQL数据库的数据类型 收录于专栏[MySQL] 本专栏旨在分享学习MySQL的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 数据类型分类 ​…...

前端H5移动端基础框架模板 :Vue3 + Vite5 + Pinia + Vant4 + Sass + 附源码

技术栈选用 Vue3 Vite5 Pinia Vant4 Sass 源码地址&#xff1a; git clone https://gitee.com/gaiya001/h5-APP.git1. 1.vite.config.js文件配置 ** import { defineConfig } from vite // 导入 Vite 的配置函数 import vue from vitejs/plugin-vue // 导入 Vue 插件 i…...

什么是线程安全

&#x1f308;&#x1f308;&#x1f308;今天给大家分享的是:什么是线程安全 目录 线程安全的定义 线程安全的级别 &#xff08;1&#xff09;不可变 &#xff08;2&#xff09;绝对线程安全 &#xff08;3&#xff09;相对线程安全 &#xff08;4&#xff09;线程非安全…...

️️️ 避坑指南:如何修复国密gmssl 库填充问题并提炼优秀加密实践20241212

&#x1f6e1;️ 避坑指南&#xff1a;如何修复国密gmssl 库填充问题并提炼优秀加密实践 ✨ 引言 在当下的数据安全环境中&#xff0c;SM4作为中国国家密码算法的代表性选择&#xff0c;被广泛应用于金融、通信和政府领域。然而&#xff0c;在实际开发中&#xff0c;即便是开…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

EtherNet/IP转DeviceNet协议网关详解

一&#xff0c;设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络&#xff0c;本网关连接到EtherNet/IP总线中做为从站使用&#xff0c;连接到DeviceNet总线中做为从站使用。 在自动…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...