Paparazzi UAS v7.0_unstable
Paparazzi is a free software Unmanned Aircraft System.
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
ads1220.c
Go to the documentation of this file.
1/*
2 * Copyright (C) 2014 Gautier Hattenberger, Alexandre Bustico
3 *
4 * This file is part of paparazzi.
5 *
6 * paparazzi is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2, or (at your option)
9 * any later version.
10 *
11 * paparazzi is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with paparazzi; see the file COPYING. If not, see
18 * <http://www.gnu.org/licenses/>.
19 *
20 */
21
31#include "peripherals/ads1220.h"
32
33// Commands
34#define ADS1220_WREG(_reg, _nb) ((1<<6)|(_reg<<2)|(_nb-1))
35#define ADS1220_RREG(_reg, _nb) ((1<<5)|(_reg<<2)|(_nb-1))
36#define ADS1220_RESET 0x06
37#define ADS1220_START_SYNC 0x08
38#define ADS1220_POWERDOWN 0x02
39#define ADS1220_RDATA 0x10
40
41// Conf registers
42#define ADS1220_CONF0 0x0
43#define ADS1220_CONF1 0x1
44#define ADS1220_CONF2 0x2
45#define ADS1220_CONF3 0x3
46
47
48// Init function
49void ads1220_init(struct Ads1220 *ads, struct spi_periph *spi_p, uint8_t slave_idx)
50{
51 /* set spi_peripheral */
52 ads->spi_p = spi_p;
53
54 /* configure spi transaction */
55 ads->spi_trans.cpol = SPICpolIdleLow;
56 ads->spi_trans.cpha = SPICphaEdge2;
57 ads->spi_trans.dss = SPIDss8bit;
58 ads->spi_trans.bitorder = SPIMSBFirst;
59 ads->spi_trans.cdiv = SPIDiv128; // f_PCLK / div
60
61 ads->spi_trans.select = SPISelectUnselect;
62 ads->spi_trans.slave_idx = slave_idx;
63 ads->spi_trans.output_length = 0;
64 ads->spi_trans.input_length = 0;
65 ads->spi_trans.before_cb = NULL;
66 ads->spi_trans.after_cb = NULL;
67 ads->spi_trans.input_buf = &(ads->rx_buf[0]);
68 ads->spi_trans.output_buf = &(ads->tx_buf[0]);
69
70 /* set inital status: Success or Done */
71 ads->spi_trans.status = SPITransDone;
72
73 ads->data = 0;
74 ads->data_available = false;
75 ads->config.status = ADS1220_UNINIT;
76}
77
78
79// Configuration function called once before normal use
80static void ads1220_send_config(struct Ads1220 *ads)
81{
82 ads->spi_trans.output_length = 5;
83 ads->spi_trans.input_length = 0;
84 ads->tx_buf[0] = ADS1220_WREG(ADS1220_CONF0, 4);
85 ads->tx_buf[1] = (
86 (ads->config.pga_bypass << 0) |
87 (ads->config.gain << 1) |
88 (ads->config.mux << 4));
89 ads->tx_buf[2] = (
90 (ads->config.conv << 2) |
91 (ads->config.rate << 5));
92 ads->tx_buf[3] = (
93 (ads->config.idac << 0) |
94 (ads->config.vref << 6));
95 ads->tx_buf[4] = (
96 (ads->config.i2mux << 2) |
97 (ads->config.i1mux << 5));
98 spi_submit(ads->spi_p, &(ads->spi_trans));
99}
100
101// Configuration function called before normal use
103{
104 if (ads->config.status == ADS1220_UNINIT) {
105 if (ads->spi_trans.status == SPITransSuccess || ads->spi_trans.status == SPITransDone) {
106 ads->spi_trans.output_length = 1;
107 ads->spi_trans.input_length = 0;
108 ads->tx_buf[0] = ADS1220_RESET;
109 spi_submit(ads->spi_p, &(ads->spi_trans));
110 ads->config.status = ADS1220_SEND_RESET;
111 }
112 } else if (ads->config.status == ADS1220_INITIALIZING) { // Configuring but not yet initialized
113 if (ads->spi_trans.status == SPITransSuccess || ads->spi_trans.status == SPITransDone) {
114 ads1220_send_config(ads); // do config
115 }
116 }
117}
118
119// Read next data
121{
122 if (ads->config.status == ADS1220_INITIALIZED && ads->spi_trans.status == SPITransDone) {
123 ads->spi_trans.output_length = 0;
124 ads->spi_trans.input_length = 3;
125 spi_submit(ads->spi_p, &(ads->spi_trans));
126 }
127}
128
129// Check end of transaction
131{
132 if (ads->config.status == ADS1220_INITIALIZED) {
133 if (ads->spi_trans.status == SPITransFailed) {
134 ads->spi_trans.status = SPITransDone;
135 } else if (ads->spi_trans.status == SPITransSuccess) {
136 // Successfull reading of 24bits adc
137 ads->data = (uint32_t)(((uint32_t)(ads->rx_buf[0]) << 16) | ((uint32_t)(ads->rx_buf[1]) << 8) | (ads->rx_buf[2]));
138 ads->data_available = true;
139 ads->spi_trans.status = SPITransDone;
140 }
141 } else if (ads->config.status == ADS1220_SEND_RESET) { // Reset ads1220 before configuring
142 if (ads->spi_trans.status == SPITransFailed) {
143 ads->spi_trans.status = SPITransDone;
144 ads->config.status = ADS1220_UNINIT; // config failed
145 } else if (ads->spi_trans.status == SPITransSuccess) {
146 ads->spi_trans.status = SPITransDone;
147 ads->config.status = ADS1220_INITIALIZING;
148 // do config at next call of ads1220_configure() (or ads1220_periodic())
149 }
150 } else if (ads->config.status == ADS1220_INITIALIZING) { // Configuring but not yet initialized
151 if (ads->spi_trans.status == SPITransFailed) {
152 ads->spi_trans.status = SPITransDone;
153 ads->config.status = ADS1220_UNINIT; // config failed
154 } else if (ads->spi_trans.status == SPITransSuccess) {
155 ads->spi_trans.status = SPITransDone;
156 ads->config.status = ADS1220_INITIALIZED; // config done
157 }
158 }
159}
160
#define ADS1220_RESET
Definition ads1220.c:36
void ads1220_read(struct Ads1220 *ads)
Definition ads1220.c:120
static void ads1220_send_config(struct Ads1220 *ads)
Definition ads1220.c:80
void ads1220_event(struct Ads1220 *ads)
Definition ads1220.c:130
void ads1220_configure(struct Ads1220 *ads)
Definition ads1220.c:102
#define ADS1220_CONF0
Definition ads1220.c:42
void ads1220_init(struct Ads1220 *ads, struct spi_periph *spi_p, uint8_t slave_idx)
Definition ads1220.c:49
#define ADS1220_WREG(_reg, _nb)
Definition ads1220.c:34
Driver for the ADS1220 24-bits ADC from TI SPI communication.
@ ADS1220_SEND_RESET
Definition ads1220.h:41
@ ADS1220_INITIALIZING
Definition ads1220.h:42
@ ADS1220_UNINIT
Definition ads1220.h:40
@ ADS1220_INITIALIZED
Definition ads1220.h:43
enum SPIStatus status
internal state of the peripheral
Definition spi.h:180
bool spi_submit(struct spi_periph *p, struct spi_transaction *t)
Submit SPI transaction.
Definition spi_arch.c:533
@ SPICphaEdge2
CPHA = 1.
Definition spi.h:75
@ SPITransFailed
Definition spi.h:100
@ SPITransSuccess
Definition spi.h:99
@ SPITransDone
Definition spi.h:101
@ SPICpolIdleLow
CPOL = 0.
Definition spi.h:83
@ SPISelectUnselect
slave is selected before transaction and unselected after
Definition spi.h:63
@ SPIMSBFirst
Definition spi.h:112
@ SPIDiv128
Definition spi.h:126
@ SPIDss8bit
Definition spi.h:90
SPI peripheral structure.
Definition spi.h:174
uint16_t foo
Definition main_demo5.c:58
unsigned int uint32_t
Typedef defining 32 bit unsigned int type.
unsigned char uint8_t
Typedef defining 8 bit unsigned char type.