Statistics
| Branch: | Tag: | Revision:

amiro-lld / source / P9221R / v1 / alld_P9221R_v1.c @ d2281627

History | View | Annotate | Download (7.512 KB)

1 6ef38c23 Julia Niermann
/*
2
AMiRo-LLD is a compilation of low-level hardware drivers for the Autonomous Mini Robot (AMiRo) platform.
3
Copyright (C) 2016..2019  Thomas Schöpping et al.
4

5
This program is free software: you can redistribute it and/or modify
6
it under the terms of the GNU Lesser General Public License as published by
7
the Free Software Foundation, either version 3 of the License, or
8
(at your option) any later version.
9

10
This program is distributed in the hope that it will be useful,
11
but WITHOUT ANY WARRANTY; without even the implied warranty of
12
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
GNU Lesser General Public License for more details.
14

15
You should have received a copy of the GNU Lesser General Public License
16
along with this program.  If not, see <http://www.gnu.org/licenses/>.
17
*/
18
19
/**
20
 * @file    alld_P9221R_v1.c
21
 *
22
 * @brief   Power Monitor function implementations
23
 *
24
 * @addtogroup lld_power
25
 * @{
26
 */
27
28 54dbb62d Julia Niermann
#include <alld_P9221R.h>
29 6ef38c23 Julia Niermann
30 54dbb62d Julia Niermann
#if (defined(AMIROLLD_CFG_P9221R) && (AMIROLLD_CFG_P9221R == 1)) || defined(__DOXYGEN__)
31 6ef38c23 Julia Niermann
32
/******************************************************************************/
33
/* LOCAL DEFINITIONS                                                          */
34
/******************************************************************************/
35
36
/******************************************************************************/
37
/* EXPORTED VARIABLES                                                         */
38
/******************************************************************************/
39
40
/******************************************************************************/
41
/* LOCAL TYPES                                                                */
42
/******************************************************************************/
43
44
/******************************************************************************/
45
/* LOCAL VARIABLES                                                            */
46
/******************************************************************************/
47
48
/******************************************************************************/
49
/* LOCAL FUNCTIONS                                                            */
50
/******************************************************************************/
51
52
/******************************************************************************/
53
/* EXPORTED FUNCTIONS                                                         */
54
/******************************************************************************/
55
56
57
/**
58
 * @brief Read the value of one or more of the registers.
59
 * @param[in]   i2cd        i2c driver
60
 * @param[in]   PRd         p9221r driver
61
 * @param[in]   addr        register address
62
 * @param[out]  data        register content
63
 * @param[in]   num         number of subsequent registers to read
64
 * @param[in]   timeout     timeout
65
 * @return                  An indicator whether the call was successfull
66
 */
67 9797f02a Julia Niermann
apalExitStatus_t p9221r_lld_read_register(const P9221RDriver* const p9221r, const p9221r_lld_register_t addr, uint8_t* const data, const uint8_t num, const apalTime_t timeout)
68 6ef38c23 Julia Niermann
{
69
  apalDbgAssert(p9221r != NULL);
70
  apalDbgAssert(p9221r->i2cd != NULL);
71
  apalDbgAssert(data != NULL);
72
73 9797f02a Julia Niermann
  uint8_t buffer[num];
74 c4db2363 Julia Niermann
75
  apalExitStatus_t status = apalI2CMasterTransmit(p9221r->i2cd, (P9221R_LLD_I2C_ADDR_FIXED | p9221r->addr), (uint8_t*)&addr, 2, buffer, num, timeout);
76 6ef38c23 Julia Niermann
  for (uint8_t dataIdx = 0; dataIdx < num; dataIdx++) {
77 9797f02a Julia Niermann
      data[dataIdx] = buffer[dataIdx];
78 6ef38c23 Julia Niermann
  }
79
  return status;
80
}
81
82
/**
83
 * @brief Write the value of one or more of the registers.
84
 * @param[in]   i2cd        i2c driver
85
 * @param[in]   PRd         p9221r driver
86
 * @param[in]   addr        register address
87
 * @param[in]   data        data to write
88
 * @param[in]   num         number of subsequent registers to read
89
 * @param[in]   timeout     timeout
90
 * @return                  An indicator whether the call was successfull
91
 */
92 2344a771 Julia Niermann
apalExitStatus_t p9221r_lld_write_register(const P9221RDriver* const p9221r, const p9221r_lld_register_t addr, const uint16_t* const data, const uint8_t num, const apalTime_t timeout)
93 6ef38c23 Julia Niermann
{
94
  apalDbgAssert(p9221r != NULL);
95
  apalDbgAssert(p9221r->i2cd != NULL);
96
  apalDbgAssert(data != NULL);
97
98
  uint8_t buffer[1+2*num];
99
  buffer[0] = addr;
100
  for (uint8_t dataIdx = 0; dataIdx < num; dataIdx++) {
101
    buffer[dataIdx*2+1] = data[dataIdx] >> 8;
102
    buffer[dataIdx*2+2] = data[dataIdx] & (0x00FFu);
103
  }
104 2344a771 Julia Niermann
  return apalI2CMasterTransmit(p9221r->i2cd, (P9221R_LLD_I2C_ADDR_FIXED | p9221r->addr), buffer, 1+2*num, NULL, 0, timeout);
105 6ef38c23 Julia Niermann
}
106
107 9797f02a Julia Niermann
/**
108
 * @brief Read the x_alignment.
109
 * @param[in]   i2cd        i2c driver
110
 * @param[in]   PRd         p9221r driver
111
 * @param[out]  x_alignment alignment register content
112
 * @param[in]   timeout     timeout
113
 * @return                  An indicator whether the call was successfull
114
 */
115 a9c9cd33 Ruben Lipperts
apalExitStatus_t p9221r_lld_read_x_alignment(const P9221RDriver* const p9221r, int8_t* const x_alignment, const apalTime_t timeout)
116 9797f02a Julia Niermann
{
117 d2281627 Julia Niermann
    uint8_t address = P9221R_LLD_REGISTER_ALIGNMENT_X;
118
    apalExitStatus_t status = apalI2CMasterTransmit(p9221r->i2cd, (P9221R_LLD_I2C_ADDR_FIXED | p9221r->addr), &address, 2, x_alignment, 1, timeout); // TODO check if implicit cast is ok (uint)
119 9797f02a Julia Niermann
120
    return status;
121
}
122
123
/**
124
 * @brief Read the y_alignment.
125
 * @param[in]   i2cd        i2c driver
126
 * @param[in]   PRd         p9221r driver
127
 * @param[out]  y_alignment alignment register content
128
 * @param[in]   timeout     timeout
129
 * @return                  An indicator whether the call was successfull
130
 */
131 a9c9cd33 Ruben Lipperts
apalExitStatus_t p9221r_lld_read_y_alignment(const P9221RDriver* const p9221r, int8_t* const y_alignment, const apalTime_t timeout)
132 9797f02a Julia Niermann
{
133 d2281627 Julia Niermann
    uint8_t address = P9221R_LLD_REGISTER_ALIGNMENT_Y;
134
    apalExitStatus_t status = apalI2CMasterTransmit(p9221r->i2cd, (P9221R_LLD_I2C_ADDR_FIXED | p9221r->addr), &address, 2, y_alignment, 1, timeout); // TODO check if implicit cast is ok (uint)
135 9797f02a Julia Niermann
136
    return status;
137
}
138
139
/**
140
 * @brief Read the voltage.
141
 * @param[in]   i2cd        i2c driver
142
 * @param[in]   PRd         p9221r driver
143
 * @param[out]  voltage     voltage register content
144
 * @param[in]   timeout     timeout
145
 * @return                  An indicator whether the call was successfull
146
 */
147 c89b966e Ruben Lipperts
apalExitStatus_t p9221r_lld_read_voltage(const P9221RDriver* const p9221r, float* const voltage, const apalTime_t timeout)
148 9797f02a Julia Niermann
{
149 c89b966e Ruben Lipperts
    uint8_t addr = P9221R_LLD_REGISTER_OUTPUT_VOLTAGE_LSB;
150
    uint8_t buffer[2];
151
    uint16_t value;
152
153
    apalExitStatus_t status = apalI2CMasterTransmit(p9221r->i2cd, (P9221R_LLD_I2C_ADDR_FIXED | p9221r->addr), (uint8_t*)&addr, 1, buffer, 2, timeout);
154
    value = ((buffer[1] << 8) & 0x0F) | buffer[0]; // 4MSB are in buffer[1] so we shift and mask, 8LSB are in buffer[0]
155
    *voltage = (((float) value) * 6 * 2.1)/4095.0;
156 9797f02a Julia Niermann
157
    return status;
158
}
159
160
/**
161
 * @brief Read the current.
162
 * @param[in]   i2cd        i2c driver
163
 * @param[in]   PRd         p9221r driver
164
 * @param[out]  current     register content
165
 * @param[in]   timeout     timeout
166
 * @return                  An indicator whether the call was successfull
167
 */
168 c89b966e Ruben Lipperts
apalExitStatus_t p9221r_lld_read_current(const P9221RDriver* const p9221r, float* const current, const apalTime_t timeout)
169 9797f02a Julia Niermann
{
170 c89b966e Ruben Lipperts
    uint8_t addr = P9221R_LLD_REGISTER_IOUT_CURRENT_LSB;
171
    uint8_t buffer[2];
172
    uint16_t value;
173
174
    apalExitStatus_t status = apalI2CMasterTransmit(p9221r->i2cd, (P9221R_LLD_I2C_ADDR_FIXED | p9221r->addr), (uint8_t*)&addr, 1, buffer, 2, timeout);
175
    value = (buffer[1] << 8) | buffer[0]; // 8MSB are in buffer[1] so we shift, 8LSB are in buffer[0]
176
    *current = (((float) value) * 2 * 2.1)/4095.0;
177 9797f02a Julia Niermann
178
    return status;
179
}
180
181
182 54dbb62d Julia Niermann
#endif /* defined(AMIROLLD_CFG_P9221R) && (AMIROLLD_CFG_P9221R == 1) */
183 6ef38c23 Julia Niermann
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210