首页 > 其他分享 >IIC通信协议

IIC通信协议

时间:2024-11-07 16:16:20浏览次数:6  
标签:通信协议 总线 HT Delay GPIOC IIC I2C

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();
	return byte;//返回接收到的byte位
}

标签:通信协议,总线,HT,Delay,GPIOC,IIC,I2C
From: https://blog.csdn.net/m0_64982857/article/details/143595965

相关文章

  • 常见网络通信协议
    常见网络通信协议HTTP和HTTPS都属于应用层协议,它们都是用于从万维网(WWW)服务器传输超文本到本地浏览器的传送协议。它们都是基于TCP/IP协议来传递数据的,支持客户端-服务器模式的通信。HTTP和HTTPS的区别主要在于HTTPS在HTTP的基础上增加了SSL/TLS安全层,使得数据传输更加安全。HTT......
  • Experion PKS系列开发:C300控制器_通信协议与接口
    通信协议与接口在工业控制系统中,通信协议和接口是实现不同设备和系统之间数据交换和协同工作的关键。HoneywellExperionPKS系列的C300控制器支持多种通信协议和接口,以确保其能够与各种外部设备和系统进行高效、可靠的数据通信。本节将详细介绍C300控制器支持的通信协议......
  • 【GiraKoo】车载常用通信协议(CAN,ETH,LVDS)
    车载常用通信协议(CAN,ETH,LVDS)本文的主要来源是DeepSeek的开源AI大模型。可能存在一些错误或不准确的地方,请谨慎参考。特性CAN(ControllerAreaNetwork)以太网(Ethernet)LVDS(LowVoltageDifferentialSignaling)带宽低(最高1Mbps)高(1Gbps或更高)中等(......
  • 【项目实战】网络通信协议Socket和WebSocket入门介绍
    一、Socket1.1文件描述符详解文件描述符是在操作系统层面用来访问文件或I/O资源(如网络套接字)的一个抽象的、非负整数。每个进程在打开一个文件或创建一个套接字时,都会得到一个唯一的文件描述符。在Unix/Linux系统中,标准输入(stdin)、标准输出(stdout)和标准错误(stderr)默认......
  • IIC通信协议详解 & PCF8591应用(Verilog实现)
    该文章结合PCF85918-bitAD/DA模数/数模转换器来详细介绍IIC通信协议,尽量做到条理清晰,通俗易懂。该文图片均从PCF8591手册中截取,一定程度上引导读者学习阅读datasheet。1.PCF8591引脚2.功能介绍2.1地址位在I2C总线系统中,每个PCF8591设备都通过发送一个有效地址来激活。......
  • 【物联网】物联网中常见的通信协议
    目录1、MQTT2、CoAP3、HTTP4、WebSocket5、ZigBee6、Bluetooth7、Z-Wave8、6LoWPAN9、LoRaWAN10、NB-IoT11、DDS12、AMQP13、DDS-RTPS14、Modbus15、OPCUA16、D-Bus17、EnOcean18、Thread19、Wi-Fi20、Ethernet/IP21、HyperCat22、MQTT-SN23、Sigfox2......
  • 从零开始了解数采(五)——工业通信协议:数据采集的“语言”桥梁
    在工业数据采集中,数据的采集、传输和处理都离不开一种“语言”——这就是工业通信协议。可以说,通信协议是将各种设备、传感器和系统连接在一起的桥梁,让它们能够“说”同一种语言,从而顺利地实现数据的传递和控制。那么,在这个复杂的工业世界中,常见的通信协议有哪些?它们又各自......
  • 如何设计一个通信协议
    1.网络层次1.1具体层次以及封装封装的协议结构一般是协议头+数据。2.网络通信存在问题2.1设计协议时,边界问题如何处理场景以及问题:在TCP流式传输中,流式传输也就是一端只关心向管道发送数据,另外一边只要管道存在数据就接收数据。一个客户端发送N个100字节的消息,此时服......
  • 使用PIC单片机驱动OLED模块(软件模拟IIC模式)
    @使用PIC单片机驱动OLED模块(软件模拟IIC模式)使用PIC单片机驱动OLED模块(软件模拟IIC模式)最近学习Microchhip的PIC18系列单片机,使用该款单片机进行一些外设的开发。发现网上的资料很少,故开了此个博客,对自己的学习过程进行一些记录,希望未来国内Microchip的社区能有更多的资源......
  • 安全见闻-通信协议安全
    目录通讯协议的安全问题1.保密性问题2.完整性问题3.⾝份验证问题4.可⽤性问题5.协议实现问题6.协议设计缺陷7.移动通讯协议安全问题8.物联⽹通讯协议安全问题9.⼯业控制系统通讯协议安全问题结语:泷羽sec:安全见闻(6)_哔哩哔哩_bilibili安全见闻(6)_哔哩哔哩_bilibi......