IIC通信

IIC概述

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

信号概念

I2C通信,存在几种信号

  1. 起始信号(条件):通知从机做好通信的准备,IIC_SCL为高电平时,IIC_SDA出现下降沿。
  2. 应答信号:有应答和无应答。有应答是低电平,无应答是高电平。
  3. 停止信号(条件):告诉从机通信已经结束,IIC_SCL为高电平时,IIC_SDA出现上降沿。

时序图

  • 数据的有效性,当IIC_SCL为高电平时,IIC_SDA为高电平即表示该位数据为1
    在这里插入图片描述

  • 起始和停止条件
    在这里插入图片描述

  • 应答信号
    在这里插入图片描述

主机发送数据给从机

  1. 发送起始位:当SCL为高电平时,SDA发生一个下降沿,表示启动IIC总线
void IIC_Start(void)
{
	IIC_SDA=1;
	IIC_SCL=1;
	IIC_Delay();
	IIC_SDA=0;	//将SDA置0,出现一个下降沿
	IIC_Delay();
	IIC_SCL=0;
	IIC_Delay();
}
  1. 发送从机地址
void Write_IIC_Byte(uint8_t _ucByte)
{
  	uint8_t i;
	//从_ucByte的高位bit开始发送
	for (i = 0; i < 8; i++)
	{		
		if (_ucByte & 0x80)	//按位与操作判断uc_Byte的bit7是否为1
		{
			IIC_SDA=1;
		}
		else
		{
			IIC_SDA=0;
		}
		IIC_Delay();
		IIC_SCL=1;
		IIC_Delay();	
		IIC_SCL=0;
		if (i == 7)
		{
			 IIC_SDA=1; // 释放总线
		}
		_ucByte <<= 1;	//uc_Byte左移一个bit,继续判断 
		IIC_Delay();
	}
}
  1. 等待从机返回ACK码
uint8_t IIC_WaitAck(void)
{
	uint8_t re;

	IIC_SDA=1;	//CPU释放SDA总线 
	IIC_Delay();
	IIC_SCL=1;	//CPU驱动SCL = 1, 此时器件会返回ACK应答
	IIC_Delay();
	if (IIC_SDA_READ())	//CPU读取SDA口线状态 
	{
		re = 1;
	}
	else
	{
		re = 0;
	}
	IIC_SCL=0;
	IIC_Delay();
	return re;
}
  1. 主机发送数据,和第二步的函数一样void Write_IIC_Byte(uint8_t _ucByte);
  2. 发送停止位:当SCL为高电平时,SDA出现上升沿,表示停止通信
void IIC_Stop(void)
{
	//当SCL高电平时,SDA出现一个上跳沿表示IIC总线停止信号 
	IIC_SDA=0;
	IIC_SCL=1;
	IIC_Delay();
	IIC_SDA=1;
}

主机连续读取从机数据

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值