三防平板电脑有线通信接口电路设计(内部集成电路串行总线通信)
时间:2024-07-08 作者:乐凡信息 浏览:152

三防平板电脑内部集成电路串行总线(Inter Integrate Circuit,I2C)是Philips公司设计推出的一种多主双向的串行总线,采用两根连线实现全双工同步数据传送,可以很方便地通过扩展外围器件构成串行总线系统。随着众多支持I2C总线的集成器件出现,I2C总线极大地缩短了系统设计人员和器件提供商对新产品的设计周期。使用I2C总线,可以直接与具有I2C总线接口的控制器和各种外围器件进行双向八位二进制同步串行通信,如三防平板电脑嵌入式微处理器、存储器、A/D转换器、D/A转换器、键盘、LCD控制器和智能传感器等。



图1 单路测量温度主函数流程图



图2 多路测量温度主函数流程图

三防平板电脑I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片引脚的数量,降低了互连成本。总线的长度可高达25英尺(1英尺≈0.3048 m),并且能够以100 kbps的最大传输速率支持40个组件。I2C总线的另一个优点是支持多主控,其中任何能够进行发送和接收的设备都可以成为主设备。一个主设备能够控制信号的传输和时钟频率,但是在系统任何时间点上只能有一个主设备。

1.三防平板电脑性能与工作原理

I2C总线通信方式具有低成本、易实现、中速(标准总线可达100 kbps,扩展总线可达400 kbps)的特点。I2C总线的2.1版本使用的电源电压低至2 V,传输速率可达3.4 Mbps。I2C使用两条连线,其中串行数据线(SDL/SDA)用于数据传送,串行时钟线(SCL/SCK)用于指示什么时候数据线上是有效数据。

I2C 总线可以工作在全双工通信模式,其规范并未限制总线的长度,但其总负载电容需要保持在400 pF以下。I2C总线通信有主传送模

式、主接收模式、从传送模式和从接收模式四种操作模式。其中的I2C主设备负责发出时钟信号、地址信号和控制信号,选择通信的I2C从设备和控制收发。每个I2C设备都有一个唯一的7位地址(扩展方式为10位),便于主设备访问。正常情况下,I2C总线上的所有从设备被设置为高阻状态,而主设备保持在高电平,表示处于空闲状态。在网络中,每个设备都可以作为发送器和接收器。在主从通信中,可以有多个I2C总线器件同时接到总线上,通过地址来识别通信对象,并且I2C总线还可以是多主系统,任何一个设备都可以为I2C总线的主设备,但是在任一时刻只能有一个I2C主设备。I2C总线具有总线仲裁功能,可保证系统正确运行。

在应用时应注意,I2C总线上设备的串行时钟线和串行数据线都使用集电极开路/漏极开路接口,因此在串行时钟线和串行数据线上都必须连接上拉电阻。

总之,三防平板电脑在任何模式下使用I2C总线通信方式都必须遵循以下三点:

● 每个设备必须具有I2C总线接口功能或使用I/O模拟完成功能;

● 各个设备必须共地;

● 两个信号线必须接入上拉电阻。

I2C总线设备的连接示意图如图3所示。



图3 I2C总线设备的连接示意图

三防平板电脑I2C总线通信方式不规定使用电压的高低,因此双极型TTL器件或单极型MOS器件都能够连接到总线上。但总线信号均使用集电极开路/漏极开路,通过上拉电阻保持信号的默认状态为高电平。上拉电阻的大小由电源电压和总线传输速度决定,对于VCC=+5 V电源电压,低速100 kHz一般采用10 kΩ 的上拉电阻,标准速率400 kHz一般采用2 kΩ 的上拉电阻。

当“0”被传送时,每一条总线的晶体管用于下拉该信号。集电极开路/漏极开路信号允许一些设备同时写总线而不会引起电路的故障,网络中的每个I2C总线设备都使用集电极开路/漏极开路,并连接到串行时钟线SCL和串行数据线SDA上。

在具体的工作中,I2C总线通信方式被设计成多主设备总线结构,即任何一个设备都可以在不同的时刻成为主设备,没有一个固定的主设备在 SCL 上产生时钟信号。相反,当传送数据时,主设备同时驱动SDA和SCL;当总线空闲时,SCL和SDA都保持高电位,当两个设备试图改变SCL和SDA到不同的电位时,集电极开路/漏极开路能够防止出错。但是每个主设备在传输时必须监听总线状态,以确保报文之间不会互相影响,如果设备收到了不同于它要传送的值时,它知道报文之间发生相互影响了。I2C总线的起始信号和停止信号如图6-18所示。



图4 I2C总线的起始信号和停止信号

在传输数字信号方面,三防平板电脑I2C总线通信方式包括七种常用的信号。

● 总线空闲状态:串行时钟线和串行数据线均为高电平。

● 起始信号:即启动一次传输,串行时钟线是高电平时,串行数据线由高变低。

● 停止信号:即结束一次传输,串行时钟线是高电平时,串行数据信号线由低变高。

● 数据位信号:串行时钟线是低电平时,可以改变串行数据线电位。串行时钟线是高电平时,应保持串行数据线上电位不变,即时钟在高电平时,数据有效。

● 应答信号:占1位,数据接收端接收1字节数据后,应向数据发出端发送应答信号。低电平为应答,继续发送;高电平为非应答,结束发送。

● 控制位信号:占1位,I2C主设备发出的读写控制信号,高电平为读、低电平为写(对I2C主设备而言),控制位在寻址字节中。

● 地址信号和读写控制:地址信号为7位从设备地址,读写控制位1位,两者共同组成一个字节,称为寻址字节,各字段含义如表6-6所示。



表1 I2C总线寻址字节各字段的含义

三防平板电脑其中,设备地址(DA3~DA0)是I2C总线接口器件固有的地址编码,由生产厂家给定,如I2C总线EEPROM器件24CXX系列器件地址为1010。需要注意的是,在标准的I2C总线定义中设备地址是7位,而扩展的I2C总线允许10位地址。地址0000000一般用于发出通用呼叫或总线广播,总线广播可以同时给所有的设备发出命令信号。

引脚地址(A2、A1、A0)由I2C总线接口器件的地址引脚A2、A1、A0来确定,接电源者为1,接地者为0,对于读写控制位():1表示主设备读,0表示主设备写。

I2C 总线通信方式最主要的优点是简单性和有效性,因此在诸多低速控制和检测设备中得到了广泛的应用。

2.三防平板电脑基于I2C总线的数字温度传感器

(1)概述。TMP101是TI公司生产的基于I2C串行总线接口的低功耗、高精度智能温度传感器,其内部集成有二极管温度传感器、Σ-Δ 型 A/D 转换器、串行接口等,TMP101内部结构和引脚如图6-19所示,该器件主要有以下特点。


● I2C总线通过串行接口(SDA和SCL)实现与单片机的通信,I2C总线上可挂接3个TMP101器件,构成多点温度测控系统。

● 温度测量范围为-55℃~125℃,9~12位A/D转换精度,12位A/D转换的分辨率达0.0625%,被测温度值以符号扩展的16位数字方式串行输出。

● 电源电压范围宽(+2.7~+5.5 V),静态电流小,待机状态下仅为0.1 μA。

● 内部具有可编程的温度上、下限寄存器及报警(中断)输出功能,内部的故障排除功能可防止因噪声干扰引起的误触发,从而提高温控系统的可靠性。

TMP101采用SOT23-6封装,引脚说明如下。

● SCL:串行时钟输入引脚,CMOS电平。

● GND:接地脚。

● ALERT:总线报警(中断)输出引脚,漏极开路输出。

● V+:电源端。

● ADD0:I2C总线的地址选择引脚,输入用户设置的地址。

● SDA:串行数据输入/输出端,CMOS电平,双向开路。

电源与接地端之间接有一只0.1 μF的耦合电容。

TMP101内部含有二极管温度传感器、Σ-Δ 型 A/D转换器、时钟振荡器、控制逻辑、配置寄存器和温度寄存器,以及串行接口等。TMP101首先通过内部的二极管温度传感器产生一个与被测温度成正比的电压信号,再通过12位Σ-Δ 型A/D转换器将电压信号转换为与摄氏温度成正比的数字量并存储在内部的温度寄存器中。

(2)三防平板电脑TMP101工作原理。TMP101的I2C总线串行数据线SDA和串行时钟线SDA由主控制器控制。主控制器作为主机,TMP101作为从机并支持I2C总线协议的读/写操作命令。首先通过主控制器进行地址设定,使主控制器对挂接在总线上的TMP101进行地址识别。为了能够正确获取TMP101内部温度寄存器中的温度值数据,要通过I2C总线对TMP101内部相关寄存器写相应的数据,设定温度转换结果的分辨率、转换时间、报警输出的上下限温度值及工作方式等。也就是对TMP101内部的配置寄存器、上限温度寄存器和下限温度寄存器进行初始化设置。

① TMP101的地址设置。根据I2C总线规范,TMP101有一个7位的从器件地址码,其有效位为10010,其余两位根据引脚ADD0接地、悬空和接电源端的不同,分别设置为00、01、10。一条I2C总线上可挂接3个TMP101器件。

② TMP101内部寄存器。TMP101的功能实现和工作方式主要是由其内部的5个寄存器确定,如图6-20所示,这些寄存器分别是地址指针寄存器、温度寄存器、配置寄存器、下限温度(TL)寄存器和上限温度(TH)寄存器,后4个寄存器均属于数据寄存器。



图5 TM101内部的5个寄存器

三防平板电脑地址指针寄存器为8位可读写寄存器,内部存储了要读写的其他4个数据寄存器的地址。在读写操作中,通过设定地址指针寄存器的内容可确定要访问的寄存器。在8位数据字节中,前6位全部设置为0,后2位(P0和P1)用于选择寄存器,P0、P1的值与选择的寄存器关系如表6-7所示。



表2 P0、P1的值与选择的寄存器关系

温度寄存器为16位可读寄存器,用于存储经A/D转换后的12位温度数据,后4位全补为0,以构成2字节的可读寄存器,也可以通过设置配置寄存器的内容来获得9、10、11、12位不同的A/D转换结果。

配置寄存器为8位可读/写寄存器,可通过配置寄存器来设置器件的工作方式。Rl/R0为温度传感器转换分辨率配置位,可以设定内部A/D转换器的分辨率及转换时间;F1/F0为故障排队次数配置位,当被测温度值连续超过n次(可通过设置Fl/F0位)时,就会有报警输出;POL为ALERT极性位,通过POL的设置,可以使控制器和ALERT输出的极性一致;SD 用来设置器件是否工作在关断模式,在关断模式下,


向 OS/ALERT 位写 l 可以开启一次温度转换,在温度比较模式下,该数据位可提供温度比较模式的状态。

(3)I2C总线编程示例。AT89S52单片机内部没有集成I2C接口电路,因此这里介绍如何通过编程来实现单片机I/O口模拟I2C总线的接口电路。

三防平板电脑I2C总线的基本操作有启动总线、停止总线、写1个字节、读1个字节。以下采用两条I/O口线分别作为I2C总线的SCL和SDA信号,并给出用C语言编写的各个子函数。

① 启动总线与停止总线。前面介绍了I2C总线的起始与停止的时序,可根据图6-18来完成I2C总线控制的起始与停止程序,程序如下。

这里需要调用延时子函数DelayMs(unsigned int number),表示延时number毫秒。

void I2C_Start(void)

{

SDA=1;

SCL=1;

DelayMs(1);

SDA=0;

DelayMs(1);

SCL=0;

DelayMs(1);

}

void I2C_Stop(void)

{

SCL=0;

SDA=0;

DelayMs(1);

SCL=1;

DelayMs(1);

SDA=1;

DelayMs(1);

}

② 应答机制。应答信号用于表明1字节数据传输的结束,由数据接收端发出。数据发送端在第9个时钟位上释放数据总线,使其处于高电平,此时接收端输出的低电平为数据总线的应答信号。用C编语言编写的I2C总线控制应答程序如下。

void I2C_Ack(void)

{

SDA=0;

DelayMs(1);

SCL=1;

DelayMs(1);

SCL=0;

DelayMs(1);

SDA=1;

DelayMs(1);

}

/*检测应答子程序

*ErorrBit=0,接收到正常应答信号

*ErrorBit=1,无正常应答信号 */

bit AckCheck(void)

{

bit ErrorBit;

SDA=1;

DelayMs(1);

SCL=1;

DelayMs(1);

ErrorBit=SDA;

SCL=0;

DelayMs(1);


return(ErrorBit);

}

③ 非应答信号。非应答信号用于数据传输出现异常而无法完成的情况,在传送完1个字节的数据后,在第9个时钟位上,从设备输出高电平作为非应答信号。非应答信号产生有两种情况:

一是当从设备正在进行其他处理而无法立即接收总线上的数据时,从设备不产生应答信号,此时从设备释放总线,将数据线SDA置为高电平。这样,主设备可产生一个停止信号来终止总线数据传输。

二是当主设备接收来自从设备的数据时,接收到最后1个字节后,必须给从设备发送一个非应答信号,使从设备释放数据总线。这样,主设备才可以发生停止信号,从而终止数据传输。用C语言编写I2C总线控制的非应答信号程序如下。

void NACK(void)

{

SDA=1;

DelayMs(1);

SCL=1;

DelayMs(1);

SCL=0;

DelayMs(1);

}

④ 写数据。I2C总线协议规定了完整的数据传送格式,以写数据为例,在数据传输的开始时,主设备发出起始信号,然后发送寻址字节,这里寻址字节的最低位应该为0,表示这次操作是写操作,在寻址字节后是要传送的数据字节与应答位,具体过程如下所示。

如果一次数据传输完毕,主设备希望继续占用总线,则可以不产生停止信号,再次发送起始信号,并对另一从设备进行寻址,便可进行新的数据传输。

用C语言编写的I2C总线控制的写1个字节数据程序如下。

bit WriteByte(unsigned char data) //data为要发送的数据

{

unsigned char temp;

for(temp=8;temp!=0;temp——) //循环移位,逐位发送8位数据

{

SDA=(bit)(data & 0x80);

DelayMs(1);

SCL=1;

DelayMs(1);

SCL=0;

DelayMs(1);

data=data <<1;

}

return 1;

}

三防平板电脑如果主设备需要发送n个字节的数据,则首先发送起始位,接着是寻址字节,然后是数据所要存入单元的首地址,从设备此时产生正确的应答后,主设备便将n个字节数据传到指定的从设备中。用C语言编写的I2C总线控制的写n个字节数据程序如下。

void WriteNByte(unsigned char *Wdata,unsigned char RomAddress,unsigned char number)

{

I2C_Start(); //启动总线

WriteByte(WriteDevAdd); //写从设备的寻址地址

AckCheck(); //检测应答信号

WriteByte(RomAddress); //写入所要存入单元的首地址

AckCheck(); //检测应答信号

for(;number!=0;number——) //逐个字节发送

{

WriteByte(*Wdata); //发送1个字节数据

AckCheck(); //检测应答信号

Wdata++; //指向下一个数据

}


Stop(); //结束本次传输

DelayMs(1);

}

其中,WriteDevAdd为I2C总线从设备的寻址地址,其声明如下。

#define WriteDevAdd 0xa0

⑤ 读数据。与写数据的过程类似,I2C总线的读数据也是从主设备发出起始信号开始的,然后发送寻址字节,具体过程如下所示。

用C语言编写I2C总线控制的读1个字节数据的程序如下。

unsigned char ReadByte()

{

unsigned char temp,rbyte=0;

for(temp=8;temp!=0;temp——)

{

SCL=1;

DelayMs(1);

rbyte=rbyte<<1;

DelayMs(1);

//数据线SDA上的数据存入rbyte的最低位

rbyte=rbyte|((unsigned char)(SDA));

SCL=0;

DelayMs(1);

}

return(rbyte);

}

三防平板电脑主设备读取n个字节数据的过程与发送n个字节数据的过程类似,只不过寻址地址中的读写位为1。

需要注意的是,在读n个字节的操作中,除了发送寻址字节外,还要发送设备的子地址。因此,在读n个字节操作前,要进行1个字节的写操作,然后重新开始读操作,将从设备内的n个字节数据读出。用C语言编写的I2C总线控制的读n个字节数据程序如下。

void ReadNByte(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes)

{

Start(); //启动I2C总线

WriteByte(WriteDevAdd); //写从设备的寻址地址

AckCheck(); //检测应答信号

WriteByte(RomAddress); //写I2C设备内部数据的读取首地址

AckCheck(); //检测应答信号

Start(); //重新启动

WriteByte(ReadDevAdd); //写设备的寻址地址

AckCheck(); //检测应答信号

while(bytes!=1) //循环读入字节数据

{

*RamAddress=ReadByte(); //读入1个字节

I2C_Ack(); //应答信号

RamAddress++; //地址指针递增

bytes——; //待读入数据个数递减

}

*RamAddress=ReadByte(); //读入最后1个字节数据

NACK(); //非应答信号

Stop(); //停止I2C总线

}

其中WriteDevAdd和ReadDevAdd分别为写、读I2C总线设备的寻址字节,声明如下。

#define WriteDevAdd 0xa0

#define ReadDevAdd 0xa1

(4)TMP101的使用方法。要获取TMP101中的温度值数据,首先应通过AT89S52单片机对TMP101内部的配置寄存器、上限温度


寄存器和下限温度寄存器进行初始化设置。其过程为AT89S52单片机对TMP101写地址,然后写配置寄存器地址到地址指针寄存器,最后将数据写入配置寄存器。AT89S52单片机对TMP101配置寄存器写操作的时序如图6所示,上/下限温度寄存器的写时序和配置寄存器的写时序同理。



图6 AT89S52单片机对TMP101配置寄存器写操作的时序

三防平板电脑读取TMP101内部温度寄存器当前值的过程是:首先写入要读的TMP101地址,然后写入要读的 TMP101内部温度寄存器,向 I2C 总线上发送一个“重启动信号”,并将 TMP101地址字节再重发一次,改变数据的传输方向,从而进行读取温度寄存器的操作。AT89S52单片机对TMP101温度寄存器读操作的时序如图7所示。

由图7可见,在串行数据线SDA和串行时钟线SCL的时序配合下,将AT89S52单片机的启动使能位SEN置位并建立启动信号时序,接着单片机将要读的TMP101地址字节写入缓冲器,并通过单片机内部移位寄存器将字节移送至 SDA 引脚,8位地址字节的前7位是TMP101的受控地址,最后l位为读/写的控制位(为“0”时表示写操作)。写地址字节完成后,在第9个时钟脉冲周期内,单片机释放SDA,以便TMP101在地址匹配后能够反馈一个有效应答信号供单片机检测接收。第9个时钟脉冲之后,SCL引脚保持为低电平,SDA引脚电平保持不变,直到下一个数据字节被送入缓冲器为止,然后写入要读的 TMP101内部温度寄存器地址字节,其过程与 TMP101地址字节的写操作同理。通过向总线上发送“重启信号”,改变数据的传输方向,此时寻址字节也要重发一次,但对TMP101的地址字节已变为读操作,然后读取TMP101内部温度寄存器的地址字节,最后读出TMP101内部温度寄存器中的温度值数据字节,被测温度值是以符号扩展的16位数字量的方式串行输出的。单片机每接收一个字节都要反馈一个应答信号,此时要注意单片机反馈的应答信号和TMP101反馈的应答信号是不同的,最后通过设置停止使能位,发送一个停止信号时序到总线上,表明终止此次通信。



图7 AT89S52单片机控制TMP101温度寄存器读操作的时序

(5)三防平板电脑C语言应用程序。TMP101的C语言应用程序如下。