【原创】TI TMP100介绍及程序开发
0赞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/ALERT:TMP100进入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
#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
return 0;//success
}
return 1;
}
//产生restart信号
void i2c_restart(){
IIC1C_RSTA=1;
delay_us(5) ;
}
/* Common initialization of the write once registers */
/* SOPT: COPE=0,COPT=1,STOPE=0,??=1,??=0,??=0,??=1,??=1 */
SOPT=0x53;
/* 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 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){
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;
}
unsigned char i;
EnableInterrupts; /* enable interrupts */
/* include your code here */
clock_init();
init_i2c();
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资料两份: