iic时序

        数据和应答信号都规定在SCL在高电平期间,SDA电平稳定;SCL在低电平期间,SDA电平才可以变化。要不然容易被误认为起始或停止信号。

应答信号:1. 第九个SCL之前的低电平期间将SDA拉低

                  2. 确保在SCL为高电平时,SDA为稳定的低电平

GPIO模拟IIC:

1. 初始化,初始先拉高SDA,SCL

//IO操作函数	 
#define IIC_SCL_H    GPIO_SetBits(GPIO_SCL, GPIO_SCL_PIN) //SCL
#define IIC_SCL_L    GPIO_ResetBits(GPIO_SCL, GPIO_SCL_PIN) //SCL#define IIC_SDA_H    GPIO_SetBits(GPIO_SDA, GPIO_SDA_PIN) //SDA	
#define IIC_SDA_L    GPIO_ResetBits(GPIO_SDA, GPIO_SDA_PIN) //SDAvoid IIC_Init(void)
{					     GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOB, ENABLE );	//使能GPIOB时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD ;   //开漏输出
//IIC一般配置为开漏输出。开漏输出模式天然支持输入功能:
//当 MOS 管截止时,引脚可通过上拉电阻检测外部信号(高 / 低电平),实现双向通信。GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);IIC_SCL_H;//PB6,PB7 输出高IIC_SDA_H;
}

 2.起始信号。先全部拉高,等一会拉低SDA。等起始信号完成后,把SCL拉低,确保通信时序进入数据传输准备状态

void IIC_Start(void)
{IIC_SCL_H;IIC_SDA_H;delay_us(4);IIC_SDA_L;delay_us(4);IIC_SCL_L;//钳住I2C总线,准备发送或接收数据 }

3. 发送数据:(iic发送数据从高位到地位)

对传入的8个字节进行8次循环处理:

总线:先拉低SCL准备传数据,通过判断数1或0据来拉高或拉低SDA。最后再拉高SCL,让SDA稳定一段时间。

数据判断:

// txd = 1010 1010txd & (0x1<<(7))  //1左移7位 1000 0000// 高位 (7)1 & 1 = 1,if成立txd & (0x1<<(6)) //  //1左移6位 0100 0000//// 高位 (6)0 & 1 = 0,if不成立

具体而言,for从7到0循环,满足iic发送数据从高位到地位的逻辑。


void IIC_Send_Byte(u8 txd)
{int8_t i;for(i = 7; i >= 0; i--){IIC_SCL_L;//拉低时钟开始数据传输if(txd & (0x1<<(i)))IIC_SDA_H;elseIIC_SDA_L;delay_us(2);IIC_SCL_H;delay_us(2);}IIC_SCL_L;IIC_SDA_H;	//发送一个字节后,将SDA拉高,等待从机拉低SDA的应答信号}

4.主机等待从机的应答:

主机等待从机的应答信号,是 I2C 通信中主机(发送方)确认从机(接收方)是否成功接收数据的关键操作。

    在 I2C 通信中,当主机向从机发送数据(如写入从机地址、发送指令或数据字节)后,按照协议规定:

        主机发送完 1 字节(8 位)数据后,会释放 SDA 线的控制权,等待从机在第 9 个时钟周期内返回应答信号。

        从机若成功接收数据,会将 SDA 线拉低(ACK 应答);若未接收或接收错误,会让 SDA 线保持高电平(NACK 非应答)。

        主机通过 IIC_Wait_Ack 函数检测 SDA 线的状态,判断从机是否正确接收了数据。

u8 IIC_Wait_Ack(int timeout)	//单位 us
{do{timeout--;delay_us(2);}while((READ_SDA)&&(timeout>=0));  // 循环等待:SDA为高电平且未超时// 若循环是因为timeout < 0结束,超时未收到应答(SDA始终为高),返回1if(timeout<0) return 1;   // 若SDA仍为高电平,表示收到NACK,返回2IIC_SCL_H;      // 拉高SCL,进入应答检测的时钟周期delay_us(2);if(READ_SDA!=0) return 2;  // 否则SDA为低电平,表示收到ACK,返回0IIC_SCL_L;     // 拉低SCL,结束检测delay_us(2);return 0;            
}

. 应答:先拉高SCL,再拉低SDA,再将SCL拉低,完成ACK

//产生ACK应答
void IIC_Ack(void)
{IIC_SCL_H;IIC_SDA_L;delay_us(2);IIC_SCL_L;IIC_SDA_H;delay_us(2);
}

5.不应答:先拉高SCL,再拉高SDA,再将SCL拉低,无法完成ACK

void IIC_NAck(void)
{IIC_SDA_H;IIC_SCL_H;delay_us(2);IIC_SCL_L;delay_us(2);
}

    IIC一般配置为开漏输出。开漏输出模式天然支持输入功能:当 MOS 管截止时,引脚可通过上拉电阻检测外部信号(高 / 低电平),实现双向通信。

关于OD开漏输出和PP推挽输出:

区别之处:PP的p-mos接VDD(器件的电源电压);DD的P-MOS没有VDD。

        当输出控制1,p管打开n管截止,此时PP输出高电压,DD在没有接Vcc(电路的主电源)和上拉电阻的情况下无法输出高电平,只有接上才可输出高电平。

        当输出控制0,n管打开p管截止,两者都是输出低电平。(n-mos导通时电阻很小,分压后DD相当于无电压输出)

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

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

相关文章

GitHub+Git新手使用说明

Git Git是一个在本地用于随时保存和查看历史版本的软件Git的三个概念&#xff1a;提交commit、仓库repository、分支branch Git安装 在电脑里面按winR&#xff0c;输入cmd进入终端后输入git --version&#xff0c;然后再次输入where git&#xff0c;查看git所在位置 Git常用语句…

前端图像视频实时检测

需求&#xff1a;在目标检测时&#xff0c;我们要求前端能够将后端检测的结果实时渲染在图片或者视频上。图片是静态的&#xff0c;只需要渲染一次&#xff1b;而视频是动态的&#xff0c;播放时需要根据帧数来实时渲染标注框&#xff0c;可以想象视频就是由一张张图片播放的效…

如何解决pip安装报错ModuleNotFoundError: No module named ‘sqlalchemy’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘sqlalchemy’问题 摘要 在使用 PyCharm 控制台执行 pip install sqlalchemy 后&#xff0c;仍然在代码中提示 ModuleNotFoundError: No module named sqlalche…

第4.3节 iOS App生成追溯关系

iOS生成追溯关系的逻辑和Android端从用户角度来说是一致的&#xff0c;就是需要通过开始和结束关联用例&#xff0c;将用例信息与覆盖率信息建立关系&#xff0c;然后再解析覆盖率数据。 4.3.1 添加关联用例弹层 关联用例弹层和Android类似&#xff0c;只要你能设计出相应的样…

STM32 USB键盘实现指南

概述 在STM32上实现键盘功能可以通过USB HID(人机接口设备)协议来实现,使STM32设备能被计算机识别为标准键盘。以下是完整的实现方案: 硬件准备 STM32开发板(支持USB,如STM32F103、STM32F4系列) USB接口(Micro USB或Type-C) 按键矩阵或单个按键 必要的电阻和连接…

继电器基础知识

继电器是一种电控制器件,它具有隔离功能的自动开关元件,广泛应用于遥控、遥测、通讯、自动控制、机电一体化及电力电子设备中,是最重要的控制元件之一。 继继电器的核心功能是通过小电流来控制大电流的通断。它通常包含一个线圈和一组或多组触点。当给继电器的线圈施加一定…

MYSQL:库的操作

文章目录MYSQL&#xff1a;库的操作1. 本文简述2. 查看数据库2.1 语法3. 创建数据库3.1 语法3.2 示例3.2.1 创建一个简单的数据库3.2.2 使用 IF NOT EXISTS 防止重复创建3.2.3 再次运行&#xff0c;观察现象3.2.4 查看这个警告到底是什么3.2.5 创建数据库允许使用关键字4. 字符…

Xilinx FPGA XCKU115‑2FLVA1517I AMD KintexUltraScale

XCKU115‑2FLVA1517I 隶属于 Xilinx &#xff08;AMD&#xff09;Kintex UltraScale 系列&#xff0c;基于领先的 20 nm FinFET 制程打造。该器件采用 1517‑ball FCBGA&#xff08;FLVA1517&#xff09;封装&#xff0c;速度等级 ‑2&#xff0c;可实现高达 725 MHz 的核心逻…

Linux Ubuntu安装教程|附安装文件➕安装教程

[软件名称]: Linux Ubuntu18.0 [软件大小]: 1.8GB [安装环境]: VMware [夸克网盘接] 链接&#xff1a;https://pan.quark.cn/s/971f685256ef &#xff08;建议用手机保存到网盘后&#xff0c;再用电脑下载&#xff09;更多免费软件见https://docs.qq.com/sheet/DRkdWVFFCWm9UeG…

深入解析Hadoop YARN:三层调度模型与资源管理机制

Hadoop YARN概述与产生背景从MapReduce到YARN的演进之路在Hadoop早期版本中&#xff0c;MapReduce框架采用JobTracker/TaskTracker架构&#xff0c;这种设计逐渐暴露出严重局限性。JobTracker需要同时处理资源管理和作业控制两大核心功能&#xff0c;随着集群规模扩大&#xff…

Pycaita二次开发基础代码解析:边线提取、路径追踪与曲线固定

本文将深入剖析CATIA二次开发中三个核心类方法&#xff1a;边线提取特征创建、元素结构路径查找和草图曲线固定技术。通过逐行解读代码实现&#xff0c;揭示其在工业设计中的专业应用价值和技术原理。一、边线提取技术&#xff1a;几何特征的精确捕获与复用1.1 方法功能全景ext…

Linux 任务调度在进程管理中的关系和运行机制

&#x1f4d6; 推荐阅读&#xff1a;《Yocto项目实战教程:高效定制嵌入式Linux系统》 &#x1f3a5; 更多学习视频请关注 B 站&#xff1a;嵌入式Jerry Linux 任务调度在进程管理中的关系和运行机制 Linux 内核中的“任务调度”是进程管理系统的核心部分&#xff0c;相互关联而…

JAVA后端开发—— JWT(JSON Web Token)实践

1. 什么是HTTP请求头 (Request Headers)&#xff1f;当你的浏览器或手机App向服务器发起一个HTTP请求时&#xff0c;这个请求并不仅仅包含你要访问的URL&#xff08;比如 /logout&#xff09;和可能的数据&#xff08;请求体&#xff09;&#xff0c;它还附带了一堆“元数据&am…

【SVM smote】MAP - Charting Student Math Misunderstandings

针对数据不平衡问题&#xff0c;用调整类别权重的方式来处理数据不平衡问题&#xff0c;同时使用支持向量机&#xff08;SVM&#xff09;模型进行训练。 我们通过使用 SMOTE&#xff08;Synthetic Minority Over-sampling Technique&#xff09;进行过采样&#xff0c;增加少数…

repmgr+pgbouncer实现对业务透明的高可用切换

本方案说明 PostgreSQL repmgr&#xff1a;实现主从自动故障检测与切换&#xff08;Failover&#xff09;。PgBouncer&#xff1a;作为连接池&#xff0c;屏蔽后端数据库变动&#xff0c;提供透明连接。动态配置更新&#xff1a;通过repmgr组件的promote_command阶段触发脚本…

查找服务器上存在线程泄露的进程

以下是一个改进的命令&#xff0c;可以列出所有线程数大于200的进程及其PID和线程数&#xff1a; find /proc -maxdepth 1 -type d -regex /proc/[0-9] -exec sh -c for pid_dir dopid$(basename "$pid_dir")if [ -f "$pid_dir/status" ]; thenthreads$(aw…

Facebook 开源多季节性时间序列数据预测工具:Prophet 饱和预测 Saturating Forecasts

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 Prophet 是一种基于加法模型的时间序列数据预测程序&#xff0c;在该模型中&#xff0c;非线性趋势与年、周、日季节性以及节假日效应相匹配。…

从单线程到云原生:Redis 二十年演进全景与内在机理深剖

——从 1.0 到 7.2&#xff0c;一窥数据结构、网络模型、持久化、复制、高可用与生态协同的底层脉络&#xff08;一&#xff09;序章&#xff1a;为什么是 Redis 1999 年&#xff0c;Salvatore Sanfilippo 在开发一个实时访客分析系统时&#xff0c;发现传统磁盘型数据库无法在…

得了甲亢军队文职体检能过吗

根据军队文职体检现行标准&#xff0c;甲亢患者能否通过体检需分情况判定&#xff0c;核心取决于病情控制状态、治疗结果及稳定时长。结合《军队选拔军官和文职人员体检通用标准》及补充规定&#xff0c;具体分析如下&#xff1a;⚕️ 一、可直接通过体检的情况临床治愈满1年且…

【编程语言】C、C++、C#深度对比:三种语言的演进历程与应用场景

一、语言概述与历史背景 &#xff08;一&#xff09;C语言&#xff1a;系统编程的基石诞生背景 1972年由Dennis Ritchie在贝尔实验室开发为了重写UNIX操作系统而创造从B语言演化而来&#xff0c;增加了数据类型设计目标&#xff1a;简洁、高效、可移植设计哲学 “相信程序员”&…