iic学习

本文详细介绍了IIC通信协议的原理,包括多主机总线、发送器与接收器的工作方式,以及IIC通信的具体过程。通过解析主机发送第一个字节的过程,深入理解IIC通信流程。此外,还提供了IIC起始和停止信号的生成函数,以及发送和接收应答的函数。最后,展示了C语言实现的IIC初始化、数据发送和接收的函数,帮助读者掌握实际应用中的IIC通信操作。

一、概述
在这里插入图片描述
1.1多主机总线
在这里插入图片描述
1.2 发送器与接收器
在这里插入图片描述
1.3 IIC通信过程
在这里插入图片描述
1.4 主机发送第一个字节解析
在这里插入图片描述
二 通信接口与速度
在这里插入图片描述
三 数据帧格式
在这里插入图片描述
3.1 起始信号
在这里插入图片描述

3.2 数据位
在这里插入图片描述

3.3 应答位
在这里插入图片描述

3.4 停止信号
在这里插入图片描述
四 直接上代码了

#define IIC_SDA_OUT    PBout(9)     //输出SDA	 
#define IIC_SDA_IN     PBin(9)      //输入SDA 

/**********************************************************************
*函数名:IIC_Init
*功  能:初始化IIC
*参  数:无
*返  回:无
*备  注:PB8 PB9
**********************************************************************/
void IIC_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;             //定义一个结构体变量
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);//使能PB时钟	
	
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_8|GPIO_Pin_9;//引脚选择
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_OUT;    //通用输出
	GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;    //开漏
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;  //速度配置
	GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL; //浮空(无上下拉)
	GPIO_Init(GPIOB, &GPIO_InitStructure);            //初始化
	//空闲状态
	IIC_SCL=1;
	IIC_SDA_OUT=1;
}
/**********************************************************************
*函数名:IIC_Start
*功  能:起始信号
*参  数:无
*返  回:无
*备  注:
**********************************************************************/
void IIC_Start(void)
{
	IIC_SDA_OUT=1;	  	  
	IIC_SCL=1; //时钟线高电平
	delay_us(2);
 	IIC_SDA_OUT=0;	
	delay_us(2);
	IIC_SCL=0; //钳住I2C总线,准备发送或接收数据 
}
/**********************************************************************
*函数名:IIC_Stop
*功  能:停止信号
*参  数:无
*返  回:无
*备  注:
**********************************************************************/
void IIC_Stop(void)
{
	IIC_SCL=1;
	IIC_SDA_OUT=0;
 	delay_us(2);
	IIC_SDA_OUT=1;//发送I2C总线结束信号
	delay_us(2);
}
/**********************************************************************
*函数名:IIC_Send_Ack
*功  能:发送应答
*参  数:send_ack
*返  回:无
*备  注:
**********************************************************************/
void IIC_Send_Ack(u8 send_ack)
{
	IIC_SCL = 0;//低电平:主机准备数据
	if(send_ack)
	{
		IIC_SDA_OUT = 1;
	}
	else
	{
		IIC_SDA_OUT = 0;
	}
	delay_us(2);
	IIC_SCL = 1;//高电平:从机采集数据
	delay_us(2);
	IIC_SCL = 0;//保证完整周期
}

/**********************************************************************
*函数名:IIC_Recv_Ack
*功  能:接收应答
*参  数:无
*返  回:u8 0:应答 1:非应答
*备  注:
**********************************************************************/
u8 IIC_Recv_Ack(void)
{
	u8 recv_ack = 0;
	IIC_SDA_OUT = 1;//释放总线控制权
	IIC_SCL = 0;//让从机准备数据
	delay_us(2);
	IIC_SCL = 1;//主机开始读取数据
	if(IIC_SDA_IN)
	{
		recv_ack = 1;
	}
	else
	{
		recv_ack = 0;
	}
	delay_us(2);
	IIC_SCL = 0;//完整周期
	return recv_ack;
}
/**********************************************************************
*函数名:IIC_Send_Byte
*功  能:发送一个字节数据
*参  数:字节数据
*返  回:u8 0:应答 1:非应答
*备  注:
**********************************************************************/
u8 IIC_Send_Byte(u8 send_byte)
{
	u8 i,ack;
	for(i = 0;i < 8;i++)
	{
		IIC_SCL = 0;//主机准备数据
		if(send_byte & (0x80 >> i))
		{
			IIC_SDA_OUT = 1;
		}
		else
		{
			IIC_SDA_OUT = 0;
		}
		delay_us(2);
		IIC_SCL = 1;//从机读取数据
		delay_us(2);
	}
	ack = IIC_Recv_Ack();//从机返回响应数据
	return ack;
}
/**********************************************************************
*函数名:IIC_Recv_Byte
*功  能:发送一个字节数据
*参  数:u8 0:继续读取数据 1:不再读取数据
*返  回:u8 接收到的数据
*备  注:
**********************************************************************/
u8 IIC_Recv_Byte(u8 send_ack)
{
	u8 i,data = 0;
	IIC_SDA_OUT = 1;//主机释放总线控制权
	for(i = 0;i < 8;i++)
	{
		IIC_SCL = 0;//从机准备数据
		delay_us(2);
		IIC_SCL = 1;//主机采集数据
		data <<= 1;
		data |= IIC_SDA_IN;
		delay_us(2);
	}
	IIC_Send_Ack(send_ack);//接收完一个字节数据,主机给从机发送响应信号
	return data;
}
在这里插入代码片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值