注意事项

  • 若采用模拟I2C的方式驱动TMP102,传感器的设备地址应定义为:

    1. #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,写数据

    1. IIC_Wait_Ack();
    2. IIC_Send_Byte(PointAddr);
    3. IIC_Wait_Ack();
    4. IIC_Start();
    5. IIC_Send_Byte(DeviceAdd|0x01);
    6. IIC_Wait_Ack();
    7. // 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();

  1. IIC_Start();
  2. IIC_Send_Byte(DeviceAdd|0x01);
  3. IIC_Wait_Ack();
  4. tempH=IIC_Read_Byte(1);
  5. // IIC_Ack();
  6. // IIC_SDA=1;
  7. IIC_SDA_HIGH();
  8. tempL=IIC_Read_Byte(0);
  9. // IIC_NAck();
  10. IIC_Stop();//产生一个停止条件
  11. temp = (tempH << 8) | tempL ;
  12. temp = (temp >> 4); //由于tmp102和tmp112的有效位为12bit(高12位有效)。所以需要右移4位
  13. return temp;

}

void Tmp102_WriteOneByte(u8 DeviceAdd,u8 PointAddr,u8 DataToWrite) {

  1. IIC_Start();
  2. IIC_Send_Byte(DeviceAdd); //发送器件地址0X90,写数据
  3. IIC_Wait_Ack();
  4. IIC_Send_Byte(PointAddr); //发送低地址
  5. IIC_Wait_Ack();
  6. // IIC_SDA=1;
  7. IIC_SDA_HIGH();
  8. IIC_Send_Byte(DataToWrite);
  9. IIC_Wait_Ack();
  10. IIC_Stop();//产生一个停止条件
  11. // delay_ms(30);
  12. 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); } ```