[原创]
MSP430F5739+TMP006温度传感器
硬件资源
MSP-EXP430F5739学习板
TMP006基本电路(2层板)
硬件连接:SCL---P1。7
SDA--P1。6
[
本帖最后由 蓝雨夜 于 2012-7-27 11:50 编辑 ]
//TMP006在I2C总线通讯时的地址
#define TMP006_ADDRESS 0x40 //7位串行总线从机地址
//TMP006含有5个16 bit的寄存器
//只有配置寄存器是,可读,可写的,其他都是只读的
#define VOBJECT_REG 0x00 //传感器电压寄存器
#define TEMPERATURE_REG 0x01 //温度寄存器
#define CONF_REG 0x02 //配置寄存器
#define Manufacturer_ID_REG 0xFE //制造商ID寄存器 5449h
#define Device_ID_REG 0xFF //设备ID寄存器 0067h
[ 本帖最后由 蓝雨夜 于 2012-7-27 10:11 编辑 ]
//配置寄存器相关位的定义
//Bit [15] RST: Software reset bit
#define TMP006_NO 0<<15 //正常运作,此位自我清除
#define TMP006_SR 1<<15 //软件复位
//Bits [14:12] MOD[2:0]: Mode of operation
#define TMP006_PD 0<<12 //掉电
#define TMP006_MOD 7<<12 //传感器和环境的连续转换
//Bits [11:9] CR[2:0]: ADC conversion rate
#define TMP006_CONVERSION_RATE_4 0<<9 //转换速率
#define TMP006_CONVERSION_RATE_2 1<<9
#define TMP006_CONVERSION_RATE_1 2<<9
#define TMP006_CONVERSION_RATE_0_5 3<<9
#define TMP006_CONVERSION_RATE_0_25 4<<9
//Bit [8] EN: DRDY enable bit
#define TMP006_DRDY_D 0<<8 //DRDY禁用
#define TMP006_DRDY_E 1<<8 //DRDY使能
//Bit [7] DRDY: Data ready bit
#define TMP006_DRDY_P 0<<7 //忙
#define TMP006_DRDY_R 1<<7 //
//测试程序里用到了一份“MSP430_SWI2C_Master.c”库文件里MSP430的IO模拟的I2C函数
/****************************************************************************
* 函数名:
* 输入:
* 返回:
* 描述:
* ************************************************************************/
void Write_TMP006(unsigned char Reg_Address,unsigned char * data)
{
unsigned char TxData[3];
TxData[0]=Reg_Address; //寄存器地址
TxData[1]=data[0]; //寄存器值 MSB
TxData[2]=data[1]; //寄存器值 LSB
MSP430_SWI2CMST_writeBlock(TMP006_ADDRESS,3, 0,&TxData[0]);
}
/****************************************************************************
* 函数名:
* 输入:
* 返回:
* 描述:
* ************************************************************************/
void Read_TMP006(unsigned char Reg_Address,unsigned char *RxData )
{
unsigned char TxData[2];
TxData[0]=Reg_Address; //地址指针
MSP430_SWI2CMST_writeBlock(TMP006_ADDRESS,1, 0,&TxData[0]);
MSP430_SWI2CMST_readBlock(TMP006_ADDRESS,2, RxData);
}
/****************************************************************************
* 函数名:
* 输入:
* 返回:
* 描述:
* ************************************************************************/
void Init_TMP006(void)
{
unsigned char RxData[2],TxData[2];
unsigned int confg=0;
//写配置寄存器
confg= 0x8000;
TxData[0]=(unsigned char)(confg>>8); //MSB
TxData[1]=(unsigned char)confg; //LSB
Write_TMP006(CONF_REG,&TxData[0]);
//读配置寄存器
Read_TMP006(CONF_REG,&RxData[0]);
//制造商ID寄存器 5449h
Read_TMP006(Manufacturer_ID_REG,&RxData[0]);
//写配置寄存器
//MSB
confg= TMP006_MOD |//传感器和环境的连续转换
TMP006_CONVERSION_RATE_0_25 |
TMP006_DRDY_D; //DRDY禁用
TxData[0]=(unsigned char)(confg>>8);
//LSB
TxData[1]=(unsigned char)confg;
Write_TMP006(CONF_REG,&TxData[0]);
//读配置寄存器
Read_TMP006(CONF_REG,&RxData[0]);
//制造商ID寄存器 5449h
Read_TMP006(Manufacturer_ID_REG,&RxData[0]);
//设备ID寄存器 0067h 这里我读出来居然是0X07FF 奇怪!!!!!!!!
Read_TMP006(Device_ID_REG,&RxData[0]);
}
typedef union
{
unsigned char ucdata[2];
unsigned int uidata;
}_ui2uc;
float Read_TMP(void)
{
unsigned char RxData[2] ;
_ui2uc ui2uc;
float temp=0;
//制造商ID寄存器 5449h
Read_TMP006(Manufacturer_ID_REG,&RxData[0]);
do
{
//读配置寄存器
Read_TMP006(CONF_REG,&RxData[0]);
}while((RxData[0]&0x08)!=0x08);
//
Read_TMP006(TEMPERATURE_REG,&RxData[0]);
ui2uc.ucdata[1]=RxData[0];
ui2uc.ucdata[0]=RxData[1];
temp=(ui2uc.uidata>>2)*0.03125;
return temp;
}
测试了下 室温大概也就30左右,采集过来也差不多
不知道如何知道距离远近和温度偏差大小!!!!
[
本帖最后由 蓝雨夜 于 2012-7-27 10:23 编辑 ]
有使用TMP006的朋友可以交流交流!如何使它测量温度准确些呀!
[ 本帖最后由 蓝雨夜 于 2012-7-27 23:54 编辑 ]
你好,我也在调试这个TMP006有问题请教!
我今天调试这个芯片的时候发现我发送器件地址的时候TMP006有应答,但是再发送寄存器地址的时候就没有应答了,读出的数据都是FF。想请教一下,您是怎么做的,我很急,希望您能帮我一下!
程序接口都能知道了,没看文档呀?
小板子自己做的?我要是有这个器件,就做小一点,装在一个笔状的外壳里,这样是不是好在不同的环境位置测试?
[ 本帖最后由 wangfuchong 于 2012-9-6 06:33 编辑 ]
回复 9楼 孤鹜454 的帖子
//写配置寄存器
confg= 0x8000;
TxData[0]=(unsigned char)(confg>>8); //MSB
TxData[1]=(unsigned char)confg; //LSB
Write_TMP006(CONF_REG,&TxData[0]);
//读配置寄存器
Read_TMP006(CONF_REG,&RxData[0]);
//制造商ID寄存器 5449h
Read_TMP006(Manufacturer_ID_REG,&RxData[0]);
//写配置寄存器
//MSB
confg= TMP006_MOD |//传感器和环境的连续转换
TMP006_CONVERSION_RATE_0_25 |
TMP006_DRDY_D; //DRDY禁用
TxData[0]=(unsigned char)(confg>>8);
//LSB
TxData[1]=(unsigned char)confg;
Write_TMP006(CONF_REG,&TxData[0]);
//读配置寄存器
Read_TMP006(CONF_REG,&RxData[0]);
//制造商ID寄存器 5449h
Read_TMP006(Manufacturer_ID_REG,&RxData[0]);
回复 10楼 wangfuchong 的帖子
看了,没看懂,现在读出来的都是0x7ff。头大啊!
回复 12楼 蓝雨夜 的帖子
读制造商ID也要先复位吗?
回复 14楼 孤鹜454 的帖子
我就上点后,初始化时,程序对它复位下,然后在进行读写的
回复 15楼 蓝雨夜 的帖子
我上电后,在配置里面直接写了0x8000,复位,然后按照手册上的时序写入地址和指针,都成功,但是到最后读出的数据都是0xFF,
SCL_out;
SDA_out;
SCL_H;
SDA_H;
__delay_cycles(50);
SDA_L;
__delay_cycles(50);
SCL_L;
__delay_cycles(50);
uchar wdata[2]={0x80,0xfe,};
for(int n=0;n<2;n++)
{
for(uint ii = 8;ii > 0;ii--)
{
if(wdata[n] & 0x80)SDA_H; else SDA_L;
__delay_cycles(20);
SCL_H;
__delay_cycles(50);
SCL_L;
wdata[n] <<= 1;
}
//检测ACK
__delay_cycles(50);
SCL_H;
SDA_in;
__delay_cycles(50);
while(0 != SDA_val);
__delay_cycles(50);
SCL_L;
SDA_out;
}
//上面有效!第二次开始信号
SCL_out;
SDA_out;
SCL_H;
SDA_H;
__delay_cycles(50);
SDA_L;
__delay_cycles(50);
SCL_L;
__delay_cycles(50);
uchar wdata1=0x81;
for(uint ii = 8;ii > 0;ii--)
{
if(wdata1 & 0x80)SDA_H; else SDA_L;
__delay_cycles(20);
SCL_H;
__delay_cycles(50);
SCL_L;
wdata1 <<= 1;
}
//检测ACK
__delay_cycles(50);
SCL_H;
SDA_in;
__delay_cycles(50);
while(0 != SDA_val);
__delay_cycles(50);
SCL_L;
SDA_out;
SDA_L;
//以上是发送地址,下面是接收数据
uchar rdata = 0x00;
// uchar flag;
uchar iii;
SCL_out;
for(iii = 0;iii < 8;iii++)
{
SCL_H;
SDA_in;
__delay_cycles(50);
rdata<<=1;
if(SDA_val) rdata|=0x01;
// __delay_cycles(20);
SCL_L;
__delay_cycles(50);
}
SDA_out;
这是我的一个读TMP006的代码。麻烦您帮我看看有问题吗?
回复 16楼 孤鹜454 的帖子
我是直接用到了一份“MSP430_SWI2C_Master.c”库文件里MSP430的IO模拟的I2C函数
你把I2C的速率加慢试过吗?
回复 17楼 蓝雨夜 的帖子
已经减的很低了,你能不能把你的那个MSP430_SWI2C_Master.c发一份给我,我没找到这个库文件啊!或这麻烦你告诉我到哪里找
回复 18楼 孤鹜454 的帖子
好的!
[ 本帖最后由 蓝雨夜 于 2012-9-8 23:16 编辑 ]
回复 19楼 蓝雨夜 的帖子
谢谢!请教您一个弱弱的问题,这个lib是不是所有的msp430都可以使用啊?例如我的msp430F415