stm32-iic 时序驱动

news2024/11/17 19:53:01

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据发送
在这里插入图片描述

#include "IIC.h"
#include "delay.h"

void IIC_Init(void){

	GPIO_InitTypeDef  GPIO_InitStruct;
	//使能GPIPF
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);

	//初始GPIGB8 GPIGB9 
	GPIO_InitStruct.GPIO_Pin	= GPIO_Pin_8 | GPIO_Pin_9; 	 //引脚9
	GPIO_InitStruct.GPIO_Mode	= GPIO_Mode_OUT; //输出
	GPIO_InitStruct.GPIO_OType	= GPIO_OType_OD; //开漏输出
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz; //速度
	GPIO_InitStruct.GPIO_PuPd	= GPIO_PuPd_UP;   //上拉
	
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	//初始化总线->空闲状态
	SDA_OUTPUT();
	SCL = 1;
	SDA_OUT = 1;
	
}
	

void IIC_Start(void){

	//输出模式
	SDA_OUTPUT();
	
	//1.总线空闲
	SDA_OUT = 1;
	SCL = 1;
	delay_us(5);
	
	//2.SDA电平跳变	H -> L
	SDA_OUT = 0;
	delay_us(5);
	
	//3.占据时钟总线
	SCL = 0;
	
}


void IIC_Stop(void){

	//输出模式
	SDA_OUTPUT();
	
	//1.钳住总线同时SDA为零
	SDA_OUT = 0;
	SCL = 0;
	delay_us(5);
	
	//2.SCL、SDA电平跳变 L ->	H
	SCL = 1;
	SDA_OUT = 1;
	delay_us(5);

}
		
void IIC_Write_Byte(u8 data){

	int i = 7;
	//输出模式
	SDA_OUTPUT();
	
	
	//一个字节八位,循环八次
	SCL = 0;
	for(; i >= 0; i--){
		
		SCL = 0;
		//判断当前数据位:高位在前、低位在后
		if((data & (1<<i))){
		
			SDA_OUT = 1;
		}
		else{
		
			SDA_OUT = 0;
		}
		delay_us(5);	//此处不知道为什么要延时 1.构成脉冲周期
		SCL = 1;
		delay_us(5);
		
		//3.钳住总线
		SCL = 0;	
	}

	//3.占据时钟总线,释放数据总线
	SCL = 0;
	SDA_OUT	= 1;
}
	
u8	IIC_Read_Byte(void){

	u8 data = 0;
	int i = 7;
	
	//输入模式
	SDA_INPUT();
	
	//一个字节八位,循环八次
	SCL = 0;
	for(; i >= 0; i--){
		
		//低电平准备数据
		delay_us(5);
		
		//判断当前数据位:高位在前、低位在后
		SCL = 1;
		if(SDA_IN){
		
			data |= (1 << i);
		}
		delay_us(5);
		
		//3.钳住总线
		SCL = 0;	
	}

	//4.占据时钟总线,释放数据总线
	SCL = 0;
	SDA_OUT	= 1;
	return data;
}
	
	
u8	IIC_Wait_Ack(void){

	u8 ask = 0;
	
	//输入模式
	SDA_INPUT();

	//1.准备ask
	SCL = 0;
	delay_us(5);
	
	//2.读取ASK
	SCL = 1;
	if(SDA_IN == 1){
		ask = 1;
	}
	else ask = 0;
	delay_us(5);
	
	//3.占据时钟总线,释放数据总线
	SCL = 0;
	SDA_OUT	= 1;
	return ask;
	
	
}
	
void IIC_Send_Ack(void){

	//输出模式
	SDA_OUTPUT();
	
	//1.准备数据
	SCL = 0;
	SDA_OUT = 0;
	delay_us(5);	
	
	//2.发送ASK
	SCL = 1;
	delay_us(10);
	
	//3.占据时钟总线,释放数据总线
	SCL = 0;
	SDA_OUT	= 1;

}
	
	
	
void IIC_Send_NAck(void){

	//输出模式
	SDA_OUTPUT();
	
	//1.准备数据
	SCL = 0;
	SDA_OUT = 1;
	delay_us(5);	
	
	//2.发送NASK
	SCL = 1;
	delay_us(5);
	
	//3.占据时钟总线,释放数据总线
	SCL = 0;
	SDA_OUT	= 1;
}

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

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

相关文章

4.28 白噪声功率谱密度的估计

前一节有下面结论&#xff1a; 什么仿真的白噪声波形是均匀的&#xff0c;均匀的特点是相关函数在0时刻是相关的&#xff08;自己和自己相关的&#xff09;0以外时刻都互相不相关

PLC 网关设备如何进行数据采集?

引言&#xff1a; 在现代工业领域&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;被广泛应用于自动化控制系统。为了实现高效的数据收集和分析&#xff0c;工业边缘网关扮演着重要角色。本文将探讨PLC网关设备如何进行数据采集&#xff0c;并介绍一款优秀的工业边缘网…

JVM-jvisualvm性能监控可视化工具使用与eden-s0-s1分配分析(三)

目录 第一步&#xff1a;安装jvisualvm 第二步&#xff1a;安装VisualvmGc插件 方式一&#xff1a;jvisualvm工具直接下载安装 方式二&#xff1a;去官网下载导入安装 总结 第三步&#xff1a;idea安装VisualvM Launcher插件 第四步&#xff1a;演示young中eden、s0、s1垃…

浅谈小程序开发 [2018年]

一、问题背景 随着App市场趋近于饱和&#xff0c;大部分用户已经养成了使用习惯&#xff0c;加上开发和推广新的App的成本高&#xff0c;使得开发新的App很难在市场上生存。在此背景下&#xff0c;小程序应运而生&#xff0c;2016年&#xff0c;张小龙的微信团队首次推出了微信…

vmware虚拟机无法启动修复

虚拟机场景报错&#xff1a;Entering emergency mode. Exit the shell to continue. #输入journalctl journalctl #如果出现以下描述&#xff1a; failed to mount /sysroot. Dependency failed for Initrd root File System. Dependency failed for Reload configuration fro…

信息服务上线渗透检测网络安全检查报告和解决方案4(网站风险等级评定标准、漏洞危害分级标准、漏洞安全建议)

系列文章目录 信息服务上线渗透检测网络安全检查报告和解决方案3(系统漏洞扫描、相对路径覆盖RPO漏洞、nginx漏洞修复)信息服务上线渗透检测网络安全检查报告和解决方案2(安装文件信息泄漏、管理路径泄漏、XSS漏洞、弱口令、逻辑漏洞、终极上传漏洞升级)信息服务上线渗透检测网…

CCF-CSP真题《202303-2 垦田计划》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202303-2试题名称&#xff1a;垦田计划时间限制&#xff1a;1.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 问题描述 顿顿总共选中了 n 块区域准备开垦田地&#xf…

交换机是否会梦见机器学习?面向网络内分类

交换机是否会梦见机器学习&#xff1f;面向网络内分类 摘要 机器学习目前正在推动技术和社会革命。虽然可编程交换机已被证明对网络内计算非常有用&#xff0c;但是在可编程交换机内进行机器学习迄今为止取得了很少的成功。不利用网络设备进行机器学习会付出高昂的代价&#…

华为OD机试真题 JavaScript 实现【寻找峰值】【牛客练习题】

一、题目描述 给定一个长度为n的数组nums&#xff0c;请你找到峰值并返回其索引。数组可能包含多个峰值&#xff0c;在这种情况下&#xff0c;返回任何一个所在位置即可。 1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于&#xff1b; 2.假设 nums[-1] n…

【容器起不来~tomcat】

记录一次线上容器~tomcat起不来的场景: **部门由于资金有限,只能用tomcat去部署,话不多说直接贴图: Docker 镜像 Tomcat 启动失败– 查看线上日志,日志报错了,报错内容如下: 1,Error response from daemon: driver failed programming external connectivityon endpoint jen…

Safari开发者工具

Safari开发者工具 1 开发者功能2 开发者功能可以干什么2.1 捕获模拟器的请求 1 开发者功能 Safari->首选项->高级->开启“在菜单栏中显示‘开发’菜单” 2 开发者功能可以干什么 2.1 捕获模拟器的请求 当我们向查看模拟器上一个完整的网络请求时&#xff0c;往往…

libevent实践06:监听TCP服务器

简介 函数evconnlistener_new_bind struct evconnlistener * evconnlistener_new_bind(struct event_base *base, evconnlistener_cb cb,void *ptr, unsigned flags, int backlog, const struct sockaddr *sa,int socklen) 参数解析&#xff1a; base&#xff1a;事件集合 ev…

Python 字符串的使用

字符串使用 1. 字符串的定义方式 双引号或者单引号括起来的数据&#xff0c;就是字符串。使用三引号括起来也是字符串&#xff0c;并支持换行。 例&#xff1a; # 使用反斜线 对单引号进行转义 name1 i\ Tom name2 "Rose" name3 Tom name4 ""&qu…

8-什么是数组重塑?【视频版】

目录 问题视频解答 问题 视频解答 点击观看&#xff1a; 8-什么是数组重塑&#xff1f;

[mmcv系列] pip安装mmcv记录

文章目录 1.查看torch和cuda版本1.安装1.1从预编译包安装1.2 源码编译安装 2.校验报错&#xff1a;from mmcv import Config 可以直接 参考教程&#xff1a; 找到pip安装&#xff0c;选择自己的cuda和torch版本&#xff0c;复制指令到终端安装即可&#xff1a; 1.查看torch和c…

归并排序的具体实现过程

作者主页&#xff1a;paper jie的博客_CSDN博客-C语言,算法详解领域博主 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《算法详解》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心…

TCP三握四挥

TCP三握四挥 TCP最关键的三个步骤&#xff1a;建立连接、数据传输、释放连接&#xff0c;这里的三次握手实现的是服务端和客户端建立连接&#xff1b;四次挥手实现的是服务端和客户端释放连接。 三次握手&#xff1a; 建立数据连接 TCP连接需要三次握手的原因&#xff1a; 三次…

静力触探数据智能预处理(1)

静力触探数据智能预处理&#xff08;1&#xff09; 前言 数据处理方式已由手工1.0、计算机辅助2.0到人工智能3.0的趋势发展。现场采集的静力触探数据存在大量的异常数据&#xff0c;需要后期处理&#xff1b;但是目前还未见一个静力触探数据预处理的软件&#xff0c;数据预处…

BN、LN、IN、GN的自我理解

目录 一、Batch Normal 二、Layer Normal 三、Instance Normal 四、Group Normal 五、参考 参考了这两三篇博客&#xff0c;终于理解了这几个概念。 一、Batch Normal Batch Normal&#xff0c;举例来说&#xff1a;输入一个batch size&#xff0c;这个batch size中有2个…

2. Linux组件之数据库连接池

目录 一、数据库连接池1.1 池化技术1.2 数据库连接池及其作用1.3 不使用数据库连接池1.4 使用数据库连接池1.5 长连接和连接池1.6 数据库连接池运行机制1.7 连接池和线程池的关系 二、数据库连接池的设计2.1 mysql 连接池1. 构造函数2. 初始化3. 请求获取连接4. 归还连接5. 析构…