0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

IIC通信的基础知识

天才小狸花 来源:Sigle_chip 作者:Sigle_chip 2022-09-27 11:51 次阅读

[]()# IIC概述

IIC:两线式串行总线,它是由__数据线SDA__和__时钟线__SCL构成的串行总线,可发送和接收数据,其使用IO使用较少,

CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbs以上。

时钟线SCL:在通信过程起到控制作用。

数据线SDA:用来一位一位的传送数据。

IIC分为软件IIC和硬件IIC

软件IIC:软件IIC通信指的是用单片机的两个I/O端口模拟出来的IIC,用软件控制管脚状态以模拟I2C通信波形,软件模拟寄存器的工作方式。

硬件IIC:一块硬件电路,硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,硬件(固件)I2C是直接调用内部寄存器进行配置。

补充

1.硬件I2C的效率要远高于软件的,而软件I2C由于不受管脚限制,接口比较灵活。

2.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由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。

1664250641991qfvkns4ev8

开始信号程序

fig:

//产生IIC起始信号

//1.设置SDA输出

//2.先拉高SDA,再拉高SCL,空闲状态

//3.拉低SDA

//4.准备接收数据

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总线,准备发送或接收数据

}

停止信号程序

//产生IIC停止信号

//1.设置SDA输出

//2.先拉低SDA,再拉低SCL

//3.拉高SCL

//4.拉高SDA

//5.停止接收数据

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期间释放数据先,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间位稳定的低电平。如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P

每当主机向从机发送完一个字节的数据,主机总是需要等待从机给出一个应答信号,以确认从机是否成功接收到了数据,从机应答主机所需要的时钟仍是主机提供的,应答出现在每一次主机完成8个数据位传输后紧跟着的时钟周期,低电平0表示应答,1表示非应答:

1664250642744w7p9acoced

应答信号程序

//产生ACK应答

//这里就很清楚了,产生应答:SCL在SDA一直为低电平期间完成低高电平转换

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应答,购买正品元器件,上唯样商城

//这里就很清楚了,不产生应答:SCL在SDA一直为高电平期间完成低高电平转换

void IIC_NAck(void)

{

IIC_SCL=0;

SDA_OUT();

IIC_SDA=1;

delay_us(2);

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

}

[]()### 发送数据

在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_Send_Byte(u8 txd)

{

u8 t;

SDA_OUT();

IIC_SCL=0;//拉低时钟开始数据传输

for(t=0;t<8;t++)

{

//IIC_SDA=(txd&0x80)>>7;

//获取数据的最高位,然后左移7位

//如果某位为1,则SDA为1,否则相反

if((txd&0x80)>>7)

IIC_SDA=1;

else

IIC_SDA=0;

txd<<=1;

delay_us(2); //对TEA5767这三个延时都是必须的

IIC_SCL=1;

delay_us(2);

IIC_SCL=0;

delay_us(2);

}

}

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

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

//等待应答信号到来

//返回值:1,接收应答失败

// 0,接收应答成功

//1.设置SDA为输入

//2.拉高SDA

//3.拉高SCL

//4.等待接收器返回应答信号,如果数据线SDA一直为高,就一直等待,并返回1(无效应答),如果数据线SDA为低,返回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)

{

ucErrTime++;

if(ucErrTime>250)

{

IIC_Stop();

return 1;

}

}

IIC_SCL=0;//时钟输出0

return 0;

}

[]()### 接收数据

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

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK

//先拉低SCL,延时后拉高

//读取数据

//是否发送应答

u8 IIC_Read_Byte(unsigned char ack)

{

unsigned char i,receive=0;

SDA_IN();//SDA设置为输入

for(i=0;i<8;i++ )

{

    IIC_SCL=0; 

    delay_us(2);

    IIC_SCL=1;

    receive<<=1;

    if(READ_SDA)receive++;   

    delay_us(1); 

}                     

if (!ack)

    IIC_NAck();//发送nACK

else

    IIC_Ack(); //发送ACK   

return receive;

}

[]()

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6032

    文章

    44513

    浏览量

    632840
  • 总线
    +关注

    关注

    10

    文章

    2866

    浏览量

    87976
  • IIC
    IIC
    +关注

    关注

    11

    文章

    300

    浏览量

    38269
收藏 人收藏

    评论

    相关推荐

    通信技术基础知识介绍

    通信技术基础知识介绍 电信网(telecommunication network)是构成多个用户相互通信的多个电信系统互连的通信体系,是人类实现远距离
    发表于 02-23 16:25 1.5w次阅读

    移动通信基站基础知识 PDF文档

    移动通信基站基础知识 PDF文档下载附件:
    发表于 02-18 09:29

    电子通信技术基础知识

    电子通信技术基础知识
    发表于 08-20 09:58

    移动通信基础知识

    本帖最后由 南海孤雁 于 2012-12-7 12:43 编辑 移动通信基础知识视频监控系统发展。
    发表于 12-07 12:35

    无线通信基础知识介绍

    无线通信基础知识
    发表于 02-04 06:57

    串行通信基础知识与UART驱动构件使用方法

    慕课苏州大学.嵌入式开发及应用.第二章.入门与软件框架.串行通信基础知识与UART驱动构件使用方法0 目录2 入门与软件框架2.1 串行通信基础知识与UART驱动构件使用方法2.1.1
    发表于 12-20 06:21

    STM32 IIC和USART接口的基础知识点汇总,绝对实用

    STM32 IIC和USART接口的基础知识点汇总,绝对实用
    发表于 02-22 08:00

    IIC通信原理及分析IIC的真实波形

    IIC通信原理。1 IIC基础知识首先复习一下IIC基础知识,这部分看不懂的请先带着疑问,然后
    发表于 02-24 06:01

    通信基础知识教程

    通信基础知识 1、电信基础知识2、通信电源技术3、配线设备结构、原理与防护4、防雷基础知识5、EMC
    发表于 03-04 16:48 33次下载

    电子通信技术基础知识

    通信技术基础知识电信网(telecommunication network)是构成多个用户相互通信的多个电信系统互连的通信体系,是人类实现远距离通信
    发表于 07-19 17:31 46次下载

    单片机基础知识学习笔记

    单片机基础知识学习笔记有关总线1.IIC总线2.SPI总线
    发表于 11-14 16:51 26次下载
    单片机<b class='flag-5'>基础知识</b>学习笔记

    IIC实测波形入手,搞懂IIC通信

    IIC通信原理。1 IIC基础知识首先复习一下IIC基础知识,这部分看不懂的请先带着疑问,然后
    发表于 01-12 17:35 9次下载
    从<b class='flag-5'>IIC</b>实测波形入手,搞懂<b class='flag-5'>IIC</b><b class='flag-5'>通信</b>

    [转]从IIC实测波形入手,搞懂IIC通信

    IIC通信原理。1 IIC基础知识首先复习一下IIC基础知识,这部分看不懂的请先带着疑问,然后
    发表于 01-12 17:59 17次下载
    [转]从<b class='flag-5'>IIC</b>实测波形入手,搞懂<b class='flag-5'>IIC</b><b class='flag-5'>通信</b>

    一文深入理解IIC通信基础知识

    玩单片机的朋友都知道IIC通信这个工具,但好多人只是会用,内部的原理不求甚解,或是想要了解其原理,但却对抽象的时序描述一头雾水。本文将从实测的IIC波形入手,带你看到真实的IIC样子,
    的头像 发表于 06-08 09:06 2.1w次阅读
    一文深入理解<b class='flag-5'>IIC</b><b class='flag-5'>通信</b><b class='flag-5'>基础知识</b>

    光纤通信技术基础知识

    电子发烧友网站提供《光纤通信技术基础知识.ppt》资料免费下载
    发表于 03-06 15:53 0次下载