garfield

【原创】TI TMP100介绍及程序开发

0
阅读(3812)

1.1基本参数及引脚说明

1.基本参数

TMP100是德州仪器(TI)公司的一款数字温度传感器芯片。主要特点有:

1) 工作电压范围:2.7V~5.5V

2) 超低功耗:45μA (待机时0.1μA)

3) 接口方式:I2C二线串行接口

4) 可编程分辨率:9-Bits 到12-Bits

5) 操作频率:100 KHz /400KHz/3.4MHz

6) 精度:测量温度在-25℃~85℃时,为±2℃在-55℃~125℃时,为±3℃

2.从器件地址、引脚说明及封装

表x.1 TMP100引脚描述

引脚名称

引脚编号

功能描述

引脚封装图

SCL

1

I2C时钟输入

GND

2

电源地

ADD1

3

地址输入端1

V+

4

电源正极

ADD0

5

地址输入端0

SDA

6

I2C数据口

表x.2 TMP100 SLAVE ADDRESS

ADD1

ADD0

器件从地址

R/W

0

0

1001 000

1:READ

0:WRITE

0

悬空

1001 001

0

1

1001 010

1

0

1001 100

1

悬空

1001 101

1

1

1001 110

悬空

0

1001 011

悬空

1

1001 111

1.2 TMP100内部寄存器描述

1.2.1指针寄存器

TMP100内部共有5个寄存器,一个指针寄存器(Point Register)和四个数据寄存器(Temperature Register、Configuration Register、TL及TH Register)。对数据寄存器的选择是通过指针寄存器的低2位(P1和P0)来决定的。

指针寄存器的位描述,及P1、P0的设置对应具体的数据寄存器分别见表x.3和x.4。

表x.3 Point Register的各位(8-Bits)

P7

P6

P5

P4

P3

P2

P1

P0

0

0

0

0

0

0

Register Bits

表x.4 数据寄存器的指针地址

P1

P0

数据寄存器

0

0

温度寄存器(只读,保存温度值)

0

1

配置寄存器(可读写)

1

0

临界温度下限寄存器(可读写)

1

1

临界温度上限寄存器(可读写)

1.2.2配置寄存器

表x.5 Configuration Register的各位(8-Bits)

D7

D6

D5

D4

D3

D2

D1

D0

OS/ALERT

R1

R0

F1

F0

POL

TM

SD

对各位的描述如下:

SD置1时,TMP100进入SHUT DOWN模式;置0时,进入连续温度转换模式;

OS/ALERTTMP100进入SHUT DOWN模式下,该位被置1后,将启动一次温度的测量转换,完成后继续进入SHUT DOWN模式;

R1、R0:用于选择TMP100的分辨率,共四种,9-Bits、10-Bits、11-Bits、12-Bits,对应的选择关系见表x.4。

表x.6 TMP100的分辨率设置

R1

R0

分辨率(RESOLUTION)

典型转换时间

0

0

9Bits(0.5℃)

40ms

0

1

10 Bits(0.25℃)

80ms

1

0

11 Bits(0.125℃)

160ms

1

1

12 Bits(0.0625℃)

320ms

1.2.3温度寄存器

表x.7 Temperature Register的各位(16-Bits)

BYTE1—高8位

BYTE2—低8位

D15

D14

D13

D12

D11

D10

D9

D8

D7

D6

D5

D4

D3

D2

D1

D0

T11

T10

T9

T8

T7

T6

T5

T4

T3

T2

T1

T0

0

0

0

0

对应的温度值的计算方式如下:

温度值=T11×27+ T10×26+T9×25+T8×24+T7×23+T6×22+T5×21+

T4×20+T3×2-1+T2×2-2+T1×2-3+T0×2-4

根据不同的分辨率设置,对应的有效位不同:

1) 12 Bits RESOLUTION时,有效位为T11~T0,最低位为T0,故分辨率为2-4=0.0625

2) 11 Bits RESOLUTION时,有效位为T11~T1,最低位为T1,故分辨率为2-3=0.125

3) 10 Bits RESOLUTION时,有效位为T11~T2,最低位为T2,故分辨率为2-2=0. 25

4) 9 Bits RESOLUTION时,有效位为T11~T3,最低位为T3,故分辨率为2-1=0.5

1.3 TMP100的TWI驱动程序介绍

使用飞思卡尔MC9S08AC16处理器,程序如下

#include /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
#define I2C_WAIT_TIMEOUT 1000
#define tmp100_add 0x90
unsigned char temperature[2];//ds1307读出数据,可以在数据监视窗口中看到
//unsigned char set_date[8]; //时钟初值
void delay_us(unsigned char de){
while(de--){
;
}
}
void delay_ms(unsigned int de){
unsigned char i;
while(de--){
for(i=0;i<255;i++){
;
}
}
}
void init_i2c(){
IIC1F=0x4b;//<100khz i2c clock
IIC1C_IICEN=1;//enable I2c module
IIC1C_IICIE=0;//disable I2c interrupt
IIC1C_TXAK=1;
IIC1C_MST=0;
}
//产生start信号
void i2c_start(){
IIC1C_MST=1;
delay_us(5);
}
//产生stop信号
void i2c_stop(){
IIC1C_MST=0;
}
//检查是否收到ack应答
unsigned char i2c_check_ack(){
unsigned int i;
while(IIC1S_IICIF==0);
i=IIC1S;
IIC1S_IICIF=1;//清IICIF标志
for(i=0;iif(IIC1S_RXAK==0)
return 0;//success
}
return 1;
}
//产生restart信号
void i2c_restart(){
IIC1C_RSTA=1;
delay_us(5) ;
}

void clock_init(void){
/* Common initialization of the write once registers */
/* SOPT: COPE=0,COPT=1,STOPE=0,??=1,??=0,??=0,??=1,??=1 */
SOPT=0x53;
/* System clock initialization */
/* ICGC1: HGO=0,RANGE=1,REFS=1,CLKS1=1,CLKS0=1,OSCSTEN=1,LOCD=0,??=0 */
ICGC1=0x7C;
/* ICGC2: LOLRE=0,MFD2=0,MFD1=1,MFD0=1,LOCRE=0,RFD2=0,RFD1=0,RFD0=0 */
ICGC2=0x30;
if (*(unsigned char*)0xFFBE != 0xFF) { /* Test if the device trim value is stored on the specified address */
ICGTRM = *(unsigned char*)0xFFBE; /* Initialize ICGTRM register from a non volatile memory */
}
while(!ICGS1_LOCK) {; /* Wait */
}
}
unsigned char tmp100_read(unsigned char *date){
unsigned char i;
i=2;
IIC1C_TXAK=0;
IIC1S_SRW=0;
IIC1C_TX=1;//transmit
i2c_start();//发开始信号
IIC1D= tmp100_add; //发AT24C02地址,并指明是写操作
if(i2c_check_ack())//检查应答信号是否为ACK
{
i2c_stop();
return 1;
}
IIC1D=0;//发要读的EEPROM地址
if(i2c_check_ack())//检查应答信号是否为ACK
{
i2c_stop();
return 1;
}
//发重新开始信号
i2c_restart();

IIC1D=tmp100_add|0x01;//发AT24C02地址,并指明是读操作
if(i2c_check_ack())//检查应答信号是否为ACK
{
i2c_stop();
return 1;
}
IIC1C_TX=0;//receive
IIC1D;//dummy read to trig the slave send data
while(--i)
{
while(!IIC1S_IICIF);
IIC1S_IICIF=1;
*date++=IIC1D;//依次读
}
IIC1C_TXAK=1;
while(!IIC1S_IICIF);
IIC1S_IICIF=1;
i2c_stop();
*date=IIC1D;
delay_ms(1) ;
return 0;
}

unsigned char tmp100_start(unsigned char command){
unsigned char i,ret;
ret=0;
//PTCD_PTCD2=0;//取消写保护
IIC1C_TXAK=0;
IIC1S_SRW=0;
IIC1C_TX=1;//transmit
i2c_start();//发开始信号
IIC1D= tmp100_add;//发AT24C02地址,并指明是写操作
if(i2c_check_ack())//检查应答信号是否为ACK
{
i2c_stop();
PTCD_PTCD2=1;
return 1;
}
IIC1D=1;//发数据要写入的地址
if(i2c_check_ack())//检查应答信号是否为ACK
{
i2c_stop();
PTCD_PTCD2=1;
return 1;
}
i=1;
ret=0;
while(i--)
{
IIC1D=command;//依次发送要写入的数据
if(i2c_check_ack()==0)// 每发一个字节都检查应答信号是否为ACK
continue;
ret=1;
break;
}
i2c_stop();//发停止信号
delay_ms(100);//等待eeprom内部写操作完成
PTCD_PTCD2=1;//写保护
return ret;
}
void main(void) {
unsigned char i;
EnableInterrupts; /* enable interrupts */
/* include your code here */
clock_init();
init_i2c();
for(;;) {
tmp100_start(0x80);
delay_ms(1000);
tmp100_read(temperature);

__RESET_WATCHDOG(); /* feeds the dog */
} /* loop forever */
/* please make sure that you never leave main */
}
另附tmp100资料两份:
Baidu
map