I2C热知识


一、I2C 总线

在这里插入图片描述
每个连接到总线的设备都有一个独立的地址(一般可以通过硬件设置,可通过查芯片数据手册得知),主机可以利用这个地址进行不同设备之间的访问。 总线通过上拉电阻接到电源。当 I2C 设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。数据线(SDA)用来传输数据,时钟线(SCL)用于数据收发同步。
上拉电阻可以是1.5K,2.2K,4.7K, 电阻越小,上升时间越短,当总线过长或者从机过多可以选择小的上拉电阻,增加信号强度,否则选择较大电阻减小功耗,当然首先是参考各个芯片的数据手册!

二、三种信号

开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。

void IIC_Start(void)
{
	SDA_OUT();     //sda线输出
	IIC_SDA=1;	  	  
	IIC_SCL=1;
	delay_us(4);
 	IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
	delay_us(4);
	IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 
}	  

停止信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。

void IIC_Stop(void)
{
	SDA_OUT();//sda线输出
	IIC_SCL=0;
	IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
 	delay_us(4);
	IIC_SCL=1; 
	IIC_SDA=1;//发送I2C总线结束信号
	delay_us(4);							   	
}

响应信号:主机产生时钟,在第 9 个时钟时,数据发送端会释放 SDA 的控制权,由数据接收端控制 SDA,若 SDA 为高电平,表示非应答信号(NACK),低电平表示应答信号(ACK)。当数据接受端接收完一个字节数据或者地址,就要返回应答或非应答信号来表示继续或者停止接受数据,若发送方收到非应答信号就会返回结束信号结束通信,否则继续下一个字节数据传输。

在这里插入图片描述

//返回值:1,接收应答失败
//        0,接收应答成功
u8 IIC_Wait_Ack(void)
{
	u8 ucErrTime=0;
	SDA_IN();      //SDA设置为输入  
	IIC_SDA=1;delay_us(1);	   
	IIC_SCL=1;delay_us(1);	 
	while(READ_SDA)	//READ_SDA为读取SDA的电平函数的宏定义
	{
		ucErrTime++;
		if(ucErrTime>250)
		{
			IIC_Stop();
			return 1;
		}
	}
	IIC_SCL=0;//时钟输出0 	   
	return 0;  
} 
//产生ACK应答
void IIC_Ack(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=0;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}
//不产生ACK应答		    
void IIC_NAck(void)
{
	IIC_SCL=0;
	SDA_OUT();
	IIC_SDA=1;
	delay_us(2);
	IIC_SCL=1;
	delay_us(2);
	IIC_SCL=0;
}	

三、通信过程

1、选择从机

首先由主机产生起始信号,这时连接到 I2C 总线上的所有从机都会接收到这个信号。接下来所有从机开始等待主机紧接下来广播的从机地址信号,传输时,SCL 为高电平的时候 SDA 表示的数据有效,SCL 为低电平时SDA切换电平,准备下一次SCL 高电平时要传输的数据,当主机广播的地址与某个设备地址相同时,这个设备就被选中了,没被选中的设备将会忽略之后的数据信号。根据 I2C 协议,这个从机地址可以是 7 位或 10 位。在地址位之后,是传输方向的选择位,该位为 0表示主机向从机写数据。该位为 1表示主机由从机读数据。从机接收到匹配的地址后,会返回一个应答(ACK)或非应答(NACK)信号,只有接收到应答信号后,主机才能继续发送或接收数据。

2、主机发数据

广播完地址,接收到应答信号后,主机开始正式向从机传输数据,数据包的大小为 8 位,主机每发送完一个字节数据,都要等待从机的应答信号(ACK),重复这个过程,可以向从机传输 N 个数据,这个 N 没有大小限制。当数据传输结束时,主机向从机发送一个停止传输信号§,表示不再传输数据。

3、主机读数据

广播完地址,接收到应答信号后,从机开始向主机返回数据,数据包大小也为 8 位,从机每发送完一个数据,都会等待主机的应答信号(ACK),重复这个过程,可以返回 N 个数据,这个 N 也没有大小限制。当主机希望停止接收数据时,就向从机返回一个非应答信号(NACK),则从机自动停止数据传输。

4、复合格式

除了基本的读写,I2C 通讯更常用的是复合格式,该传输过程有两次起始信号。一般在第一次传输中,主机通过从机地址寻找到从设备后,发送一段从机设备内部的寄存器或存储器地址,在第二次的传输中,对该地址的内容进行读或写。也就是说,第一次通讯是告诉从机读写地址,第二次则是读写的实际内容。

例如一个EEPROM的连续读过程为:
发起I2C总线启动信号
发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读
等待ACK
发送字节地址
等待ACK
再次发起I2C总线启动信号
发起控制字节,高7bit是地址,bit0是读写控制位,0表示写,1表示读
发送ACK
在循环里接收数据
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32是一种微控制器系列,其中的I2C硬件接口可以与外部设备进行通信。Cubemx是一个图形化配置工具,用于生成STM32的初始化代码。而MLX90640是一款成像传感器,能够感知远红外辐射。 在使用STM32的Cubemx配置MLX90640的时候,首先需要在Cubemx中选择I2C作为通信接口。然后,根据MLX90640的规格手册,配置I2C的时钟速率、读写模式和寄存器地址等参数。接下来,可以通过生成代码来获取MLX90640的数据。 配置完成后,需要编写一些代码来控制I2C硬件接口和操作MLX90640传感器。首先,初始化I2C接口,并配置I2C的片选引脚、时钟和数据线等。然后,可以通过发送寄存器写入命令、读取数据等,与MLX90640进行通信。在读取数据之前,还需要配置MLX90640的采样参数和启动测量。最后,可以读取传感器返回的数据,并将其进行处理和显示。 需要注意的是,使用MLX90640需要了解其通信协议和寄存器地址等相关知识。同时,还需要注意配置正确的电源供应和引脚连接,并根据传感器的规格手册进行电源管理和校准。 总结来说,使用STM32的Cubemx配置MLX90640需要先选择I2C硬件接口,并在Cubemx中进行相应的配置。然后,根据传感器的规格手册编写代码,通过I2C接口与MLX90640进行通信和操作。这样,就可以实现对MLX90640的控制和数据读取,从而实现成像的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值