注意事项
若采用模拟I2C的方式驱动TMP102,传感器的设备地址应定义为:
#define SLAVE_ADDRESS 0x90 //0x48<<1
- 模拟I2C发送的地址为8位(特殊处理的除外),而传感器地址为7位,所以需要将原设备地址左移1位,否则无法与传感器进行通信;
- 若采用硬件I2C进行驱动,则可按硬件驱动直接发送7位设备地址0x48即可。
-
驱动代码
核心驱动部分,底层I2C驱动,参照模拟I2C驱动即可。 ```c u8 Tmp102_ReadOneByte(u8 DeviceAdd, u8 PointAddr) {
u8 temp=0; IIC_Start();
IIC_Send_Byte(DeviceAdd); //发送器件地址0X90,写数据IIC_Wait_Ack();
IIC_Send_Byte(PointAddr);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(DeviceAdd|0x01);
IIC_Wait_Ack();
// temp=IIC_Read_Byte();
temp=IIC_Read_Byte(0); IIC_Stop(); return temp; }
u16 Tmp102_ReadOneWrite(u8 DeviceAdd, u8 PointAddr)
{
u16 tempH=0;
u16 tempL=0;
u16 temp=0;
IIC_Start();
IIC_Send_Byte(DeviceAdd); //发送器件地址0X90,写数据
IIC_Wait_Ack();
IIC_Send_Byte(PointAddr);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(DeviceAdd|0x01);
IIC_Wait_Ack();
tempH=IIC_Read_Byte(1);
// IIC_Ack();
// IIC_SDA=1;
IIC_SDA_HIGH();
tempL=IIC_Read_Byte(0);
// IIC_NAck();
IIC_Stop();//产生一个停止条件
temp = (tempH << 8) | tempL ;
temp = (temp >> 4); //由于tmp102和tmp112的有效位为12bit(高12位有效)。所以需要右移4位
return temp;
}
void Tmp102_WriteOneByte(u8 DeviceAdd,u8 PointAddr,u8 DataToWrite) {
IIC_Start();
IIC_Send_Byte(DeviceAdd); //发送器件地址0X90,写数据
IIC_Wait_Ack();
IIC_Send_Byte(PointAddr); //发送低地址
IIC_Wait_Ack();
// IIC_SDA=1;
IIC_SDA_HIGH();
IIC_Send_Byte(DataToWrite);
IIC_Wait_Ack();
IIC_Stop();//产生一个停止条件
// delay_ms(30);
delay_us(30000);
}
void Tmp102_WriteOneWrite(u8 DeviceAdd,u8 PointAddr,u16 DataToWrite)
{
u8 ack;
IIC_Start();
IIC_Send_Byte(DeviceAdd); //发送器件地址0X90,写数据
IIC_Wait_Ack();
IIC_Send_Byte(PointAddr); //发送低地址
IIC_Wait_Ack();
// IIC_SDA=1;
IIC_SDA_HIGH();
IIC_Send_Byte((DataToWrite>>8)&0xff);
ack = IIC_Wait_Ack();
IIC_Send_Byte(DataToWrite&0xff);
ack = IIC_Wait_Ack();
IIC_Stop();//产生一个停止条件
// delay_ms(30);
delay_us(30000);
}
```