Files
CHJ/user/Device/MCP9808.c
2026-03-20 21:19:53 +08:00

110 lines
4.3 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "../main/SystemInclude.h"
/* File start *****************************************************************/
#if ENABLE_USE_MCP9808
/******************************************************************************/
/******************************************************************************/
void WriteWordRegister(u8 regBuf, u16 regData)
{
SI2C_Start(); // send START command
SI2C_Write(MCP_ADR); // WRITE Command (see Section 4.1.4 “Address Byte”)
// also, make sure bit 0 is cleared 0
SI2C_Write(regBuf); // Write CONFIG Register
SI2C_Write(regData>>8); // Write data
SI2C_Write(regData); // Write data
SI2C_Stop(); // send STOP command
}
/******************************************************************************/
u16 ReadWordRegister(u8 regBuf)
{
TypeWord tempInt;
SI2C_Start(); // send START command
SI2C_Write(MCP_ADR); // WRITE Command (see Section 4.1.4 “Address Byte”)
// also, make sure bit 0 is cleared 0
SI2C_Write(regBuf); // Write CONFIG Register
SI2C_Start(); // send Repeat START command
SI2C_Write(MCP_ADR | 0x01); // READ Command
// also, make sure bit 0 is set 1
tempInt.Byte[1] = SI2C_Read(); // READ 8 bits
SI2C_Ack();
tempInt.Byte[0] = SI2C_Read(); // READ 8 bits
SI2C_NoAck();
SI2C_Stop(); // send STOP command
return tempInt.Word;
}
/******************************************************************************/
void WriteByteRegister(u8 regBuf, u8 regData)
{
SI2C_Start(); // send START command
SI2C_Write(MCP_ADR); // WRITE Command (see Section 4.1.4 “Address Byte”)
// also, make sure bit 0 is cleared 0
SI2C_Write(regBuf); // Write CONFIG Register
SI2C_Write(regData); // Write data
SI2C_Stop(); // send STOP command
}
/******************************************************************************/
u16 ReadByteRegister(u8 regBuf)
{
u8 temp;
SI2C_Start(); // send START command
SI2C_Write(MCP_ADR); // WRITE Command (see Section 4.1.4 “Address Byte”)
// also, make sure bit 0 is cleared 0
SI2C_Write(regBuf); // Write CONFIG Register
SI2C_Start(); // send Repeat START command
SI2C_Write(MCP_ADR | 0x01); // READ Command
// also, make sure bit 0 is set 1
temp = SI2C_Read(); // READ 8 bits
SI2C_NoAck();
SI2C_Stop(); // send STOP command
return temp;
}
/******************************************************************************/
void TestTemperatureInit(u8 regValue)
{
WriteWordRegister(CONFIG, CONVERSION);
//WriteByteRegister(RREG, RESULT_0_125_BIT);
WriteByteRegister(RREG, regValue);
HWState.EnableTempInit = 0;
}
/******************************************************************************/
s16 TestTemperature(void)
{
u32 tempLongInt;
s16 tempTA;
tempTA = (u32)ReadWordRegister(TA);
tempTA &= 0x1fff;
tempLongInt = (u32)(tempTA & 0xFFF);
if(tempTA >= 0x1000) tempLongInt = 0xFFF - tempLongInt;
tempLongInt = (tempLongInt * 6400) >> 10; // 0.0625*1024*100 /1024
if(tempTA >= 0x1000){
tempTA *= -1;
}
else tempTA = (u16)tempLongInt; // Temperature*100
if(voltageDetected[TPCB] >= 0x1000) tempTA *= -1;
return tempTA;
}
/******************************************************************************/
void TemperatureLowPower(void)
{
WriteWordRegister(CONFIG, SHUT_DOWN);
}
/* File end *****************************************************************/
#endif
/****************************************************************************/