欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

IIC通信基础

程序员文章站 2022-03-22 08:21:23
想掌握IIC通信,就要掌握它的特性。首先要知道IIC协议就是是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。I2C 总线在传送数据过程*有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。//产生 IIC 起始信号void IIC_Start(void){SDA_OUT();...

想掌握IIC通信,就要掌握它的特性。
首先要知道IIC协议就是是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之间、IC 与 IC 之间进行双向传送,高速 IIC 总线一般可达 400kbps 以上。
I2C 总线在传送数据过程*有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。

//产生 IIC 起始信号
void IIC_Start(void)
{
SDA_OUT(); //sda线输出
IIC_SDA=1; 
IIC_SCL=1;
delay_us(4);
IIC_SDA=0; //在SCL为高时SDA拉低
delay_us(4);
IIC_SCL=0; //SCL拉低,准备发送或接收数据
}

结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

//产生 IIC 停止信号
void IIC_Stop(void)
{
SDA_OUT(); //sda 线输出
IIC_SCL=0;
IIC_SDA=0; 
delay_us(4);
IIC_SCL=1; 
IIC_SDA=1; //发送 I2C 总线结束信号
delay_us(4); 
}

在使用过程中要特别注意其有效性,只有在SCL为高电平时,SDA上的数据必须要保持不变才算有效数据。SDA只可以在SCL为低电平时改变。
每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答。

//等待应答信号到来
//返回值:1,接收应答失败
// 0,接收应答成功
u8 IIC_Wait_Ack(void)
{
	u8 time=0;
	SDA_IN(); //SDA 设置为输入 
	IIC_SDA=1;delay_us(1); 
	IIC_SCL=1;delay_us(1);
	while(READ_SDA)
	{ 
		time++;
		if(time>250)
		{ 	
			IIC_Stop();
			return 1;
		} 
	}
	IIC_SCL=0; //时钟输出 0 
	return 0; 
}

本文地址:https://blog.csdn.net/qq_38802197/article/details/107301837