模拟IIC协议时序

IIC是飞利浦公司开发的两线式串行总线,主要应用在单片机和外围电子器件之间的数据通讯。

IIC总线优点是节约总线数,稳定,快速,是目前芯片制造上非常流行的一种总线,大多数单片机已经片内集成了IIC总线接口,无需用户自己模拟,只需配置相关寄存器即可使用,但是,为了更好地理解IIC总线协议,可以自行按照IIC时序图进行模拟,加深理解。

IIC总线有两条串行线,其一是时钟线SCK,其二是数据线SDA。

在寻常的应用之中,单片机常常作为主机,外围器件作为从机使用。

每一个从机器件都拥有唯一的一个地址,这个地址在芯片手册上会有详细的介绍,一般还需要自行配置芯片管脚上的高低电平,来实现确定从机地址的目的。

硬件设计上,SCK线和SDA线通过典型的4.7K电阻进行上拉,保证两条线空闲时保持高电平状态。

SDA上的数据在SCK高电平期间必须稳定,SDA上的数据在SCK期间才可以被更改。

IIC总线的时序分析:

起始信号:在SCK高电平期间,SDA一个下降沿,即构成了IIC的起始信号。

终止信号:在SCK高电平期间,SDA一个上升沿,即构成了IIC的终止信号。

程序上的模拟如下所示:

1->IIC起始信号模拟程序:

 1 void IIC_start(void)
 2 {
 3     SCK=1;
 4     SDA=1;
 5     IIC_delay();
 6     SDA=0;
 7     IIC_delay();
 8     SCK=0;
 9     IIC_delay();
10 }

2->IIC终止信号模拟程序:

 1 void IIC_end(void)
 2 {
 3     SCK=0;
 4     SDA=0;
 5     IIC_delay();
 6     SCK=1;
 7     IIC_delay();
 8     SDA=1;
 9     IIC_delay();
10 }

IIC发送数据:
在IIC一次发送8位数据,数据发送时,总是高位在前,分8次传送出去。

IIC发送数据模拟程序:

 1 void IIC_write(unsigned char dat)
 2 {
 3     unsigned char temp;
 4     for(temp=0x80;temp!=0;temp>>=1)
 5     {
 6             if(temp&dat==0)
 7             {
 8                         SDA=0;
 9             }
10             else
11             {
12                         SDA=1;
13             }
14             IIC_delay();
15             SCK=1;
16             IIC_delay();
17             SCK=0;
18     }
19 }

IIC接收应答模拟程序:

 1 bit Get_IIC_ack(void)
 2 {
 3         bit ack;
 4         SDA=1;        //释放数据线,准备接收应答
 5         SCK=1;
 6         if(SDA==1)
 7         {
 8                 ack=0;//无应答信号
 9         }
10         else
11         {
12                 ack=1;//有应答信号
13         }
14         SCK=0;
15         IIC_delay();
16         return ack;
17 }

IIC读取数据模拟程序:

 1 unsigned char IIC_Read(void)
 2 {
 3         unsigned char temp;
 4         unsigned char dat;
 5         SDA=1; //释放总线准备接收
 6         for(temp=0x80;temp!=0;temp>>=1)
 7         {
 8                 IIC_delay();
 9                 SCK=1;
10                 if(SDA==1)
11                 {
12                         dat|=temp;
13                 }
14                 else
15                 {
16                         dat&=~temp;
17                 }
18                 SCK=0;
19         }
20         return dat;
21 }

IIC非应答信号模拟程序:

void IIC_No_ack(void)
{
        SDA=1;
        SCK=1;
        IIC_delay();
        SCK=0;
        IIC_delay();
}

IIC应答信号模拟程序:

void IIC_ack(void)
{
        SDA=0;
        SCK=1;
        IIC_delay();
        SCK=0;
        IIC_delay();
}
时间: 2024-10-17 06:29:14

模拟IIC协议时序的相关文章

模拟SPI协议时序

SPI是串行外设接口总线,摩托罗拉公司开发的一种全双工,同步通信总线,有四线制和三线制. 在单片机系统应用中,单片机常常是被用来当做主机(MASTER),外围器件被当做从机(SLAVE). 所以,在以下的介绍中,都是默认单片机是主机模式进行说明的. SPI总线相对于IIC总线,无总裁机制,无应答机制. SPI常用的四线制分别是,MISO(主入从出).MOSI(主出从入).SCK(同步时钟线).CS(片选线,也有是NSS). 主从机之间典型的接线方式如下所示: 按照时钟线的时钟极性(CPOL)和相

IIC协议解释(转)

IIC协议解释 推荐资源: http://m.elecfans.com/article/574049.html       and       https://blog.csdn.net/firefly_cjd/article/details/51921129  (动态图讲解) (1)概述 I2C(Inter-Integrated Circuit BUS) 集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有

stm32软件模拟IIC读取PX4FLOW光流传感器数据

这段时间在做全国光电设计大赛,用到了px4的px4flow光流传感器,用软件模拟iic读取数据不定期会导致px4flow死机,查了资料和光流的源码,发现这个光流用了stm32的硬件iic,所以对软件模拟iic的时序要求可能更高一点所以在原子哥的iic程序上做了修改,代码测验后已经不会死机,做个笔记,保存一下. 1 #include "myiic.h" 2 #include "delay.h" 15 16 //初始化IIC 17 void IIC_Init(void)

单片机模拟 IIC 总线与 EEPROM(AT24C02)通信

数据有效性: 起始和终止信号时序: 设备地址: 写字节时序: 读数据时序: 函数模拟 IIC 总线 时序: /**************************************/ /******模拟I2C总线操作函数*************/ /**************************************/ //延时函数 void Delay() { ; ; } //初始化 void I2C_Init() { SDA = 1; SCL = 1; } //起始信号 vo

FPGA基础设计(四):IIC协议

很多数字传感器.数字控制的芯片(DDS.串行ADC.串行DAC)都是通过IIC总线来和控制器通信的.不过IIC协议仍然是一种慢速的通信方式,标准IIC速率为100kbit/s,快速模式速率为400kbit/s.本文致力于讲述如何用计数器控制和分频时钟控制两种方式完成IIC的读写操作. IIC协议 ??IIC协议是一种多机通讯,由SDA数据线和SCL时钟线构成串行总线,所有的IIC设备都可以挂载到总线上,但每个设备都有唯一的设备读地址和设备写地址.在使用IIC作为数字接口的芯片datasheet中

模拟I2C协议学习点滴之原理框架

I2C是一种串行总线协议. 目前几种常用的串行总线有UART.SPI和I2C协议.UART协议的总线只有两条,发送(Transmit:TX)和接收(Receive:RX),没有时钟信号,这就要求两位数据的间隔要相同,它传送数据有严格的规定,每个数据以相同的位串形式传送,每个位串由起始位.数据位.奇偶位校验和停止位组成.SPI有三线和四线模式,四条总线分别为SCLK(时钟).MISO(主器件数据输入,从器件数据输出).MOSI(主器件数据输出,从器件数据输入).SS(从器件使能信号),SPI总线由

用s5pc100的GPIO模拟IIC

转载:http://blog.chinaunix.net/uid-26833883-id-3823530.html 一.硬件连线 先来看看LM75硬件的上的连线: 其中I2C_SDA0是数据线,I2C_SCL0是时钟线,它们分别接到s5pc100的GPD3和GPD4,如下图所示 在模拟IIC的时候,用GPD3引脚发送数据或读取数据,用GPD4引脚提供时钟信号即可. 二.数据结构 由于s5pc100的GPD这一组的引脚很多,不好单独对其中的某一个引脚操作,为了能单独对其中的某一个管脚单独操作,这里

IIC协议理解(转)

目录 IIC协议理解(转) 个人小结记录 (记一下这个就够了) 以下为转载记录 概述 概述 输出级 主设备与从设备 速率 时序 空闲状态 起始位与停止位 数据的有效性 数据的传送 工作过程 主设备向从设备发送数据 主控器读取数据的过程 以C语言理解IIC title: IIC协议理解(转) date: 2019/1/28 17:50:13 toc: true --- IIC协议理解(转) 原文地址 https://www.cnblogs.com/BitArt/archive/2013/05/28

用IO模拟串口协议发送数据

<pre name="code" class="cpp">//文件usend.h #ifndef _USEND_H_ #define _USEND_H_ //====红外接收相关定义============================= #define PuTx_High (P_uTx = 1) //数据高 #define PuTx_Low (P_uTx = 0) //数据低 #define V_SendDatNum 6//6 //发送数据字节数 /