IIC协议应用实例

这是一篇关于IIC协议的学习资料,感兴趣的话就关注我吧


前言

IIC协议是目前来说比较方便的一种协议,很多地方都可以用到它比如OLED屏幕、一些传感器等等。这里我将详细告诉大家IIC到底该如何应用


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

一、IIC是什么?

此处省略一万字。IIC协议就是一种传输方式罢了,没什么好高级的

二、时序图

关于时序图和理解,我认为这一篇文章写得比较好,大家可以直接去看看

https://blog.csdn.net/chm880910/article/details/80086052

三、代码

1.IIC代码(理论)

相信看完时序图后,代码并不难理解,但是却不知道怎么运用它。先把代码发出来(示例):

/*******************************
函数名称:I2c_Init
备注:IIC初始化
********************************/
void I2c_Init()
{
	SDA	=	1;
	Delay5us();
	SCL	=	1;
	Delay5us();
}
/*******************************
函数名称:I2c_Start
备注:IIC起始信号
********************************/
void I2c_Start()
{
	SDA	=	1;
	SCL	=	1;
	Delay5us();
	SDA	=	0;
	Delay5us();
	SCL	=	0;
}
/*******************************
函数名称:I2c_Stop
备注:IIC终止信号
********************************/
void I2c_Stop()
{
	SDA	=	0;
	Delay5us();
	SCL	=	1;
	Delay5us();
	SDA	=	1;
	Delay5us();
}
/*******************************
函数名称:I2c_SendAck(bit ack)
备注:IIC发送应答信号
********************************/
void I2c_SendAck(bit ack)
{
	SDA	=	ack;
	SCL	=	1;
	Delay5us();
	SCL	=	0;
	Delay5us();
}
/*******************************
函数名称:I2c_GetAck
备注:IIC接受应答信号
********************************/
bit I2c_GetAck()
{
	SCL	=	1;
	Delay5us();
	CY	=	SDA;
	SCL	=	0;
	Delay5us();
	return CY;
}	

那么接下来向大家解释如何运用这四段代码,其实并不难,用到for语句实现8个bit传输

/*******************************
函数名称:I2c_SendByte(uchar dat)
备注:IIC发送一个字节
********************************/
void I2c_SendByte(uchar dat)
{
	int i;
	for(i=0;i<8;i++)
	{
		dat	<<=	1;
		SDA	=	CY;
		SCL	=	1;
		Delay5us();
		SCL	=	0;
		Delay5us();
	}
	I2c_GetAck();
}	
/*******************************
函数名称:I2c_GetByte
备注:IIC读取一字节
********************************/
uchar I2c_GetByte()
{
	uchar i;
	uchar dat	=	0;
	SDA	=	1;
	for(i=0;i<8;i++)
	{
		dat	<<=	1;
		SCL	=	1;
		Delay5us();
		dat	|=	SDA;
		SCL	=	0;
		Delay5us();
	}
	return dat;
}
/*******************************
函数名称:I2c_SendStr(uchar REG_Address,uchar REG_data)
备注:向IIC设备发送一字节数据
********************************/
void I2c_SendStr(uchar REG_Address,uchar REG_data)
{
    I2c_Start();                  //起始信号
    I2c_SendByte(SlaveAddress);   //发送设备地址+写信号
    I2c_SendByte(REG_Address);    //内部寄存器地址,
    I2c_SendByte(REG_data);       //内部寄存器数据,
    I2c_Stop();                   //发送停止信号
}
/*******************************
函数名称:I2c_GetStr(uchar REG_Address)
备注:从IIC设备读取一字节数据
********************************/
uchar I2c_GetStr(uchar REG_Address)
{
	uchar REG_data;
	I2c_Start();                   //起始信号
	I2c_SendByte(SlaveAddress);    //发送设备地址+写信号
	I2c_SendByte(REG_Address);     //发送存储单元地址,从0开始	
	I2c_Start();                   //起始信号
	I2c_SendByte(SlaveAddress+1);  //发送设备地址+读信号
	REG_data=I2c_GetByte();       //读出寄存器数据
	I2c_SendAck(1);                //接收应答信号
	I2c_Stop();                    //停止信号
	return REG_data;
}

也就是说,时序图表示的那三个函数其实是最底层最基本的代码,而后面发送和接受一个字节是它的应用。其实最主要调用的是最后两个函数,通过它们我们就可以实现IIC通信了

2.IIC实战

1.MPU6050

MPU6050是一个典型的用IIC协议的模块。这里只讲它IIC的用法,具体的MPU6050将会在以后为大家介绍。
MPU6050

//******************************************************************************************************
//初始化MPU6050
//******************************************************************************************************
void InitMPU6050()
{
	I2c_SendStr(PWR_MGMT_1, 0x00);	//解除休眠状态
	I2c_SendStr(SMPLRT_DIV, 0x07);
	I2c_SendStr(CONFIG, 0x06);
	I2c_SendStr(GYRO_CONFIG, 0x18);
	I2c_SendStr(ACCEL_CONFIG, 0x01);
}
//******************************************************************************************************
//合成数据
//******************************************************************************************************
int GetData(uchar REG_Address)
{	
	uchar H,L;
	H=I2c_GetStr(REG_Address);
	L=I2c_GetStr(REG_Address+1);
	return ((H<<8)+L);   //合成数据
}

那么我们可以看到初始化MPU6050的时候运用到了iic发送数据,括号里前面是地址,后面是指令。而合成数据这里我们用到了IIC接受数据,直接把地址写进去就能接收了。下面是地址

地址


总结

这就是IIC协议到底该如何使用。其实IIC并不难,只要多用就能掌握。
欢迎大家关注我
微信公众号:小白写编程
交流群:1033131250

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值