IIC工作模式时序分析

news/2024/11/17 1:42:37/文章来源:https://www.cnblogs.com/lu-ciana/p/18407041

IIC工作模式时序分析

此处利用IO口模拟IIC通信过程中的时序。
image

通信过程

在IIC通信过程SDA存在两种模式(接收模式和发送模式),发送或接受一个字节(器件的7个bit+1个bit方向(1 - 读方向,0 - 写方向))

模式配置

  1. 当SDA为接入模式接收了1字节数据后在第九个时钟脉冲期间就要变成输出模式发送ask
  2. 当SDA为输出模式发送了1字节数据后在第九个时钟脉冲期间就要变成输入模式检测是否收到ask
  3. 因此SDA需配置两个模式而SCL模拟时序只需配置输出模式
#define  SDA_SET(n)  (n) ? GPIO_SetBits(GPIO?,GPIO_Pin_?) : GPIO_ResetBits(GPIO?,GPIO_Pin_?) 
#define  SCL_SET(n)  (n) ? GPIO_SetBits(GPIO?,GPIO_Pin_?) : GPIO_ResetBits(GPIO?,GPIO_Pin_?) 
#define  SDA_READ    GPIO_ReadInputDataBit(GPIO?,GPIO_Pin_?)

IIC的SCL配置

/*** @name:	IIC_SCLConfig* @brief  	IIC的SCL配置* @param  	void* @retval 	void* @date 	2024/09/10* @note   	补充 注意 说明*/
void IIC_SCLConfig()
{GPIO_InitTypeDef GPIO_InitStructure;//打开GPIO端口的时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIO?,ENABLE);//SCLGPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_OUT;					//输出模式GPIO_InitStructure.GPIO_Speed 	= GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType 	= GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd  	= GPIO_PuPd_DOWN;GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_?;GPIO_Init(GPIO?, &GPIO_InitStructure);
}

IIC的SDA配置

/*** @name:	IIC_SDAConfig* @brief  	IIC的SCL配置* @param  	@GPIO_Mode* @retval 	void* @date 	2024/09/10* @note   	补充 注意 说明*/
void IIC_SDAConfig(GPIOMode_TypeDef GPIO_Mode)
{GPIO_InitTypeDef GPIO_InitStructure;//打开GPIO端口的时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIO?,ENABLE);//SCLGPIO_InitStructure.GPIO_Mode 	= GPIO_Mode;					//输出模式GPIO_InitStructure.GPIO_Speed 	= GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType 	= GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd  	= GPIO_PuPd_DOWN;GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_?;GPIO_Init(GPIO?, &GPIO_InitStructure);
}

IIC的空闲状态

image

/*** @name:	IIC_Config* @brief  	IIC的初始化* @param  	@GPIO_Mode* @retval 	void* @date 	2024/09/10* @note   	补充 注意 说明*/
void IIC_Config(void)
{//1.设置SDA和SCL为输出模式IIC_SCLConfig();IIC_SDAConfig(GPIO_Mode_OUT);//2.确保SDA和SCL处于空闲状态SDA_SET(1);SCL_SET(1);delay_us(5);
}

IIC的开始信号

image

/*** @name:	IIC_Start* @brief  	IIC的开始信号* @param  	void* @retval 	void* @date 	2024/09/10* @note   	补充 注意 说明*/
void IIC_Start(void)
{//1.设置SDA为输出模式IIC_SDAConfig(GPIO_Mode_OUT);//2.确保SDA和SCL处于空闲状态SDA_SET(1);SCL_SET(1);delay_us(5);//3.设置SDA为低电平SDA_SET(0);delay_us(5);
}

IIC的发送字节

image

/*** @name:	IIC_SendByte* @brief  	IIC的发送字节* @param  	@Byte* @retval 	void* @date 	2024/09/10* @note   	补充 注意 说明*/
void IIC_SendByte(uint8_t Byte)   //1011 0110
{//1.设置SDA为输出模式IIC_SDAConfig(GPIO_Mode_OUT);//2.设置SDA为低电平,SCL为低电平SDA_SET(0);delay_us(5);SCL_SET(0);delay_us(5);//2.循环发送8次,每次发送一个bit  遵循MSB 高位先出for(int i=0;i<8;i++){SDA_SET(1);delay_us(5);//3.判断待发送的字节的最高位  ???? ???? & 1000 0000if( Byte & 0x80 ){SDA_SET(1);}elseSDA_SET(0);Byte <<= 1;delay_us(5);SDA_SET(0);delay_us(5);}
}

IIC的接收字节

image

/*** @name:	IIC_RecvByte* @brief  	IIC的接受字节* @param  	void* @retval 	uint8_t * @date 	2024/09/10* @note   	补充 注意 说明*/
uint8_t IIC_RecvByte(void)
{uint8_t i=0;uint8_t data =0;//保证SDA引脚为输入模式IIC_SDAConfig(GPIO_Mode_IN);SCL_SET(0);delay_us(5);for(i=0;i<8;i++){//时钟线拉高,数据有效SCL_SET(1);delay_us(5);data <<=1;data |= SDA_READ;delay_us(5);//时钟线拉低,保持占用总线,总线是忙状态SCL_SET(0);delay_us(5);}
}

IIC的判断从机是否应答

image

/*** @name:	IIC_IsSlaveACK* @brief  	IIC的判断从机是否应答* @param  	void* @retval 	bool* @date 	2024/09/10* @note   	补充 注意 说明*/
bool  IIC_IsSlaveACK(void)
{bool ack;//1.设置SDA引脚为输入模式IIC_SDAConfig(GPIO_Mode_IN);//3.把SCL引脚电平拉高,此时为第9个脉冲的高电平,主机读取状态SCL_SET(1);delay_us(5);//4.主机读取状态  1 表示未应答  0  表示已应答if(SDA_READ)ack = false;elseack = true;//5.把SCL引脚电平拉低SCL_SET(0);delay_us(5);return ack;
}

IIC的收到从机数据发送应答

image

/*** @name:	IIC_MasterACK* @brief  	IIC的收到从机数据发送应答* @param  	void* @retval 	void* @date 	2024/09/10* @note   	补充 注意 说明*/
void IIC_MasterACK(void) 
{// 1.设置SDA引脚为输出模式IIC_SDAConfig(GPIO_Mode_OUT);// 2.把SCL引脚电平拉低,此时主机准备SCL_SET(0);delay_us(5);// 3.设置SDA为高电平,表示应答SDA_SET(1);delay_us(5);// 4.把SCL电平拉高,此时从机读取bitSCL_SET(1);delay_us(5);
}

IIC的停止信号

image

/*** @name:	IIC_Stop* @brief  	IIC的停止信号* @param  	void* @retval 	void* @date 	2024/09/10* @note   	补充 注意 说明*/
void IIC_Stop(void)
{//1.设置SDA引脚为输出模式IIC_SDAConfig(GPIO_Mode_OUT);//2.设置SDA和SCL均为低电平SDA_SET(0);SCL_SET(0);delay_us(5);//3.把SCL电平拉高SCL_SET(1);delay_us(5);//4.把SDA电平拉高SDA_SET(1);delay_us(5);}

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

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

相关文章

第四章 视图(views)

4.视图 4.1 文件or文件夹4.2 相对和绝对导入urls注意实现:不要再项目根目录做相对导入。 原则:绝对导入 相对导入(层级深)4.3 视图参数 urlpatterns = [path(login/, account.login, name="login"),path(auth/, order.auth, name=auth), ]from django.shortcuts …

[设计模式] Cola-StateMachine : 一个轻量实用的Java状态机框架

1 概述:状态机 1.0 状态机 vs 工作流在介绍状态机之前,先介绍一个工作流(WorkFlow),初学者通常容易将两个概念混淆。工作流(WorkFlow),大体是指业务过程(整体或者部分)在计算机应用环境下的自动化,是对工作流程及其各操作步骤之间业务规则的描述。在计算机系统中,工…

Qml 实现瀑布流布局

最近在刷掘金的时候看到一篇关于瀑布流布局的文章,然鹅他们的实现都是前端的那套,就想着 Qml 有没有类似实现。 结果百度了一圈也没有( T_T Qml 凉了凉了 ),于是,我按照自己理解,简单实现了一个 Qml 版的瀑布流布局。【写在前面】 最近在刷掘金的时候看到一篇关于瀑布流布…

Rocky9

Rocky Linux 9.4 部署Zabbix 7.0 1-1.检测源 wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm #下载epel的源 rpm -ivh epel-release-latest-8.noarch.rpm #epel安装 rpm -Uvh https://repo.zabbix.com/zabbix/7.0/rocky/9/x86_64/zabbix-releas…

洛谷题单指南-常见优化技巧-P1714 切蛋糕

原题链接:https://www.luogu.com.cn/problem/P1714 题意解读:求长度不超过m的最大子段和 解题思路: 1、暴力法 设a[N]表示原数组,s[N]是a[N]的前缀和,对于每一个元素s[i],计算其与前m个元素之差,取差值最大值,用代码表示: for(int i = 1; i <= n; i++) {for(int j …

【专题】2024年中国折叠屏手机市场与消费趋势研究报告合集PDF分享(附原数据表

原文链接:https://tecdat.cn/?p=37645 中国智能手机市场目前仍处于整体增长瓶颈期,增长复苏未达预期,消费者换机预期周期不断延长,使得行业对破局点的探寻更为紧迫。与此同时,中端消费者购机呈现出消费降级与升级的分化态势,不过更多人会选择体验更好、配置更优的产品以…

Goby 漏洞发布|(CVE-2024-45195)Apache OFBiz /viewdatafile 代码执行漏洞【已复现】

漏洞名称:Apache OFBiz /viewdatafile 代码执行漏洞(CVE-2024-45195) English Name:Apache OFBiz /viewdatafile Code Execution Vulnerability(CVE-2024-45195) CVSS core: 8.0 漏洞描述: Apache OFBiz是一个开源企业资源规划(ERP)系统。它提供了一套企业应用程序,…

navicat无法连接远程的mysql--Host ‘xx.xx.xx.xx‘ is not allowed to connect to this MySQL server“

之前在远程虚拟机上面部署了mysql,想在本地客户端使用navicat连接数据库,结果提示:host xxx is not allowed to connect to this mysql server解决 出现这个提示,是由于我们使用root用户登录时,没有给root用户设置能访问的机器,所以我们设置一下,就可以了。1:登录mysql…

jQuery中开发插件

页面代码<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script s…

ubuntu 使用命令行查看硬件信息

ubuntu 使用命令行查看硬件信息 CPU cat /proc/cpuinfo其中,model name就显示了cpu的型号,cpu cores显示cpu的所有物理核心数量。 内存 cat /proc/meminfo其中,MemTotal就显示总内存大小,这里为32GB内存,SwapTotal显示了交换分区的内存大小,这里为 2GB。 硬盘大小 df -h可…

易百纳ss928开发板移植自训练模型跑通yolov5算法

ss928平台移植官方yolov5s算法参考文章:https://www.ebaina.com/articles/140000017418,这位大佬也开源了代码,gitee链接:https://gitee.com/apchy_ll/ss928_yolov5s 本文在参考上述文章的基础上,将官方yolov5s模型跑通,验证推理图片正确,然后移植自训练的推理模型,在移…