#C51 IIC通讯(底层配置时序)

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

IIC通讯:二线制SDA/SCL


提示:以下是本篇文章正文内容,下面案例可供参考

一、场景

  1. 51单片机模拟I/O配置SDA/SCL(主器件)
  2. 根据AT24C02芯片手册,配置IIC通讯底层时序,操作命令

二、IIC核心知识点

图1 总线时序:
在这里插入图片描述

在这里插入图片描述

1.起始信号

结合时序图1:SCL高电平期间,SDA由高到低跳变
在这里插入图片描述

//起始信号
void IIC_Start()
{
	SDA = 1;
//	Delay2us();	//电路特性要求上升沿小于300ns,最好做延时保证必然高电平
	SCL = 1;	//拉高总线,空闲状态
	Delay5us();	//1.起始信号建立时间tSU:STA至少4.7us
	SDA = 0;		//2.起始信号产生
	Delay5us();	//3.起始信号维持时间tHD:STA至少4us
	SCL = 0;		//4.时钟拉低,钳住总线,准备后续数据发送
}

2.数据有效性

SCL低电平时SDA数据允许高低变化
SCL高电平时SDA保持稳定
在这里插入图片描述
在这里插入图片描述

3.写数据(1Byte)

MSB在前,LSB在后
SDA数据位传输后,将SCL高电平期间,从器件开始读取传输的数据
SCL、SDA高电平代表总线空闲,准备主/从器件下一次动作

//写一个字节数据
void IIC_WriteByte(unsigned char vdata)
{
	//第一次紧跟着起始信号,SCL已经拉低,无需再操作
	unsigned char vtemp;
	for(vtemp = 0x80; vtemp != 0; vtemp >= 1)
	{
		if(vtemp & vdata)
		{
			SDA = 1;//发送数据
		}
		else 
		{
			SDA = 0;
		}
		Delay5us();	//时钟信号低电平宽度tLOW至少4.7us
		SCL = 1;	//SCL拉高 从器件读数据位
		Delay5us();	//时钟信号高电平宽度tHIGH至少4us
		SCL = 0;	//拉低总线,下一个数据传输
	}
}

4.应答信号

8bit数据传输后第9位代表应答信号,0已接收 1未收到
在这里插入图片描述

//应答信号
bit IIC_RecvACK()
{
	bit ack;
	UC vErrTimeCnt = 0;
	SDA = 1;	//拉高总线空闲,为应答作准备
	Delay5us();	//维持SCL低电平
	SCL = 1;	//SCL高电平期间,从器件应答,拉高或拉低SDA:0接收1无
	Delay5us();
	if((1 == SDA) && (vErrTimeCnt < 255))	//延时保护,防止未收到应答,程序一直停留
	{
		vErrTimeCnt++;
		ack = 0;
	}
	else
	{
		ack = 1;
	}	
	return ack;
}

5.停止信号

结合时序图1:SCL高电平期间,SDA由低拉高
在这里插入图片描述

//停止信号
void IIC_Stop()
{
	SCL = 0;	//拉低时钟线,防止SDA由高到低产生起始信号
//	Delay2us();	//电路特性要求下降沿小于1us
	SDA = 0;
//	Delay2us();
	SCL = 1;
	Delay5us();	//停止信号建立时间最少4.7us
	SDA = 1;		//拉高SDA,停止信号
	Delay5us();	//最少4.7us,释放总线,准备下一次转换
}

6.从机地址

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Address bit7~bit3 bit2 bit1 bit0 RW*
器件唯一标识 A2 A1 A0 传输方向

@1. bit7~bit3是IIC器件自身地址,由制造商给定,如At24c02地址为1010。
@2. bit2~bit0对应A2 ~A0由硬件连接决定。(一个系统中最多8个器件)
@3. 通讯时第一个字节需要传输地址字节,以确定接收的从器件。如硬件接线A2~A0为低电平,向该写数据。则器件地址为:1010 000 = 0xA0

总结

1.片外IIC器件大体都是这种配置,根据芯片手册会些许微调。实际开发中大多数IC自带EEPROM,后面举例展开
2.基于底层配置后继续实现一个字节的写、读。至于多字节的“按字节”写,“按页写”,“连续读”等等,后续几篇陆续进行。

版权声明:本文为CSDN博主「请叫我xugege」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43612628/article/details/122334412

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

IIC通讯:二线制SDA/SCL


提示:以下是本篇文章正文内容,下面案例可供参考

一、场景

  1. 51单片机模拟I/O配置SDA/SCL(主器件)
  2. 根据AT24C02芯片手册,配置IIC通讯底层时序,操作命令

二、IIC核心知识点

图1 总线时序:
在这里插入图片描述

在这里插入图片描述

1.起始信号

结合时序图1:SCL高电平期间,SDA由高到低跳变
在这里插入图片描述

//起始信号
void IIC_Start()
{
	SDA = 1;
//	Delay2us();	//电路特性要求上升沿小于300ns,最好做延时保证必然高电平
	SCL = 1;	//拉高总线,空闲状态
	Delay5us();	//1.起始信号建立时间tSU:STA至少4.7us
	SDA = 0;		//2.起始信号产生
	Delay5us();	//3.起始信号维持时间tHD:STA至少4us
	SCL = 0;		//4.时钟拉低,钳住总线,准备后续数据发送
}

2.数据有效性

SCL低电平时SDA数据允许高低变化
SCL高电平时SDA保持稳定
在这里插入图片描述
在这里插入图片描述

3.写数据(1Byte)

MSB在前,LSB在后
SDA数据位传输后,将SCL高电平期间,从器件开始读取传输的数据
SCL、SDA高电平代表总线空闲,准备主/从器件下一次动作

//写一个字节数据
void IIC_WriteByte(unsigned char vdata)
{
	//第一次紧跟着起始信号,SCL已经拉低,无需再操作
	unsigned char vtemp;
	for(vtemp = 0x80; vtemp != 0; vtemp >= 1)
	{
		if(vtemp & vdata)
		{
			SDA = 1;//发送数据
		}
		else 
		{
			SDA = 0;
		}
		Delay5us();	//时钟信号低电平宽度tLOW至少4.7us
		SCL = 1;	//SCL拉高 从器件读数据位
		Delay5us();	//时钟信号高电平宽度tHIGH至少4us
		SCL = 0;	//拉低总线,下一个数据传输
	}
}

4.应答信号

8bit数据传输后第9位代表应答信号,0已接收 1未收到
在这里插入图片描述

//应答信号
bit IIC_RecvACK()
{
	bit ack;
	UC vErrTimeCnt = 0;
	SDA = 1;	//拉高总线空闲,为应答作准备
	Delay5us();	//维持SCL低电平
	SCL = 1;	//SCL高电平期间,从器件应答,拉高或拉低SDA:0接收1无
	Delay5us();
	if((1 == SDA) && (vErrTimeCnt < 255))	//延时保护,防止未收到应答,程序一直停留
	{
		vErrTimeCnt++;
		ack = 0;
	}
	else
	{
		ack = 1;
	}	
	return ack;
}

5.停止信号

结合时序图1:SCL高电平期间,SDA由低拉高
在这里插入图片描述

//停止信号
void IIC_Stop()
{
	SCL = 0;	//拉低时钟线,防止SDA由高到低产生起始信号
//	Delay2us();	//电路特性要求下降沿小于1us
	SDA = 0;
//	Delay2us();
	SCL = 1;
	Delay5us();	//停止信号建立时间最少4.7us
	SDA = 1;		//拉高SDA,停止信号
	Delay5us();	//最少4.7us,释放总线,准备下一次转换
}

6.从机地址

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Address bit7~bit3 bit2 bit1 bit0 RW*
器件唯一标识 A2 A1 A0 传输方向

@1. bit7~bit3是IIC器件自身地址,由制造商给定,如At24c02地址为1010。
@2. bit2~bit0对应A2 ~A0由硬件连接决定。(一个系统中最多8个器件)
@3. 通讯时第一个字节需要传输地址字节,以确定接收的从器件。如硬件接线A2~A0为低电平,向该写数据。则器件地址为:1010 000 = 0xA0

总结

1.片外IIC器件大体都是这种配置,根据芯片手册会些许微调。实际开发中大多数IC自带EEPROM,后面举例展开
2.基于底层配置后继续实现一个字节的写、读。至于多字节的“按字节”写,“按页写”,“连续读”等等,后续几篇陆续进行。

版权声明:本文为CSDN博主「请叫我xugege」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43612628/article/details/122334412

生成海报
点赞 0

请叫我xugege

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

#C51 IIC通讯(底层配置时序)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如: 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 前言

AD原理图设计与Clion源码工具学习

一、AD绘制电路原理图 1.准备工作 下载Altium Designer,具体安装步骤以及百度网盘分享参考:Altium Designer2018下载安装及基本使用 STM32F103C8T6元件库&#xff1a

74HC138译码器的原理和使用

前言 译码器就是将每个输入的二进制代码译成对应的输出高低电平信号,和编码器互为逆过程。 百度百科 74HC138是一款高速CMOS器件,74HC138引脚兼容低功耗肖特基TTL(LSTTL&#xf