IIC 概述之3

为了加深对I2C总线的理解,用C语言模拟IIC总线,边看源代码边读波形:

如下图所示的写操作的时序图:

读时序的理解同理。对于时序不理解的朋友请参考“I2C总线之(二)---时序

完整的程序如下:

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define write_ADD 0xa0
#define read_ADD 0xa1
uchar a;
sbit SDA=P2^0;
sbit SCL=P2^1;
void SomeNop();     //短延时
void init();    //初始化
void check_ACK(void);
void I2CStart(void);
void I2cStop(void);
void write_byte(uchar dat);//写字节
void delay(uint z);
uchar read_byte();     //读字节
void write(uchar addr,uchar dat);  //指定地址写
uchar read(uchar addr);       //指定地址读
bit flag;  //应答标志位
void main()
{
    init();
    write_add(5,0xaa); //向地址5写入0xaa
    delay(10);      //延时,否则被坑呀!!!
     P1=read_add(5);      //读取地址5的值
     while(1);    }

//***************************************************************************
void delay()//简单延时函数
{ ;; }
//***************************************************************************
void start()  //开始信号 SCL在高电平期间,SDA一个下降沿则表示启动信号
{
    sda=1; //释放SDA总线
    delay();
    scl=1;
    delay();
    sda=0;
    delay();
}
//***************************************************************************
void stop()   //停止 SCL在高电平期间,SDA一个上升沿则表示停止信号
{
    sda=0;
    delay();
    scl=1;
    delay();
    sda=1;
    delay();
}
//***************************************************************************
void respons()  //应答 SCL在高电平期间,SDA被从设备拉为低电平表示应答
{
    uchar i;
    scl=1;
    delay();
    //至多等待250个CPU时钟周期
    while((sda==1)&&(i<250))i++;
    scl=0;
    delay();
}
//***************************************************************************
void init()//总线初始化 将总线都拉高一释放总线  发送启动信号前,要先初始化总线。即总有检测到总线空闲才开始发送启动信号
{
    sda=1;
    delay();
    scl=1;
    delay();
}
//***************************************************************************
void write_byte(uchar date) //写一个字节
{
    uchar i,temp;
    temp=date;  

    for(i=0;i<8;i++)
    {
        temp=temp<<1;
        scl=0;//拉低SCL,因为只有在时钟信号为低电平期间按数据线上的高低电平状态才允许变化;并在此时和上一个循环的scl=1一起形成一个上升沿
        delay();
        sda=CY;
        delay();
        scl=1;//拉高SCL,此时SDA上的数据稳定
        delay();
    }
    scl=0;//拉低SCL,为下次数据传输做好准备
    delay();
    sda=1;//释放SDA总线,接下来由从设备控制,比如从设备接收完数据后,在SCL为高时,拉低SDA作为应答信号
    delay();
}
//***************************************************************************
uchar read_byte()//读一个字节
{
    uchar i,k;
    scl=0;
    delay();
    sda=1;
    delay();
    for(i=0;i<8;i++)
    {
        scl=1;//上升沿时,IIC设备将数据放在sda线上,并在高电平期间数据已经稳定,可以接收啦
        delay();
        k=(k<<1)|sda;
        scl=0;//拉低SCL,使发送端可以把数据放在SDA上
        delay();
    }
    return k;
}
//***************************************************************************
void write_add(uchar address,uchar date)//任意地址写一个字节
{
    start();//启动
    write_byte(0xa0);//发送从设备地址
    respons();//等待从设备的响应
    write_byte(address);//发出芯片内地址
    respons();//等待从设备的响应
    write_byte(date);//发送数据
    respons();//等待从设备的响应
    stop();//停止
}
//***************************************************************************
uchar read_add(uchar address)//读取一个字节
{
    uchar date;
    start();//启动
    write_byte(0xa0);//发送发送从设备地址 写操作
    respons();//等待从设备的响应
    write_byte(address);//发送芯片内地址
    respons();//等待从设备的响应
    start();//启动
    write_byte(0xa1);//发送发送从设备地址 读操作
    respons();//等待从设备的响应
    date=read_byte();//获取数据
    stop();//停止
    return date;//返回数据
}

时间: 2024-10-05 23:25:27

IIC 概述之3的相关文章

IIC 概述之2

一.协议 1.空闲状态 I2C总线总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态.此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高. 2.起始位与停止位的定义: 起始信号:当SCL为高期间,SDA由高到低的跳变:启动信号是一种电平跳变时序信号,而不是一个电平信号. 停止信号:当SCL为高期间,SDA由低到高的跳变:停止信号也是一种电平跳变时序信号,而不是一个电平信号. 3.ACK 发送器每发送一个字节,就在时钟脉冲9期间释放数据线

IIC 概述之1

概述: I²C 是Inter-Integrated Circuit的缩写,发音为"eye-squared cee" or "eye-two-cee" , 它是一种两线接口. I²C 只是用两条双向的线,一条 Serial Data Line (SDA) ,另一条Serial Clock (SCL). SCL:上升沿将数据输入到每个EEPROM器件中:下降沿驱动EEPROM器件输出数据.(边沿触发) SDA:双向数据线,为OD门,与其它任意数量的OD与OC门成&quo

IIC 概述之24c系列存储器内存分析

IIC 型号     容量      器件/业面寻址字节                   可寻址位       模块 24C01   128B      (1010)(A2)(A1)(A0)(0或1)     3            128B24C02   256B      (1010)(A2)(A1)(A0)(0或1)     3            256B24C04   512B      (1010)(A2)(A1)(P0)(0或1)     2            2X25

IIC 概述之源码仿真

7.1.1 I2C总线简介 1.I2C总线的基本结构 I2C总线由数据线SDA和时钟线SCL构成,每条线都通过上拉电阻接向正电源,所有采用I2C接口标准的器件均并行挂接在总线上,如图7-1所示. I2C总线通常采用主从工作方式,整个系统中只有一个主控器件(单片机),其它器件都是具有I2C总线接口的外围从器件.每个I2C器件都具有唯一的地址,单片机作为主控器件,可以按器件地址访问每个器件,还可以按器件单元地址访问每个器件中的每个指定的存储单元. 图7-1 I2C总线系统硬件结构框图 由于I2C总线

SHT20 IIC总线驱动概述

SHT20温湿度传感器使用iic总线的驱动方式,以下资料参考SHT20 datasheet总结 1.IIC总线 Start信号 IIC总线的起始信号以SDA由高电平变为低电平,等待5us以上,再由SCL从高电平变低电平,发出起始信号,图示如下所示: 注意:两根线由高变低的间隔时间大于4.7us,建议延时15us example: void IIC_Start(void) { GpioWrite(&SDA, 1); GpioWrite(&SCL, 1); //todo :delay 15us

IIC总线协议

 II2C C总线的简单的概述 1.( 总线(Inter Integrated Circuit Bus Inter Integrated Circuit Bus):是 ):是Philips Philips公司 公司 推出的串行总线标准(为二线制).总线上扩展的外围器件及外设接 推出的串行总线标准(为二线制). 2.总线上扩展的外围器件及外设接 口通过总线寻址,是具备总线仲裁和高低速设备同步等功能的高性能 口通过总线寻址,是具备总线仲裁和高低速设备同步等功能的高性能 多主机总线. 3.特点:组成系

扒一扒ZYNQ里面缩写 及 Xilinx ZYNQ-7000概述

文章转载自 http://www.eefocus.com/Kevin/blog/11-08/228643_42a39.html kevin是xilinx的大牛,必须膜拜啊. 还引自http://blog.sina.com.cn/s/blog_6cb263210101g8lv.html 摘要:本文介绍与XILINX的EPP平台成员, ZYNQ芯片相关的缩写术语和含义.  与简单翻译术语不同,本文对每个缩写在本行业其他公司的展开含义也略作介绍, 避免混淆. 对术语的技术功能也作简单介绍. 8月份学校

协议之常见显示接口概述

1.IIC 2.SPI 3.8080/8600 4.RGB接口 5.MIPI_DSI 6.TFT接口 7.MCU工作特点 1.IIC I2C总线,是Inter-Integrated Circuit的缩写.INTER-IC意思是用于相互作用的集成电路,这种集成电路主要由双向串行时钟线SCL和双向串行数据线SDA两条线路组成. I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的,包括总线裁决和高低速器件同步功能的高性能串行总线. I2C总线只有两根双向信号线.一根是数据线SDA,

IIC学习(一)

1.概述 IIC,即Inter-Integrated Circuit(集成电路总线),它是同步通信的一种特殊形式,具有接口线少,控制方式简化,器件封装形式小,通信速率较高等优点. I2C 总线 包括一条数据线(SDA)和一条时钟线(SCL).协议允许总线接入多个器件,并支持多主工作.总线中的器件既可以作为主控器也可以作为被控器,既可以是 发送器也可以是接收器.总线按照一定的通信协议进行数据交换.在每次数据交换开始,作为主控器的器件需要通过总线竞争获得主控权,并启动一次数据交换.系 统中各个器件都