IIC协议

IIC通信协议

IIC通信过程由开始、结束、发送、响应、接收五个部分构成。

1、(在发送、接收数据的时候)当SCL为高电平时,SDA线不允许变化;当SCL线为低电平时,SDA线可以任意0、1变化。
2、(在任意时候)只有当SCL为高电平时,IIC电路才对SDA线上的电平(0或者1)进行记录,当SCL线为低电平时,无论SDA是高还是低,IIC电路都不对SDA进行采样。

空闲状态

在介绍上面五个部分前,我们首先说说空闲状态,什么是空闲状态,就是没有通信时的状态初始状态

I2C总线的SDA和SCL两条信号同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

开始信号与停止信号

开始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序信号,不是一个电平信号。
停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号是一种电平跳变时序信号,不是一个电平信号。

开始信号程序

//产生IIC起始信号
//1.设置SDA输出
//2.先拉高SDA,再拉高SCL,空闲状态
//3.拉低SDA
//4.准备接收数据
void IIC_Start(void)
{SDA_H;                     //拉高SDA线SCL_H;                      //拉高SCL线DelayUs(iicInfo.speed);     //延时,速度控制SDA_L;                      //当SCL线为高时,SDA线一个下降沿代表开始信号DelayUs(iicInfo.speed);        //延时,速度控制SCL_L;                      //钳住SCL线,以便发送数据}

停止信号程序

//产生IIC停止信号
//1.设置SDA输出
//2.先拉低SDA,再拉低SCL
//3.拉高SCL
//4.拉高SDA
//5.停止接收数据
void IIC_Stop(void)
{SDA_L;                     //拉低SDA线SCL_L;                      //拉低SCL先DelayUs(iicInfo.speed);     //延时,速度控制SCL_H;                      //拉高SCL线SDA_H;                      //拉高SDA线,当SCL线为高时,SDA线一个上升沿代表停止信号DelayUs(iicInfo.speed);}

应答信号

发送器每发送一个字节,就在时钟脉冲9期间释放数据先,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。
对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间位稳定的低电平。如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P
每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答:

应答信号程序

//产生ACK应答
//这里就很清楚了,产生应答:SCL在SDA一直为低电平期间完成低高电平转换
void IIC_Ack(void)
{SCL_L;                     //拉低SCL线SDA_L;                      //拉低SDA线DelayUs(iicInfo.speed);SCL_H;                       //拉高SCL线DelayUs(iicInfo.speed);SCL_L;                       //拉低SCL线}
//不产生ACK应答
//这里就很清楚了,不产生应答:SCL在SDA一直为高电平期间完成低高电平转换
void IIC_NAck(void)
{SCL_L;                     //拉低SCL线SDA_H;                      //拉高SDA线DelayUs(iicInfo.speed);SCL_H;                       //拉高SCL线DelayUs(iicInfo.speed);SCL_L;                       //拉低SCL线}_Bool IIC_WaitAck(unsigned int timeOut)
{SDA_H;DelayUs(iicInfo.speed);          //拉高SDA线SCL_H;DelayUs(iicInfo.speed);           //拉高SCL线while(SDA_R)                            //如果读到SDA线为1,则等待。应答信号应是0{if(--timeOut){printf("WaitAck TimeOut\r\n");IIC_Stop();                       //超时未收到应答,则停止总线return IIC_Err;                   //返回失败}DelayUs(iicInfo.speed);}SCL_L;                                   //拉低SCL线,以便继续收发数据return IIC_OK;                          //返回成功}

发送数据

在I2C总线上传送的每位数据都有一个时钟脉冲相对应(或同步控制),即在SCL串行时钟的配合下,SDA逐位地串行传送每一位数据。数据位的传输是边沿触发。

//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答            //IIC_SCL=0;
//在SCL上升沿时准备好数据,进行传送数据时,拉高拉低SDA,因为传输一个字节,一个SCL脉冲里传输一个位。
//数据传输过程中,数据传输保持稳定(在SCL高电平期间,SDA一直保持稳定,没有跳变)
//只有当SCL被拉低后,SDA才能被改变
//总结:在SCL为高电平期间,发送数据,发送8次数据,数据为1,SDA被拉高,数据为0,SDA被拉低。
//传输期间保持传输稳定,所以数据线仅可以在时钟SCL为低电平时改变。
void IIC_SendByte(unsigned char byte)
{unsigned char count = 0;SCL_L;                            //拉低时钟开始数据传输for(; count < 8; count++)      //循环8次,每次发送一个bit{if(byte & 0x80)             //发送最高位SDA_H;elseSDA_L;byte <<= 1;                   //byte左移1位DelayUs(iicInfo.speed);SCL_H;DelayUs(iicInfo.speed);SCL_L;}}

单片机发送完一个字节后面必须跟一个等外应答函数:

思路:先让SDA=1,再判断在一定时间内SDA是否变为0,从而识别出外设有没有发送应答信号。

//等待应答信号到来
//返回值:1,接收应答失败
//        0,接收应答成功
//1.设置SDA为输入
//2.拉高SDA
//3.拉高SCL
//4.等待接收器返回应答信号,如果数据线SDA一直为高,就一直等待,并返回1(无效应答),如果数据线SDA为低,返回0(有效应答)

接收数据

发送数据是一位一位发送,接收数据也是一位一位接收进来,最后返回应答信号:

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   //先拉低SCL,延时后拉高
//读取数据
//是否发送应答
unsigned char IIC_RecvByte(void)
{unsigned char count = 0, receive = 0;SDA_H;                          //拉高SDA线,开漏状态下,需线拉高以便读取数据for(; count < 8; count++ )      //循环8次,每次发送一个bit{SCL_L;DelayUs(iicInfo.speed);SCL_H;receive <<= 1;                //左移一位if(SDA_R)                 //如果SDA线为1,则receive变量自增,每次自增都是对bit0的+1,然后下一次循环会先左移一次receive++;DelayUs(iicInfo.speed);}return receive;
}

STM32 IIC协议详解相关推荐

  1. STM32常用协议之IIC协议详解

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 IIC协议详解 前言 一.IIC协议简介 1.1 简介 1.2 IIC物理层 1.3 协议层 1.3.1 IIC基本读写过程 1.3. ...

  2. IIC(I2C)协议详解

    1.简介 IIC,即I²C,全称 Inter-Integrated Circuit,字面上的意思是集成电路之间,它其实是I²C Bus简称,所以中文应该叫 集成电路总线 ,它是一种串行通信总线,使用多 ...

  3. STM32常用协议之SPI协议详解

    SPI协议详解 SPI协议简介 一.SPI物理层 二.SPI协议层 2.1 SPI基本通信过程 2.2 通信的起始和终止信号 2.3 数据有效性 2.4 CPOL/CPHA及通信模式 三.编程实现 四 ...

  4. UART, SPI, IIC的详解及三者的区别和联系

    1.UART, SPI, IIC的详解 UART.SPI.IIC是经常用到的几个数据传输标准,下面分别总结一下: UART(Universal Asynchronous Receive Transmi ...

  5. IoT:MQTT协议详解

    IoT -- (七)MQTT协议详解 转自:https://blog.csdn.net/anxianfeng55555/article/details/80908795 MQTT是什么? MQTT(M ...

  6. IIC通信协议详解 PCF8591应用(Verilog实现FPGA)

    IIC通信协议详解 & PCF8591应用(Verilog实现/FPGA) 该文章结合PCF8591 8-bit AD/DA 模数/数模转换器来详细介绍IIC通信协议,尽量做到条理清晰,通俗易 ...

  7. STM32 CAN通信协议详解—小白入门(二)

    文章目录 (一)CAN通信协议简介 (二)CAN物理层 2.1.闭环总线网络2.2.开环总线网络2.3.通信节点2.4.差分信号2.5.CAN协议的差分信号 (三)协议层 3.1.CAN的波特率及位同 ...

  8. STM32串口通信详解以及通信异常或者卡死常见问题分析

    STM32串口通信详解以及通信异常或者卡死常见问题分析 目录 STM32串口通信详解以及通信异常或者卡死常见问题分析 一.常见的异常问题 二.STM32的串口简介 1.串口的通讯方式 ①按数据传输方向 ...

  9. HTTP协议详解(真的很经典)

    转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的 ...

  10. Http 协议详解笔记

    HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第 ...

最新文章

  1. 成功进行微博营销的几点技巧
  2. 【学术相关】这个英文语法校正插件很赞!可以校正邮件,也可以校正论文
  3. 深入理解DefaultMessageListenerContainer
  4. 聚合报告90%参数说明
  5. Linux 64位进程地址空间分布概况
  6. 把服务器文件,如何把文件放在服务器
  7. C++:标准程序库-STL迭代器Iterator
  8. windows8 初始界面和功能
  9. 常用名词理解(APK,SDK,JDK,API,DLL)
  10. FlashXP命令行
  11. G729调用方法及使用wavlib播放出现颤音的解决方法
  12. 迅雷 华为 手机 php,荣耀路由Pro怎么用手机远程下载迅雷任务
  13. 机器学习_正态分布下的贝叶斯分类器
  14. Linux命令hostname -i
  15. UNITY_iOS_接入微信登录及分享微信
  16. 房屋装修设计更显档次需要从几个方面入手
  17. 第十一章 无线渗透
  18. C#排序算法之希尔排序
  19. 全国各省土壤类型空间分布数据
  20. 利用Python实现MOOC扫码登录

热门文章

  1. USB 转 RS-485 / 422 接口转换器
  2. 2020农行软开实习的笔试题
  3. 深入浅出WPF教程笔记_XAML介绍
  4. 零基础、一次性通过信息系统项目管理师心得与学习计划
  5. SqlDataReader的用法(重点:访问字段的值)
  6. swf转换mp4 linux,转换FLA文件,以.swf文件在Linux上
  7. python cnn模型_如何在Python中使用预训练的CNN模型
  8. D7000、60D、K5、E5的详细对比评价(转)_我是亲民_新浪博客
  9. 构建病毒宿主关系知识图谱
  10. 将oracle端口1521共享_[转]利用oracle1521端口抓鸡