//************************************************************************
//Build Date:2014-07-16
//Editor:ZhaoYi
//************************************************************************
#include "cc430F5137.h"
#include "TMP102.h"
void Delay_1u( void)
{
asm("nop");
}
void Bus_IIC_Start(void) //IIC总线起始信号
{
/**起始信号:SCL为1时SDA产生下降沿**/
WriteSCL1();
Delay_1u();
WriteSDA1();
Delay_1u();
WriteSDA0();
Delay_1u();
WriteSCL0();
Delay_1u();
}
void Bus_IIC_Stop(void) //IIC总线停止信号
{
/**停止信号:SCL为1时SDA产生上升沿**/
WriteSDA0();
Delay_1u();
WriteSCL1();
Delay_1u();
WriteSDA1();
Delay_1u();
}
void Bus_IIC_Ack(void) //IIC总线应答信号
{
UINT8 i=0;
WriteSDA1();
WriteSCL1();
Delay_1u();
ReadSDA();
while( (BIT3&P1IN)&&(i<255) )
i++;
WriteSCL0();
Delay_1u();
}
void Bus_IIC_WriteByte( UINT8 iic_byte ) //IIC总线写入一个字节
{
for(UINT8 i=0;i<8;i++)
{
if( (iic_byte<<i)&0x80 ) //发送1
{
WriteSDA1();
WriteSCL1(); //一定要在SCL为1的条件下发送数据:保证数据的有效性
Delay_1u();
WriteSCL0();
Delay_1u();
}
else //发送0
{
WriteSDA0();
WriteSCL1(); //一定要在SCL为1的条件下发送数据:保证数据的有效性
Delay_1u();
WriteSCL0();
Delay_1u();
}
}
}
UINT8 Bus_IIC_ReadByte(void) //IIC总线读出一个字节
{
UINT8 b=0;
WriteSDA1();
for(UINT8 i=0;i<8;i++)
{
WriteSCL0();
Delay_1u();
WriteSCL1();
Delay_1u();
ReadSDA();
if( BIT3&P1IN )
{
b=b<<1;
b++;
}
else
b=b<<1;
}
WriteSCL0();
return b;
}
void TMP102_Start(void) //启动温度采样
{
Bus_IIC_Start();
Bus_IIC_WriteByte( TMP102_IIC_ADDRESS );
Bus_IIC_Ack();
Bus_IIC_WriteByte( 0x01 ); //Write Pointer Register Byte to select Configuration Register(TMP102.pdf,P5)
Bus_IIC_Ack();
Bus_IIC_WriteByte( 0xE1 ); //Configuration Register Byte1:Start a single conversion,12-bit resolution
Bus_IIC_Ack();
Bus_IIC_WriteByte( 0xA0 ); //Configuration Register Byte2:Conversion Rate:4Hz,Normal Mode:12-bit data format
Bus_IIC_Ack();
Bus_IIC_Stop();
}
void TMP102_ShutDown(void) //关断温度采样
{
Bus_IIC_Start();
Bus_IIC_WriteByte( TMP102_IIC_ADDRESS );
Bus_IIC_Ack();
Bus_IIC_WriteByte( 0x01 ); //Write Pointer Register Byte to select Configuration Register(TMP102.pdf,P5)
Bus_IIC_Ack();
Bus_IIC_WriteByte( 0x61 ); //Configuration Register Byte1:shut down all device to reduce current consumption
Bus_IIC_Ack();
Bus_IIC_WriteByte( 0xA0 ); //Configuration Register Byte2:nonsense
Bus_IIC_Ack();
Bus_IIC_Stop();
}
INT16 TMP102_Capture_Read(void) //读温度采样结果
{
INT16 value;
UINT8 os_value;
UINT16 temper;
Bus_IIC_Start();
Bus_IIC_WriteByte( TMP102_IIC_ADDRESS );
Bus_IIC_Ack();
Bus_IIC_WriteByte( 0x01 ); //Write Pointer Register Byte to select Configuration Register(TMP102.pdf,P5)
Bus_IIC_Ack();
Bus_IIC_Stop();
Bus_IIC_Start();
Bus_IIC_WriteByte( TMP102_IIC_ADDRESS+1 ); //1 Read 0 Write,Read Configuration Register
Bus_IIC_Ack();
os_value = Bus_IIC_ReadByte(); //Read Configuration Register Byte1
WriteSDA0();
WriteSCL1();
Delay_1u();
WriteSCL0();
Delay_1u();
Bus_IIC_ReadByte(); //Read Configuration Register Byte2
WriteSDA0();
WriteSCL1();
Delay_1u();
WriteSCL0();
Delay_1u();
Bus_IIC_Stop();
if( (os_value&0x80)!=0 ) //Read Configuration Register Byte1_OS-bit to determine whether the conversion is ended,1 ended 0 not ended
{
Bus_IIC_Start();
Bus_IIC_WriteByte( TMP102_IIC_ADDRESS );
Bus_IIC_Ack();
Bus_IIC_WriteByte( 0x00 ); //Write Pointer Register Byte to select Temperature Register(TMP102.pdf,P5)
Bus_IIC_Ack();
Bus_IIC_Stop();
Bus_IIC_Start();
Bus_IIC_WriteByte( TMP102_IIC_ADDRESS+1 ); //Read Temperature Register
Bus_IIC_Ack();
temper = Bus_IIC_ReadByte(); //读高字节温度值
WriteSDA0();
WriteSCL1();
Delay_1u();
WriteSCL0();
Delay_1u();
temper <<= 8;
temper |= Bus_IIC_ReadByte(); //读高字节温度值
WriteSDA0();
WriteSCL1();
Delay_1u();
WriteSCL0();
Delay_1u();
Bus_IIC_Stop();
temper >>= 4;
if( temper<0x0800 ) //正温度,则直接读数
value = (INT16)temper;
else
value = (INT16)(0xF000|temper); //负温度,加符号位
return value;
}
else
return FALSE;
}