Merged in f5soh/librepilot/laurent/LP-92_Feed_forward_remove (pull request #33)
[librepilot.git] / flight / pios / common / pios_ms4525do.c
blob10d124a2dddb08e5461f57977a2a3b903a3ef953
1 /**
2 ******************************************************************************
3 * @addtogroup PIOS PIOS Core hardware abstraction layer
4 * @{
5 * @addtogroup PIOS_MS4525DO MS4525DO Functions
6 * @brief Hardware functions to deal with the PixHawk Airspeed Sensor based on MS4525DO
7 * @{
9 * @file pios_ms4525do.c
10 * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2014.
11 * @brief PixHawk MS4525DO Airspeed Sensor Driver
12 * @see The GNU Public License (GPL) Version 3
14 ******************************************************************************/
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License as published by
18 * the Free Software Foundation; either version 3 of the License, or
19 * (at your option) any later version.
21 * This program is distributed in the hope that it will be useful, but
22 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
23 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
24 * for more details.
26 * You should have received a copy of the GNU General Public License along
27 * with this program; if not, write to the Free Software Foundation, Inc.,
28 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 #include "pios.h"
34 #ifdef PIOS_INCLUDE_MS4525DO
36 /* Local Defs and Variables */
39 static int8_t PIOS_MS4525DO_ReadI2C(uint8_t *buffer, uint8_t len)
41 const struct pios_i2c_txn txn_list[] = {
43 .info = __func__,
44 .addr = MS4525DO_I2C_ADDR,
45 .rw = PIOS_I2C_TXN_READ,
46 .len = len,
47 .buf = buffer,
51 return PIOS_I2C_Transfer(PIOS_I2C_MS4525DO_ADAPTER, txn_list, NELEMENTS(txn_list));
55 // values has to ba an arrray with two elements
56 // values stay untouched on error
57 int8_t PIOS_MS4525DO_Read(uint16_t *values)
59 uint8_t data[4];
60 int8_t retVal = PIOS_MS4525DO_ReadI2C(data, sizeof(data));
62 uint8_t status = data[0] & 0xC0;
64 if (status == 0x80) {
65 /* stale data */
66 return -5;
67 } else if (status == 0xC0) {
68 /* device probably broken */
69 return -6;
72 /* differential pressure */
73 values[0] = (data[0] << 8);
74 values[0] += data[1];
76 /* temperature */
77 values[1] = (data[2] << 8);
78 values[1] += data[3];
79 values[1] = (values[1] >> 5);
81 return retVal;
84 #endif /* PIOS_INCLUDE_MS4525DO */