-
Notifications
You must be signed in to change notification settings - Fork 3
/
MCP9808_ex.c
155 lines (107 loc) · 3.92 KB
/
MCP9808_ex.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/*!\file MCP9808_ex.c
** \author SMFSW
** \copyright MIT (c) 2017-2024, SMFSW
** \brief MCP9808 Driver extensions
** \details MCP9808: +/-0.5C Maximum Accuracy Digital Temperature Sensor
**/
/****************************************************************/
#include "MCP9808.h"
#if defined(HAL_I2C_MODULE_ENABLED)
#if defined(I2C_MCP9808)
/****************************************************************/
FctERR NONNULL__ MCP9808_Write_Config(MCP9808_t * const pCpnt, const uint16_t cfg)
{
uMCP9808_REG__CFG CFG;
FctERR err;
CFG.Word = cfg;
CFG.Bits.SHDN = true; // Writing config when in shutdown mode (yet trying to write cfg when shutting down)
err = MCP9808_Write(pCpnt->cfg.slave_inst, &CFG.Word, MCP9808__CONFIGURATION, 1);
if (err) { return err; }
CFG.Word = cfg;
CFG.Bits.SHDN = false; // Re-enable continuous conversion when sending config
err = MCP9808_Write(pCpnt->cfg.slave_inst, &CFG.Word, MCP9808__CONFIGURATION, 1);
if (err) { return err; }
return ERROR_OK;
}
FctERR NONNULL__ MCP9808_Shutdown(MCP9808_t * const pCpnt, const bool shutdown)
{
uMCP9808_REG__CFG CFG;
FctERR err;
err = MCP9808_Read_Config(pCpnt, &CFG.Word);
if (err) { return err; }
CFG.Bits.SHDN = shutdown;
return MCP9808_Write(pCpnt->cfg.slave_inst, &CFG.Word, MCP9808__CONFIGURATION, 1);
}
FctERR NONNULL__ MCP9808_Set_AlertHysteresis(MCP9808_t * const pCpnt, const MCP9808_hyst hys)
{
uMCP9808_REG__CFG CFG;
FctERR err;
err = MCP9808_Read_Config(pCpnt, &CFG.Word);
if (err) { return err; }
CFG.Bits.Hysteresis = hys;
return MCP9808_Write_Config(pCpnt, CFG.Word);
}
FctERR NONNULL__ MCP9808_Set_AlertType(MCP9808_t * const pCpnt, const bool comparator)
{
uMCP9808_REG__CFG CFG;
FctERR err;
err = MCP9808_Read_Config(pCpnt, &CFG.Word);
if (err) { return err; }
CFG.Bits.AlertMod = !comparator;
err = MCP9808_Write_Config(pCpnt, CFG.Word);
if (err) { return err; }
return ERROR_OK;
}
FctERR NONNULL__ MCP9808_Set_AlertOutput(MCP9808_t * const pCpnt, const bool en, const bool alt)
{
uMCP9808_REG__CFG CFG;
FctERR err;
err = MCP9808_Read_Config(pCpnt, &CFG.Word);
if (err) { return err; }
CFG.Bits.AlertCnt = en;
CFG.Bits.AlertStat = en;
CFG.Bits.AlertSel = alt;
return MCP9808_Write_Config(pCpnt, CFG.Word);
}
FctERR NONNULL__ MCP9808_Set_AlertLock(MCP9808_t * const pCpnt, const MCP9808_alert alt, const bool lock)
{
uMCP9808_REG__CFG CFG;
FctERR err;
if (alt > MCP9808__ALERT_CRIT) { return ERROR_VALUE; } // Unknown alert
err = MCP9808_Read_Config(pCpnt, &CFG.Word);
if (err) { return err; }
switch (alt) {
case MCP9808__ALERT_CRIT: CFG.Bits.CrtLoc = lock; break;
default: CFG.Bits.WinLoc = lock; break;
}
return MCP9808_Write_Config(pCpnt, CFG.Word);
}
FctERR NONNULL__ MCP9808_Set_Resolution(MCP9808_t * const pCpnt, const MCP9808_res res)
{
uint16_t RES = res;
FctERR err;
if (res > MCP9808__RES_0_0625) { return ERROR_VALUE; } // Unknown resolution
err = MCP9808_Write(pCpnt->cfg.slave_inst, &RES, MCP9808__RESOLUTION, 1);
if (err) { return err; }
pCpnt->NewData = false;
pCpnt->hLast = HAL_GetTick();
return ERROR_OK;
}
FctERR NONNULL__ MCP9808_Get_Resolution(MCP9808_t * const pCpnt, MCP9808_res * res)
{
uint16_t RES;
FctERR err;
err = MCP9808_Read(pCpnt->cfg.slave_inst, &RES, MCP9808__RESOLUTION, 1);
if (err) { return err; }
*res = RES;
return ERROR_OK;
}
/****************************************************************/
__WEAK FctERR NONNULL__ MCP9808_Alert_GPIO_Init(MCP9808_t * const pCpnt, GPIO_TypeDef * const GPIOx, const uint16_t GPIO_Pin, const GPIO_PinState GPIO_Active) {
return I2C_peripheral_GPIO_init(&pCpnt->cfg.Alert_GPIO, GPIOx, GPIO_Pin, GPIO_Active); }
__WEAK FctERR NONNULL__ MCP9808_Alert_GPIO_Get(MCP9808_t * const pCpnt, bool * const pState) {
return I2C_peripheral_GPIO_get(&pCpnt->cfg.Alert_GPIO, pState); }
/****************************************************************/
#endif
#endif
/****************************************************************/