garfield

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

0
阅读(4648)

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 <hidef.h> /* 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;i<I2C_WAIT_TIMEOUT;i++) {
    if(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资料两份: