//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 //配置寄存器相关位的定义 //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; }