首页 > 其他分享 >IIC

IIC

时间:2024-03-10 15:22:51浏览次数:23  
标签:SCL IIC void delay SDA iic

IIC

IIC总线结构图

image-20240310140904545

IIC协议时序

image-20240310141127071

软件模拟IIC协议示例代码

  • 起始信号
void iic_start(void)
{ /* SCL为高电平期间, SDA从高电平往低电平跳变*/
    IIC_SDA ( 1 );	
	IIC_SCL ( 1 );
    iic_delay( );
 	IIC_SDA ( 0 );	
 	iic_delay( );
    IIC_SCL ( 0 );	
 	iic_delay( );  /* 钳住总线, 准备发送/接收数据 */
}
  • 停止信号
void iic_stop(void)
{ /* SCL为高电平期间, SDA从低电平往高电平跳变*/
    IIC_SDA ( 0 );	
	iic_delay( );
 	IIC_SCL ( 1 );	
 	iic_delay( );
    IIC_SDA ( 1 ); 	/* 发送总线停止信号*/
 	iic_delay( );
}
  • 检测应答信号
uint8_t iic_wait_ack (void) /* return 1:fail 0:succeed*/
{	
	IIC_SDA (1);  /* 主机释放SDA线 */
	iic_delay( );
	IIC_SCL (1);  /* 从机返回ACK*/ 	
 	iic_delay( );
	if ( IIC_READ_SDA ) /* SCL高电平读取SDA状态*/ 
	{
		iic_stop();	    /* SDA高电平表示从机nack */ 
		return 1;
	}
	IIC_SCL(0);	 /* SCL低电平表示结束ACK检查 */ 
 	iic_delay( );
	return 0;
}
  • 发送应答信号
void iic_ack(void)
{ 
    IIC_SCL (0);	
	iic_delay( );
 	IIC_SDA (0);  /* 数据线为低电平,表示应答 */
 	iic_delay( );
    IIC_SCL(1); 	
 	iic_delay( );
}
  • 发送非应答信号
void iic_nack(void)
{ 
    IIC_SCL (0);	
	iic_delay( );
 	IIC_SDA (1);  /* 数据线为高电平,表示非应答 */
 	iic_delay( );
    IIC_SCL (1); 	
 	iic_delay( );
}
  • 发送1字节数据
void iic_send_byte(uint8_t data)
{
	for (uint8_t t = 0; t < 8; t++)
	{	/* 高位先发 */
		IIC_SDA((data & 0x80) >> 7);
 		iic_delay( );
 		IIC_SCL ( 1 );	
 		iic_delay( );
 		IIC_SCL ( 0 );
		data <<= 1; /* 左移1位, 用于下一次发送 */
	}
	IIC_SDA ( 1 ); 	/* 发送完成,主机释放SDA线 */ 
}
  • 读取1字节数据
uint8_t iic_read_byte (uint8_t ack) /* 1:ack 0:nack*/
{ 
	uint8_t receive = 0 ;
	for (uint8_t t = 0; t < 8; t++)
	{	/* 高位先输出,先收到的数据位要左移 */ 
		receive <<= 1;		
		IIC_SCL ( 1 );	
 		iic_delay();
		if ( IIC_READ_SDA ) receive++;
 		IIC_SCL ( 0 );
		 iic_delay();
	}
	if ( !ack ) iic_nack();
	else iic_ack();
	return receive; 	
}

标签:SCL,IIC,void,delay,SDA,iic
From: https://www.cnblogs.com/hnu-hua/p/18064226

相关文章

  • 47. 全排列 IIc
    我宣布我已经参透了套路,一次AC/***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnColumnSizesarray.*Note:Bothreturnedarrayand*columnSizesarraymustbemalloced,assumecallercallsfree().*/int......
  • 40. 组合总和 IIc
    很好的题目,使我的大脑旋转。/***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnColumnSizesarray.*Note:Bothreturnedarrayand*columnSizesarraymustbemalloced,assumecallercallsfree().*/intte......
  • STM32硬件IIC使用
    概述虽然STM32的硬件IIC据说有设计缺陷,但是经过我的实践,至少STM32F103的硬件IIC是没问题的。这里给出STM32的硬件IIC的使用以及编程思路。1.STM32硬件IIC引脚在这里给出STM32F103的硬件IIC引脚,方便查阅使用2.STM32硬件IIC使用流程STM32的硬件IIC我认为是非常具有借鉴意义的,......
  • 216. 组合总和 IIIc
    /***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnColumnSizesarray.*Note:Bothreturnedarrayand*columnSizesarraymustbemalloced,assumecallercallsfree().*/inttemp[10];voiddfs(int**......
  • 【代码更新】IIC时序——读写EEPROM
    【代码更新】IIC时序——读写EEPROM    整体代码:1//---->50MHz--->20ns100KHz---->10000ns2`timescale1ns/1ps3moduleeeprom_i2c#(parameterSCL_CYC=1000)//100KHz4(5inputclk,6inputrst_n,78......
  • STM32硬件IIC使用
    STM32硬件IIC使用.md概述虽然STM32的硬件IIC据说有设计缺陷,但是经过我的实践,至少STM32F103的硬件IIC是没问题的。这里给出STM32的硬件IIC的使用以及编程思路。1.STM32硬件IIC引脚在这里给出STM32F103的硬件IIC引脚,方便查阅使用2.STM32硬件IIC使用流程STM32的硬件IIC我认......
  • 【STM32+HAL库】---- 硬件IIC驱动0.96OLED
    硬件开发板:STM32G0B1RET6软件平台:cubemax+keil+VScode内容原著声明部分代码借鉴学习于以下视频和文章:https://www.bilibili.com/video/BV1MV411o7P5/?spm_id_from=333.999.0.0&vd_source=2c974fb85c05e13d278d1bbe4cddc944https://blog.csdn.net/weixin_56565733/article/de......
  • IIC
    半双工,意味着要使用开漏输出高位先行,比如AT24C128/256是16位地址,发送从机地址的时候要一个字节一个字节的发,这个时候因为是高位先行,因此先发高位地址起始时序(SCL高电平期间SDA产生下降沿):先置SDA为高电平,然后置SCL为高电平,然后拉低SDA,然后在拉低SCL终止时序(SCL高电平期间SDA......
  • stm32硬件实现IIC
    #include"Driver_IIC.h"#include"Delay.h"/***IIC默认地工作于从模式。*生成起始条件后自动地从从模式切换到主模式,*当仲裁丢失或产生停止信号时,从主模式切换到从模式。***从模式用于接收数据;主模式用于发送数据。*//***初始化*/voidDriver_II......
  • IIC:DDM_SFP光模块参数读取
    光模块数字诊断监控数据读取逻辑报告I2C从设备地址0xA2访问的256字节的数据包括一些常量,也包含一些只读的变量,甚至还有一些可写的变量。数字诊断内存映射专用数据字段描述如下: 图1期间地址分布说明 图2检测信号地址 Finisar公司的DDM数据位于器件地址A2H,具体信号数据......