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;
}
在这里插入代码片
### 单片机IIC协议学习资料与教程 #### 1. IIC协议基础概念 IIC(Inter-Integrated Circuit)是一种由Philips公司开发的串行通信协议,广泛应用于单片机与其他外设之间的数据交换。该协议仅需两根信号线——SCL(时钟线)和SDA(数据线),即可完成同步、半双工通信[^3]。这种简单的设计使得IIC成为许多嵌入式系统的首选通信方式。 #### 2. 学习路径建议 对于初学者而言,可以从51单片机入手学习IIC协议的基础知识,因为其资源丰富且易于上手[^2]。如果希望挑战更复杂的项目,则可以选择STM32系列单片机作为学习平台[^4]。无论选择哪种硬件平台,都需要掌握以下几个方面的内容: - **基本原理**:了解IIC的工作机制及其特点,例如起始条件、停止条件以及应答/非应答信号的作用。 - **编程实践**:熟悉如何利用软件模拟或者硬件支持来实现IIC通信功能。 - **实际应用**:尝试连接不同的IIC设备(如EEPROM、OLED显示屏等),并编写相应的驱动程序。 #### 3. 推荐参考资料 以下是几份适合不同阶段学习者的材料推荐: - 针对新手,《51单片机入门第三课》提供了关于IIC基础知识的良好概述,并配有实例说明[^1]; - 中级水平可参考《一文搞懂STM32IIC通信协议》,它深入探讨了基于STM32微控制器的具体实现方法[^4]; - 进阶开发者能够从具体案例中学到更多技巧,比如《oled显示图片及动图(IIC协议)详细教程》展示了如何操控带有图形界面的小型显示器[^5]。 #### 4. 示例代码片段 下面给出一段简单的AT24C02 EEPROM写入操作示范代码供参考: ```c void AT24C0X_WriteByteData(uint8_t ADDR, uint8_t DATA){ IIC_START(); IIC_SendByteData(0XA0); if (ACK != IIC_WaitACK()){ IIC_STOP(); return; } IIC_SendByteData(ADDR); if (ACK != IIC_WaitACK()){ IIC_STOP(); return; } IIC_SendByteData(DATA); if (ACK != IIC_WaitACK()){ IIC_STOP(); return; } IIC_STOP(); } ``` #### 5. 注意事项 在动手实验之前,请务必确认所使用的库函数或寄存器配置正确无误;另外也要注意目标器件的电气特性参数匹配情况以免损坏硬件组件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值