IIC通讯

IIC是什么?

IIC的中文名是集成电路总线,它是一种串行通信总线。

IIC协议用来干什么?

IIC是一种通信协议,是为了能让主板,或者嵌入式系统等与其他外设模块进行通信而进行开发的。

I2C,两线式串行总线,它是由数据线SDA和时钟SCL构成的串行总线,可以发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。

IIC是半双工通信方式。

I2C协议:

  1. 空闲状态
  2. 开始信号
  3. 停止信号
  4. 应答信号
  5. 数据的有效性
  6. 数据传输

1)空闲状态

I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。

2)起始信号与停止信号

硬件IIC与软件IIC的区别:

硬件IIC主要是通过STM32内部的IIC控制器实现的,它利用CPU的时钟信号来控制数据传输和时序。

软件模拟IIC则是通过CPU的GPIO(通用输入输出)引脚来模拟IIC的时序和数据传输。

从代码方面分析IIC的底层驱动

写的话是0,读的话是1

代码示例:

以HT6017芯片为例:

1. 首先对芯片进行端口初始化:

/*******************************************************************************
功能描述:	IIC总线初始化
*******************************************************************************/
void Init_I2CPort(void)
{
	if (((HT_GPIOC->IOCFG & 0x6000) != 0x0000)//端口功能配置寄存器1
	|| ((HT_GPIOC->AFCFG & 0x6000) != 0x0000))//端口功能配置寄存器2
	{
		EnWr_WPREG();//关闭写保护
		HT_GPIOC->IOCFG &= ~0x6000;
		HT_GPIOC->AFCFG &= ~0x6000;
		DisWr_WPREG();//开启写保护
	}
	if ((HT_GPIOC->PTOD & 0x6000) != 0x2000)//端口开漏配置寄存器 
	{
		HT_GPIOC->PTOD |= 0x2000;
		HT_GPIOC->PTOD &=~0x4000;
	}
	if ((HT_GPIOC->PTUP & 0x6000) != 0x0000)//端口上拉配置寄存器
	{
		HT_GPIOC->PTUP &=~0x6000;
	}
	if ((HT_GPIOC->PTDIR & 0x6000) != 0x0000)//端口方向配置寄存器
	{
		HT_GPIOC->PTDIR &=~0x6000;
	}
}

2. 功能描述: IIC总线起始条件


/*******************************************************************************
功能描述:	IIC总线起始条件
*******************************************************************************/
static void I2C_Start(void)
{

	HIGH_SCL();//SCL为高电平
	HIGH_SDA();//SDA为高电平
	I2C_Delay();
	I2C_Delay();
	LOW_SDA();
	I2C_Delay();
	I2C_Delay();
	LOW_SCL(); 
	I2C_Delay();
}

3. 功能描述:IIC总线结束条件

/*******************************************************************************
功能描述:	IIC总线结束条件
*******************************************************************************/
static void I2C_Stop(void)
{
	LOW_SDA();//SDA为低电平
	I2C_Delay();
	I2C_Delay();
	HIGH_SCL();//SCL为高电平
	I2C_Delay();
	I2C_Delay();
	HIGH_SDA();//SDA为高电平
	I2C_Delay();
	I2C_Delay();
}

4. 功能描述:IIC总线发送1字节

/*******************************************************************************
功能描述:	IIC总线发送1字节
*******************************************************************************/
static Bool I2C_TxByte(uint8_t byte)
{//布尔类型,返回值为TRUE或FALSE
	uint8_t	i;
	//逐位发送数据
	for(i=0; i<8; i++)
	{
		LOW_SCL();//SCL为低电平时,数据线上的高低电平才允许变化
		if(byte &0x80)//检查当前最高位是否为1
		{
			HIGH_SDA();
		}
		else 
		{
			LOW_SDA();
		}
		I2C_Delay();
		I2C_Delay();
		HIGH_SCL();//拉高SCL,要求数据稳定,此时SDA上的数据被读取
		I2C_Delay();
		I2C_Delay();
		byte <<=1;//左移一位,处理下一比特
	}
	//从设备应答数据
		LOW_SCL();//SCL设置为低电平,等待从设备应答
		for(i=0; i<32;i++)//循环32次
		{
			if(!PIN_SDA)//检查SDA线是否为低电平
			{
				HIGH_SCL();
				I2C_Delay();
				I2C_Delay();
				LOW_SCL();
				return TRUE;//收到应答,返回TRUE
			}
		}
		//如果在规定时间没有收到应答
		HIGH_SCL();
	    I2C_Delay();
		I2C_Delay();
		LOW_SCL();
		I2C_Stop();//发送停止条件
		return FALSE;//未收到应答,返回FALSE
}

5. 功能描述:IIC总线接收1字节

/*******************************************************************************
功能描述:	IIC总线接收1字节
*******************************************************************************/static uint8_t I2C_RxByte(Bool enAck)
{
	uint8_t	byte = 0x00;//初始化接收到的字节为0
	uint8_t	i;

	for (i=0; i<8; i++)
	{
		byte <<= 1;
		HIGH_SCL();//SCL拉高,允许设备在SDA上放置数据
		if (PIN_SDA)//检查SDA的状态
		{
			byte |= 0x01;//如果是高,按位或,设置成1
		}
		else
		{
			I2C_Delay();//如果为低,延时
		}
		LOW_SCL();
		I2C_Delay();
		I2C_Delay();
	}
	//发送应答
	if (FALSE != enAck)//如果需要发送应答
	{
		LOW_SDA();//拉低SDA,发送数据
	}
	HIGH_SCL();
	I2C_Delay();
	I2C_Delay();
	LOW_SCL();
	returnbyte;//返回接收到的byte位
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值