I2C总线

I2C总线的介绍(这个就是摘抄拉):

I I2 2C C总线( 总线(Inter Integrated Circuit Bus Inter Integrated Circuit Bus):是 ):是Philips Philips公司 公司 推出的串行总线标准(为二线制)。总线上扩展的外围器件及外设接 推出的串行总线标准(为二线制)。总线上扩展的外围器件及外设接 口通过总线寻址,是具备总线仲裁和高低速设备同步等功能的高性能 口通过总线寻址,是具备总线仲裁和高低速设备同步等功能的高性能 多主机总线。 多主机总线。
? ? I I2 2C C总线工作原理 总线工作原理
? ? 串行数据线 串行数据线SDA SDA和串行时钟线 和串行时钟线SCL SCL构成的,可发送和接收数据。 构成的,可发送和接收数据。
? ? 所有挂接在 所有挂接在I I2 2C C总线上的器件和接口电路都应具有 总线上的器件和接口电路都应具有I I2 2C C总线接口,且所 总线接口,且所 有的 有的SDA/SCL SDA/SCL同名端相连。总线上所有器件要依靠 同名端相连。总线上所有器件要依靠SDA SDA发送的地址 发送的地址 信号寻址,不需要片选线。 信号寻址,不需要片选线。
? ? 特点:组成系统结构简单,占用空间小,芯片管脚的数量少,无需片 特点:组成系统结构简单,占用空间小,芯片管脚的数量少,无需片 选信号,价格低。允许若干兼容器件共享总线,应用比较广泛。总线 选信号,价格低。允许若干兼容器件共享总线,应用比较广泛。总线 的长度可达 的长度可达7.6m 7.6m,传送速度可达 ,传送速度可达400kbps 400kbps,标准速率为 ,标准速率为 100kbps 100kbps。支持多个组件。支持多主控器件(某时刻只能有一个主 。支持多个组件。支持多主控器件(某时刻只能有一个主 控器件)。 控器件)。I I2 2C C总线上所有设备的 总线上所有设备的SDA, SCL SDA, SCL引脚必须外接上拉电阻。

单片机很多内部都集成了关于I2C的模块,但是有的并没有,就需要软件的模拟。I2C总线主要两条线SDA 数据线,SCL时钟线。OK,言归正传,说一下I2C咋用。

一个是四种模式(这是对于实际编程所用模块划分):

(1):start :在SCL=1时,保持SDA=1至SDA=0至少4.7us,4个_nop_()就够了,

(2):end   在SCL=1时,保持SDA=0->SDA=1至少 4.7us,同上_nop_()差不多,;

(3):send  除了start和end ,剩下的这两种都是只能在SCL=0的情况下改变SDA的值,传输的过程中保持4us以上,当SCL=1,SDA恒定4us以上。第二个就是应答,每次传输结束后,一般传输用的是一个字节,发送方结束后需要拉高SDA(SDA=1),给出接收方做出应答的机会(呵呵)。

(4):recieve    对于接收的设备,结束时,需要判定要不要给出应答信号,如果继续有传输就给出应答信号(拉低SDA),如果没有就SDA=1,()。

二.控制寄存器:

控制字节
在起始条件之后,必须是器件的控制字节,其中,高四位 为器件类型识别符(不同的芯片类型有不同的定义,E2PROM 为1010),接着三位为片选,最低位为读写控制位,为“1”时为 读操作,为“0”时为写操作。

D3    D2    D1   D0   A2     A1    A0   W/R

前面4位(高四位)就是器件地址,EEPROM(我记得是0xah),这个是可以查到的,许多外部配件都是I2C总线控制,A2~A0,这个是实际地址,具体视电路而为,w0,r1(这是最后一位)

三总结:

最近在弄这个方面所以有了一些心得。

1.应答方面,一定要严格按照要求执行应答机制,因为应答是一个结束还是重新开始的判断。

2.

发送::::start-->(发送地址)-->控制字节--->send;                   接收:  ;start-->地址--->给出控制字节---->start-->地址--->接收

3.好吧还是上程序我不是很会说(这个是将PCF8591用于转换电压,然后转换数据用一排二极管显示)。

如果有人很想学,有正好看到我的这个杂文,我建议你多注意那个延时nops(),他的位置,还有应答的机制,这个往往决定你能不能好好运行,不好理解可以换成串口显示,比较容易

#include <reg52.h>
#include <intrins.h>
#define nops() do {_nop_();_nop_();_nop_();_nop_();}while(0);
unsigned char LSAVE=0x90;
sbit SDA=P2^0;
sbit SCL=P2^1;
sbit DS1302 = P2^4;
sbit WE=P2^7;
sbit DU=P2^6;//共阴LED
//函数声明
bit ACK();
void doACK(bit b);
void LEDstart();
void LEDend();
unsigned char Recieve();
void Senddata(unsigned char y);
void doACK(bit b){      //判断应答
if(b){
SDA=0;
SCL=1;
nops();
}
else
{ SDA=1;
SCL=1;
nops();
}
SCL=0;
}
bit ACK(){
SCL=1;
SDA=1;
nops();
if(SDA)
{
SCL=0;
LEDend();
return 1;
}
else{
SCL=0;
return 0;
}

}
void LEDstart(){
SDA=1;
SCL=1;
nops();
SDA=0;
nops();
SCL=0;
}

void LEDend(){
SDA=0;
SCL=1;
nops();
SDA=1;
nops();
SDA=0;
}

unsigned char Recieve(){
unsigned char i,dee;
dee=0x00;
for(i=0;i<8;i++){
dee<<=1;
dee|=(unsigned char)SDA;
SCL=1;
nops();
SCL=0;
}
return dee;
}
void Senddata(unsigned char y){
unsigned char i;
for(i=0;i<8;i++){
if (y & 0x80)
SDA = 1;
else
SDA = 0;
SCL=1;
y<<=1;
nops();
SCL=0;
}
}
bit ADdata(unsigned char com,unsigned char *dat){ //AD的关键调用函数
unsigned char dee;
LEDstart();
Senddata(LSAVE);//发送数值之后就要给定回应否则没办法继续下去
if(ACK())
return 1;
Senddata(com);
if(ACK())
return 1;
LEDstart();
Senddata(LSAVE+1);
if(ACK())
return 1;
dee=Recieve();
 doACK(0);//必须要不给回应
LEDend();
nops();
*dat=dee;

}

void Serial(){//串口寄存器初始化
SCON=0x50;
PCON=0x00;
TMOD=0x20;
TL1=0xfd;
TH1=0xfd;
TR1=1;
}

void send(unsigned char ans){//传输
SBUF=ans;
while(TI==0);
TI=0;

}
void main(){

unsigned char i=0;
unsigned char ans=0;
//Serial();
DS1302 = 0;
while(1){
i=ans;//记住ans值做判断
ADdata(0x42,&ans);//获得新的ans值
if(i!=ans)//如果ans值改变时才能改变P1的值
P1=ans;

}
}

时间: 2024-10-31 02:11:08

I2C总线的相关文章

I2C总线介绍及AT24C02驱动编写 笔记

中断处理程序 { 清除中断 硬件自动清除 软件清除 } CPU芯片手册相关章节 -------- I2C CPU外接设备的方式 1)GPIO简洁的方式(按键,LED) 通过设置GPIO管脚的状态来完成通信(控制) gpccon gpcpud gpcdat 2)类似于内存的接口 (DDRAM norflash nand dm9000) 从硬件上看CPU和芯片 数据线 地址先  BANK 3)协议类接口 uart I2C AT24C02    EEPROM 3,如何解决CPU和设备通信的问题 I2C

I2C总线协议学习笔记 (转载)

1.I2C协议   2条双向串行线,一条数据线SDA,一条时钟线SCL.   SDA传输数据是大端传输,每次传输8bit,即一字节.   支持多主控(multimastering),任何时间点只能有一个主控.   总线上每个设备都有自己的一个addr,共7个bit,广播地址全0.   系统中可能有多个同种芯片,为此addr分为固定部分和可编程部份,细节视芯片而定,看datasheet. 1.1 I2C位传输   数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit: 

I2C总线介绍

1. 简介 I2C, Inter-Integrated Circuit, 是一种串行通信总线,用于连接微控制器及其外围设备它是一种两线式串行总线(串行数据:SDA; 串行时钟频率:SCL), 利用电阻将电位上拉, 典型的电压准位为+3.3V或+5V使用多主从架构, 主机是初始化总线的数据传输并产生允许传输的时钟信号的器件, 任何被寻址的器件都被认为是从机每个器件都有一个唯一的地址识别(共7个bit, 包括主机和从机), 而且都可以作为一个发送器或接收器(由器件的功能决定) 常见的应用如下:- 存

[I2C]I2C总线协议图解

转自:http://blog.csdn.net/w89436838/article/details/38660631 1  I2C总线物理拓扑结构      I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成.通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递.在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平. 2  I2C总线特征 I2C总线上的每一个设备都可以作为主设备或者从设备

17、I2C总线和CAT24WCxx存储器

1.I2C串行总线概述 I2C总线是PHLIPS公司推出的一种串行总线,是具备多主机系统所需的总线裁决和高低速器件同步功能的高性能串行总线.I2C总线只有两根双向信号线.一根是数据线SDA,另一根是时钟线SCL. 2.I2C总线通过上拉电阻接正电源.当总线空闲时,两根线均为高电平.连到总线上的任一器件输出的低电平,都将使总线的信号变低,即各器件的SDA及SCL都是线“与”关系. 3.每个接到I2C总线上的器件都有唯一的地址.主机与其它器件间的数据传送可以是由主机发送数据到其它器件,这时主机即为发

(2)I2c总线SDA\SCL以及开始终止条件

I2C只用两条线(SDA和SCL)在连接到总线上的设备之间传送数据.每一个设备都由唯一的地址来识别(不管是微处理器.LCD驱动器.存储器或者键盘接口),并且可以依照设备的功能作为发送器或者接收器使用.LCD驱动器可能只是个接收器,而存储器可以发送和接受数据.除了发送器和接收器,当传送数据时设备还可以作为主机或者从机.主机就是初始化数据传输和产生时钟信号的设备,在那个时刻,任何被寻址的设备都是从机.        I2C总线是一个多主机总线.意味着可以连接多个可以控制总线的设备到总线上.主机通常是

(3)I2C总线的字节格式,时钟同步和仲裁

字节格式 发送到SDA线上的每个字节必须是8位.每次传输的字节数量是不受限制的.每个字节后必须跟着一个ACK应答位.数据从最高有效位(MSB)开始传输.如果从机要执行一些功能后才能接收或者发送新的完整数据,比如说服务一个内部中断,那么它可以将时钟线SCL拉低来强制使主机进入wait状态.当从机准备好新的字节数据传输时,释放时钟线SCL,数据传输便继续进行. ACK和NACK 每个字节后都有ACK发生.ACK应答位允许接收器通知发送器字节成功接收了下一个字节可以发送了.主机产生所有的时钟脉冲,包括

(5)I2C总线的10bit地址以及通用广播地址

其实,10bit地址我没用过,通用广播地址更没用过.通用广播地址应该是在多个mcu之间用i2c进行通信时使用的.虽说没用到,但还是做了翻译,说不定以后有机会用到: 10bit地址 10bit的寻址扩展可能寻址的数目.有7bit地址和10bit地址的设备可以连接到相同的I2C总线上,而且7bit寻址和10bit寻址都可以用在所有的总线速度模式下.不过,10bit寻址用的不多. 10bit的从机地址由开始条件(S)或重复开始条件(Sr)后的两个字节组成.第一个字节的前7位是1111 0XX,XX是1

(4)I2C总线的7bit从机地址

时钟拉伸(Clock stretching)clock stretching通过将SCL线拉低来暂停一个传输.直到释放SCL线为高电平,传输才继续进行.clock stretching是可选的,实际上大多数从设备不包括SCL驱动,所以它们不能stretch时钟.从字节级来看,一个设备可能在快速模式下接受数据,但是需要更多的时间来存储接收到的字节或者准备将要传输的另一个字节.从机可以以一种握手的处理方式在接受和应答字节后将SCL线拉低来强制使得主机进入wait状态知道从机准备好下一个字节的传输.从

ADXL345经验总结,采用SPI和I2C总线操作

一. ADXL345简介 ADXL345是ADI公司推出的三轴(x,y,z)iMEMS数字加速度计(digital accelerometer),具有在16G下高分辨率(13Bit)测量能力,同时具备16Bit数字输出.ADXL345 适用于静态倾角测量以及动态加速度测量,高达4mg/LSB的灵敏度允许测量小于1度的倾角. 该传感器还具备单击 /双击探测,自由落体探测,并允许用户设置一个加速度阀值,当加速度值超过设定阀值后可以产生一个信号输出.所有这些功能都可以映射到2个中断上.内置的32级FI