IIC(Inter-Integrated Circuit)是IIC Bus简称, 它是一种串列通讯总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。

IIC简介:

IIC总线只有2根信号线,一根是数据线SDA,一根是时钟线SCL。SDA和SCL均为双向信号线,通过上拉电阻接正电源。当总线空闲时,两根线都是高电平。连接到总线上的任一器件,输出低电平,都将使总线的信号变低。
连接总线的器件输出级必须是集电极或漏极开路,以形成线“与”功能。
每个具有IIC接口的设备都有一个唯一的地址,也叫做设备地址,通讯时需要进行寻址。

数据在进行传输时,时钟线SCL为高电平时,数据线SDA上的数据必须稳定,时钟线SCL为低电平时,才允许数据发生改变。

IIC的启动和停止


时钟线SCL高电平时,拉低数据线SDA-------------启动
时钟线SCL高电平时,拉高数据线SDA-------------停止

//总线启动条件
void IIC_Start(void)
{SDA = 1;SCL = 1;IIC_Delay(DELAY_TIME);SDA = 0;IIC_Delay(DELAY_TIME);SCL = 0;
}//总线停止条件
void IIC_Stop(void)
{SDA = 0;SCL = 1;IIC_Delay(DELAY_TIME);SDA = 1;IIC_Delay(DELAY_TIME);
}

数据通信


启动总线后,必须发送设备地址,其中高4位是器件的类型识别符(EEPROM的识别符为1010),接着3位是片选信号,最后1位是读写控制位,读操作为1,写操作为0。
第9位是应答信号位,以确定数据传送是否被对方收到。应答信号由接收方在数据开始后的第9个时钟周期发送,在SCL为高电平期间,接收方将SDA拉为低电平产生应答,用来结束一个字节的传输。也就是说,一帧完整的数据共有9位。
等待应答信号的代码:

//等待应答
bit IIC_WaitAck(void)
{bit ackbit;SDA  = 1;              //新加,释放数据总线IIC_Delay(DELAY_TIME);SCL  = 1;IIC_Delay(DELAY_TIME);ackbit = SDA;if(ackbit)                //新加,若无应答,则停止总线IIC_Stop();SCL = 0;IIC_Delay(DELAY_TIME);return ackbit;
}

注意:当主机接收数据(也就是在读数据状态)时,它收到最后一个字节后,必须向从机发出一个结束传送的信号。这个信号是通过对从机的“非应答信号”来实现的,在SCL为高电平期间,SDA为高电平,即从机释放SDA线,允许主机产生一个停止信号。
主动发送应答的代码实现:

//主机发送应答
void IIC_SendAck(bit ackbit)
{SCL = 0;SDA = ackbit;                    // 0:应答,1:非应答IIC_Delay(DELAY_TIME);SCL = 1;IIC_Delay(DELAY_TIME);SCL = 0; SDA = 1;IIC_Delay(DELAY_TIME);
}

发送数据


操作时序:总线开始-----发送地址+写(0)-----从机应答------发送数据------从机应答……
发送一个字节数据的代码实现:

//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{unsigned char i;for(i=0; i<8; i++){SCL  = 0;IIC_Delay(DELAY_TIME);if(byt & 0x80) SDA  = 1;else SDA  = 0;IIC_Delay(DELAY_TIME);SCL = 1;byt <<= 1;              //从最高位开始传输数据IIC_Delay(DELAY_TIME);}SCL  = 0;
}

接受数据


操作时序:总线开始-----发送地址+读(1)-----从机应答------接受数据------主机发送应答……
接受一个字节数据的代码实现:

//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{unsigned char i, da;for(i=0; i<8; i++){   SCL = 1;IIC_Delay(DELAY_TIME);da <<= 1;                    //从高位开始接受数据if(SDA) da |= 1;SCL = 0;IIC_Delay(DELAY_TIME);}return da;
}

Reference
https://blog.csdn.net/ohy3686/article/details/86716456

IIC总线的操作时序相关推荐

  1. FPGA实现IIC协议(一)----初识IIC总线

    写在前面 IIC协议系列博文: FPGA实现IIC协议(一)----初识IIC总线 FPGA实现IIC协议(二)----IIC总线的FPGA实现(单次读写驱动) 1.什么是IIC协议 IIC通讯协议( ...

  2. 【乌拉喵.教程】IIC总线介绍及FPGA编程

    最近将多年来收集到的教学视频.国内外图书.源码等整理整合拿出来,涉及arm.Linux.python.信号完整性.FPFA.DSP.算法.stm32.单片机.制图.电子模块.kali.出版社图书等.资 ...

  3. IIC总线的时钟同步和总线仲裁

    IIC简介: IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的,主要是用来连接整体电路(ICS) ,IIC是一种多向控 ...

  4. 【转】IIC总线的FPGA实现

    转自:http://www.cnblogs.com/sunev/archive/2012/05/17/2506731.html 一.摘要 DE2_TV中,有关于寄存器的配置的部分,采用的方法是通过II ...

  5. 基于51单片机实现模拟IIC总线时序

    最近用到测量光线的模块BH1750FVI时需要用到IIC总线操作, 于是就又费功夫学习了下, 基本上算是了解了, 所以呢, 就用51的IO口, 模拟出了总线时序, 并能正确操纵需要用IIC总线访问地一 ...

  6. IIC总线上挂载多个从机的程序实现

    文章目录 IIC总线上挂载多个从机的程序实现 IIC简介: 1.项目的硬件参考电路: 2.程序实现: 2.1.程序框架设计: 2.2 IIC 总线接口程序实现: 2.3 加速度传感器的配置: 2.4 ...

  7. IIC总线的原理与Verilog实现

    IIC总线的原理与Verilog实现 1. 软件平台与硬件平台 2. 原理介绍 2.1 IIC总线的特点: 2.2 IIC总线协议详解: 2.2.1 IIC主机往从机里面写入数据的步骤 2.2.2 I ...

  8. STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、图像(硬件IIC)

    参考:基于STM32-Oled(IIC)的使用 作者:奋斗的小殷 发布时间: 2021-05-07 13:09:26 网址:https://blog.csdn.net/boybs/article/de ...

  9. IIC总线通讯协议、EEPROM芯片

    EEPROM芯片: 掉电不会丢失数据,可以保存数据. IIC串行总线的组成及工作原理: IIC总线传输协议 IIC产生起始与终止信号: IIC字节的传送与应答: 应答位作用: 数据帧格式: 总线寻址 ...

最新文章

  1. 如何保护数据中心免受电子腐蚀和突然故障的威胁?
  2. 经典卷积网络进阶--GoolgleNet详解
  3. c语言结构体单元测试,C语言结构体单元练习.doc
  4. LeetCode 1276. 不浪费原料的汉堡制作方案(解方程)
  5. apache php debug,fedora linux apache/php下安装配置xdebug
  6. Commons-logging + Log4j 使用方法、常见问题
  7. 通俗版 OSI七层模型,物理介质
  8. IE DOM中Frame的使用
  9. 软考初级程序员的备考经验分享
  10. SketchUp-2022版本
  11. 瑞芯微读取寄存器_瑞芯微Android软件中添加ALC5640 音频CODEC 的寄存器修改
  12. win10安装python27_《win10python27安装教程》 win10怎么安装python
  13. php微信上传头像,微信小程序怎么上传头像
  14. H3C交换机如何进行批量端口配置
  15. 如何解决中小企业融资难问题
  16. python基础 (一)import用法
  17. 【腾讯优测月刊】安卓主流自动化测试框架详解与实践
  18. 安装vmware出现中断黄色感叹号回滚操作解决办法
  19. obj2gltf格式转换详细过程
  20. Python爬取13个旅游城市,告诉你五一大家最爱去哪玩?

热门文章

  1. Java 算法 校门外的树
  2. TCA9548A iic地址扩展器件 树莓派JAVA版教程
  3. ios mysql数据库查询语句_ios fmdb数据库查询语句
  4. html中单选框重置,HTML表单和组件
  5. python列表截取双冒号“::“用法
  6. Linux/Centos源码安装python3任意版本
  7. ufs2.0测试软件,UFS 2.1和UFS 2.0差距到底多大?跑分还有很多学问
  8. java 线程 wait 一定要同步_java中使用wait就得使用同步锁,而且2个线程必须都使用同步代码块,否则就会异常...
  9. 【 Linux 网络虚拟化 】Netns
  10. Android之RecyclerView实现时光轴