采用串行总线技术可以使系统的硬件设计大大简化,系统的体积减小,可靠性提高,同时系统更容易更改和扩充

常用的串行扩展总线有:I2c总线,单总线,SPI总线,以及microwire、Plus等等

I2c总线只有两根双向信号线,一根是数据线SDA,另一根是时钟线SCL

I2c总线通过上拉电阻接正电源。因此I2C总线的设备都要接上拉电阻

当总线闲置的时候,两根线均为高电平,连接到总线上的任何一个器件输出的低电平,都将使得总线得到信号变低,及各个器件的SDA和SCL都是线与的关系

每个接入到I2C总线都有唯一的地址,主机与其他器件间的数据传送可以是由主机发送数据到其他器件,这时主机即是发送器,由总线上接收数据的器件称为是接收器。

在多主机系统中,可能同时由几个主机企图启动总线传送数据,为了避免混乱,I2C总线要通过总线仲裁,已决定由哪台主机控制总线

数据位的有效性

I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有时钟线上的信号为低电平期间,数据线上的高电平和低电平状态才允许变化

起始信号和终止信号

SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号,SCL线为高电平期间,SDA线由低电平向高电平变化表示终止信号

数据传送的格式

(1)字节传送与应答

每一个字节必须保证是8位长度,数据传送时,先传送的是最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位,即(一帧共有9位),应答信号由从机发送给主机

每次数据传送总是由主机产生的终止信号结束,但是若主机希望继续占用总线进行新的数据传送,则可以不产生终止信号,马上再次发出起始信号对另一个从机进行寻址

在总线的一个数据传上过程中,可以有一下几种传送方式的组合方式

a,主机向从机发送数据,数据传送的方向在整个传送过程中不变

A表示应答,A非表示非应答,s表示其实信号,p表示终止信号

主机发送地址时,总线上的每一个从机都将这7位地址码与自己的地址进行比较,如果相同,则认为自己正在被主机寻址,根据R/T位将自己确定为发送器或接收器

从机地址由固定部分和可编程部分组成,可编程的部分决定了可接入总线该器件的最大数目。

由操作时序可知要进行必要的延时

起始操作示例代码:

void T2CStart(void)
{
SDA = ;
SomeNop();//大于微秒级别
SCL = ;
SomeNop();
SDA = ;
SomeNop();
}

终止指令:

void I2CStop(void)
{
SDA = ;//data由0变到1为终止指令
SomeNop();
SCL = ;
SomeNop();
SDA = ;
SomeNop();
}

I2C总线扩展

串行E2PROM的扩展

(2)写入过程:AT24CEEPROM的固定地址为1010,A2,A1A0引脚接入高低电平可以得到确定的3位编码,形成的7位编码即为该器件的地址码

单片机进行写操作的时候,首先

发送该器件的7位地址吗和写方向的方向码0,发送完以后释放SDA线并在SCL线上产生第九个时钟信号,被选中的存储器再确认自己的地址后,在SDA上产生一个应答信号作为响应

,单片机接收到信号就可以传送数据了

传送数据时,单片机首先发送一个字节的被写入器件的存储区的首地址,收到存储器器件的应答后,单片机就逐个发送各个数据的字节,但是每次发送一个字节后都要等待应答

收到每个字节的地址后,芯片上的地址会自动加一

写入n个字节的数据格式

读出过程

单片机首先发送该器件的7位地址码和写方向位0(伪写),发送完后释放SDA线并在SCL线上产生9个时钟信号,被选中的存储器器件在确认自己的地址之后,在SDA上产生一个应答信号作为回应

然后在发送一个字节的要读出存储去的首地址,收到应答,单片机要重复一次起始信号并发出器件地址的读方向位(1),收到器件应答就可以读出字节,每次读出一个字节,单片机都要回复一个应答信号,但最后读出一个字节,单片机应返回非应答信号(高电平)并发出终止信号以结束读出操作

示例代码:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int sbit sda = P2^;
sbit scl = P2^;
sbit wp = P2^;
void delay()//微妙级别的延时函数
{;;} void start()//开始信号
{
sda = ;
delay();
scl = ;
delay();
sda = ;
delay();
} void stop()//停止信号
{
sda = ;
delay();
scl = ;
delay();
sda = ;
delay(); } void respons()//应答信号
{
uchar i;
scl = ;
delay();
while((sda ==)&&(i<))//等到第九个时钟周期的时候,还没有变为0,
//那么scl将自动的变为0,表示收到信号
{
i++;
}
scl = ;
} void init()
{
sda = ;
scl = ;//把线全部释放
} void write_byte(uchar date)
{
uchar i,temp;
temp = date;
scl = ;
delay();
for(i = ;i<;i++)//写8次
{
temp = temp<<;//表示将temp左移1位,将最高位移入psw寄存器中的cy位,
//然后将最高位赋值给sda,送走数据
scl = ;//数据稳定了
delay();
sda = CY;
delay(); scl = ;//读走数据
delay();
} sda = ;//注意养成释放总线的习惯
delay();
} uchar read_byte()
{
uchar i,j,k;
scl = ;
delay();
sda = ;//释放数据总线
delay();
for(i=;i<;i++)
{
scl = ;
delay(); j = sda ;//读取数据 k =(k<<)|j;
scl = ;
delay();
}
return k; } 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;
} void write_add(uchar address,uchar date)
{
init();//初始化信号总线和地址总线
start();//启动信号
write_byte(0xa0);//表示写入器件的地址
respons();
write_byte(address);//表示往这个器件内部的第三个地址处写入地址
respons();
write_byte(date);//表示器件内部的数据
respons();
stop();
}
void delay1(uint z)
{
uint x,y;
for(x= z;x>;x--)
for(y=;y>;y--);
} void main()
{
init();
write_add(,);
delay1();
P1=read_add();
while();
}

版权所以转载请注明链接地址:http://www.cnblogs.com/fengdashen/p/3345926.html

I2c串行总线组成及其工作原理的更多相关文章

  1. I2C串行总线标准驱动程序(C51)-万能程序

    #include "reg51.h" #include "intrins.h" unsigned char SystemError; sbit SCL= P1^ ...

  2. SPI、I2C、UART三种串行总线协议的区别和SPI接口介绍(转)

    SPI.I2C.UART三种串行总线协议的区别 第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART( ...

  3. 串行总线 —— I2C、UART、SPI

    I2C,也叫 IIC,是一种常见的串行总线,它只需要两根线即可在连接于总线上的器件之间传送信息. 0. 电气知识 开漏输出:Open drain output,不输出电压,低电平时接地,高电平时不接地 ...

  4. 【转载】IIC SPI UART串行总线

    一.SPISPI(Serial Peripheral Interface,串行外设接口)是Motorola公司提出的一种同步串行数据传输标准,在很多器件中被广泛应用. 接口SPI接口经常被称为4线串行 ...

  5. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU硬件那些事(2.2)- 在串行NOR Flash XIP调试原理

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列EVK在串行NOR Flash调试的原理. 本文是i.MXRT硬件那些事系列第二篇的续集,在第二篇首集 ...

  6. IIC串行总线的组成及其工作原理

    ------------------最近项目上用到了一款美信的DS1308RTC芯片,由于是挂在了Zynq的PS MIO上,需要软件人员协助才能测试:觉得太麻烦了,想通过飞线,然后在Vivado中调用 ...

  7. SPI、I2C、UART三种串行总线协议的区别

    第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART(Universal Asynchronous R ...

  8. 单片微机原理P4:80C51串口与串行总线拓展

    0. 串口通讯 0. 串口通讯的数据传输方式:单工(单向传输数据),半双工(非同时双向传输),全双工(同时,双向传输) 1. 根据通信方式的不同又分为同步通讯和异步通讯. 同步通讯:所有设备都使用同一 ...

  9. EEPROM工作原理透彻详解

    原文链接点击这里 EEPROM(Electrically Erasable Programmable read only memory)即电可擦可编程只读存储器,是一种掉电后数据不丢失(不挥发)存储芯 ...

随机推荐

  1. Ubuntu的挂起和休眠

    Ubuntu的挂起和休眠 之前一直没关注过这方面的信息,因为以前只是在台式机上面用Ubuntu,笔记本一直都是Windows.随着Windows越来越傻冒,最近决定将常用系统转为Ubuntu,才注意到 ...

  2. PAT-乙级-1039. 到底买不买(20)

    1039. 到底买不买(20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 小红想买些珠子做一串自己喜欢的珠串 ...

  3. PAT-乙级-1008. 数组元素循环右移问题 (20)

    1008. 数组元素循环右移问题 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 一个数组A中存有N(N>0)个整数,在不允 ...

  4. hdu 3537 Daizhenyang's Coin 博弈论

    详见:http://www.cnblogs.com/xin-hua/p/3255985.html 约束条件6 代码如下: #include<iostream> #include<st ...

  5. c缺陷与陷阱笔记-第四章 连接

    1.变量的声明. 在不同的源文件中,应该是1个定义+多个声明的形式存在的,并且声明的类型和定义的类型要一样,否则可能会报错. 声明 : extern 类型 变量名 声明并定义: extern 类型 变 ...

  6. Maven中聚合与继承

    何为继承? --›继承为了消除重复,我们把很多相同的配置提取出来 --›例如:grouptId,version等 就像写java程序一样,对于有共性切重复的东西,就提取出来. 如有三个pom.xml配 ...

  7. SSH 远程连接

    ssh远程连接 准备工作: 1 准备两台linux pc 我们一般用的是VMware虚礼软件 2 这两台linux可以互通 3 linux1 :192.168.2.2 这台为你要连接的服务器 linu ...

  8. Yii CActiveForm

    http://blog.sina.com.cn/s/blog_685213e70101mo4i.html 文档: http://www.yiiframework.com/doc/api/1.1/CAc ...

  9. raid之理解

    RAID方案有两种,一种是硬件RAID解决方案,一种是软RAID解决方案. 硬件RAID解决方案 1.RAID 0 RAID 0是最早出现的RAID模式,即Data Stripping数据分条技术.R ...

  10. Java5 并发学习

    在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动.调度.管理线程的一大堆API了.在Java5以后,通过 Executor来启动线程比用Thread的start()更好.在新特征 ...