spi.cpp
11.2 KB
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
/****************************************************************************
*
* Copyright (C) 2012 PX4 Development Team. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name PX4 nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
#include <nuttx/spi/spi.h>
#include <px4_arch/spi_hw_description.h>
#include <drivers/drv_sensor.h>
/* Due to inconsistent use of chip select and data ready signal on
* different board that use this build, we are using different
* versions.
*
* --------------- SPI1 -------------------- SPI4 -------------- Incompatibilities ---------
* FMUv2: FmuV3 Cube PixhawkMini
* Power Domain: VDD_3V3_SENSORS_EN nVDD_5V_PERIPH_EN V3V:SPI1&SPI4 V3V:SPI1 No SPI4
* PA5 SPI_INT_SCK
* PA6 SPI_INT_MISO
* PA7 SPI_INT_MOSI
* PB0 GYRO_DRDY SPI4:EXTERN_DRDY NC
* PB1 MAG_DRDY +SPI4:nEXTERN_CS NC
* PB4 ACCEL_DRDY NC NC
* PC1 Spare ADC ( NC ) +SPI1:SPI_INT_MAG_!CS
* PC2 nMPU_CS @MPU6000|MPU9250 @MPU9250
* PC13 nGYRO_CS SPI4:nGYRO_EXT_CS NC
* PC14 GPIO_EXT_1 nBARO_EXT_CS -20608_DRDY
* PC15 nACCEL_MAG_CS SPI4:nACCEL_MAG_EXT_CS 20608_CS
* PD7 nBARO_CS
* PD15 nMPU_DRDY @MPU6000|MPU9250 @MPU9250
* PE2 SPI_EXT_SCK NC
* PE4 nSPI_EXT_NSS SPI4:nMPU_EXT_CS NC
* PE5 SPI_EXT_MISO NC
* PE6 SPI_EXT_MOSI NC
*
* Notes: Prefixed with @ Does not effect board control
* Prefixed with + Input used as Output
* Prefixed with - Output used as Input
* Prefixed with SPIn: Bus changed
*
* The board API provides for mechanism to perform a SPI bus reset.
* To facilitate a SPI bus reset
*
* 1) All the pins: SPIn, CD, DRDY associated with the SPI bus are turned to inputs
* with outputs driven low. (OFFIng)
* 2) The power domain of that bus is turned off.
* 3) A usleep it done for ms.
* 4) The power domain of that bus is turned back on.
* 5) The SPIn pins are re-initialized.
* 6) The SPI CS, DRDY pins are re-initialized.
*
* To insure the complete net is de-energized and is not bing back fed, it is important to
* note the all signals in the net list of the parts/bus.
*
* I.E. Not OFFIng PC1 on V3 would leave that pin back feeding the HMC part. As would not
* OFFIng PE4, not associated with SPI1 on V2, but would back feed an MPUxxxx on V3
*
*/
/*
*
* --------------- SPI1 -------------------- SPI4 -------------- Incompatibilities ---------
* FMUv3 Cube: FmuV2 PixhawkMini
* Power Domain: VDD_3V3_SENSORS_EN NA V3V:SPI V5:SPI4 V3V:SPI1 No SPI4
* PA5 SPI_INT_SCK
* PA6 SPI_INT_MISO
* PA7 SPI_INT_MOSI
* PB0 EXTERN_DRDY SPI1:GYRO_DRDY NC
* PB1 MAG_DRDY nEXTERN_CS -SPI1:MAG_DRDY NC
* PB4 NC SPI1:ACCEL_DRDY NC
* PC1 SPI_INT_MAG_!CS -ADC1_IN11 NC
* PC2 nMPU_CS @MPU6000 @MPU9250
* PC13 nGYRO_EXT_CS SPI1:nGYRO_CS NC
* PC14 nBARO_EXT_CS GPIO_EXT_1 -20608_DRDY
* PC15 nACCEL_MAG_EXT_CS SPI1:nACCEL_MAG_CS 20608_CS
* PD7 nBARO_CS
* PD15 nMPU_DRDY @MPU6000 @MPU9250
* PE2 SPI_EXT_SCK NC
* PE4 MPU_EXT_CS SPI4:nSPI_EXT_NSS NC
* PE5 SPI_EXT_MISO NC
* PE6 SPI_EXT_MOSI NC
*
*
* Notes: Prefixed with @ Does not effect board control
* Prefixed with + Input used as Output
* Prefixed with - Output used as Input
* Prefixed with SPIn: Bus changed
*
*/
/*----------------------------------------------------------*/
/*
* --------------- SPI1 -------------------- SPI4 -------------- Incompatibilities ---------
* FMUv2 Pixhawk Mini FmuV2 FmuV3 Cube
* Power Domain: VDD_3V3_SENSORS_EN NA V3V:SPI V5:SPI4 V3V:SPI1&SPI4
* PA5 SPI_INT_SCK
* PA6 SPI_INT_MISO
* PA7 SPI_INT_MOSI
* PB0 NC SPI1:GYRO_DRDY SPI4:EXTERN_DRDY
* PB1 NC -SPI1:MAG_DRDY +SPI4:nEXTERN_CS
* PB4 NC SPI1:ACCEL_DRDY NC
* PC1 Spare ADC ( NC ) +SPI1:SPI_INT_MAG_!CS
* PC2 nMPU_CS @MPU6000 @MPU6000|MPU9250
* PC13 NC SPI1:nGYRO_CS SPI4:nGYRO_EXT_CS
* PC14 20608_DRDY +GPIO_EXT_1 nBARO_EXT_CS
* PC15 20608_CS nACCEL_MAG_CS SPI4:nACCEL_MAG_EXT_CS
* PD7 nBARO_CS
* PD15 nMPU_DRDY @MPU6000 @MPU6000|MPU9250
* PE2 NC SPI_EXT_SCK SPI_EXT_SCK
* PE4 NC SPI4:nSPI_EXT_NSS SPI4:nMPU_EXT_CS
* PE5 NC SPI_EXT_MISO SPI_EXT_MISO
* PE6 NC SPI_EXT_MOSI SPI_EXT_MOSI
*
* Notes: Prefixed with @ Does not effect board control
* Prefixed with + Input used as Output
* Prefixed with - Output used as Input
* Prefixed with SPIn: Bus changed
*
*/
constexpr px4_spi_bus_all_hw_t px4_spi_buses_all_hw[BOARD_NUM_SPI_CFG_HW_VERSIONS] = {
initSPIHWVersion(HW_VER_FMUV2, {
initSPIBus(SPI::Bus::SPI1, {
initSPIDevice(DRV_IMU_DEVTYPE_MPU6000, SPI::CS{GPIO::PortC, GPIO::Pin2}, SPI::DRDY{GPIO::PortD, GPIO::Pin15}),
initSPIDevice(DRV_IMU_DEVTYPE_MPU9250, SPI::CS{GPIO::PortC, GPIO::Pin2}, SPI::DRDY{GPIO::PortD, GPIO::Pin15}),
initSPIDevice(DRV_GYR_DEVTYPE_L3GD20, SPI::CS{GPIO::PortC, GPIO::Pin13}, SPI::DRDY{GPIO::PortB, GPIO::Pin0}),
initSPIDevice(DRV_IMU_DEVTYPE_LSM303D, SPI::CS{GPIO::PortC, GPIO::Pin15}),
initSPIDevice(DRV_BARO_DEVTYPE_MS5611, SPI::CS{GPIO::PortD, GPIO::Pin7}),
initSPIDevice(DRV_BARO_DEVTYPE_MS5607, SPI::CS{GPIO::PortD, GPIO::Pin7}),
}, {GPIO::PortE, GPIO::Pin3}),
initSPIBus(SPI::Bus::SPI2, {
initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortD, GPIO::Pin10})
}),
initSPIBusExternal(SPI::Bus::SPI4, {
initSPIConfigExternal(SPI::CS{GPIO::PortC, GPIO::Pin14}),
initSPIConfigExternal(SPI::CS{GPIO::PortE, GPIO::Pin4}),
}),
}),
initSPIHWVersion(HW_VER_FMUV3, {
initSPIBus(SPI::Bus::SPI1, {
initSPIDevice(DRV_IMU_DEVTYPE_MPU6000, SPI::CS{GPIO::PortC, GPIO::Pin2}, SPI::DRDY{GPIO::PortD, GPIO::Pin15}),
initSPIDevice(DRV_IMU_DEVTYPE_MPU9250, SPI::CS{GPIO::PortC, GPIO::Pin2}, SPI::DRDY{GPIO::PortD, GPIO::Pin15}),
initSPIDevice(DRV_MAG_DEVTYPE_HMC5883, SPI::CS{GPIO::PortC, GPIO::Pin1}), // HMC5983
initSPIDevice(DRV_BARO_DEVTYPE_MS5611, SPI::CS{GPIO::PortD, GPIO::Pin7}),
initSPIDevice(DRV_BARO_DEVTYPE_MS5607, SPI::CS{GPIO::PortD, GPIO::Pin7}),
}, {GPIO::PortE, GPIO::Pin3}),
initSPIBus(SPI::Bus::SPI2, {
initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortD, GPIO::Pin10})
}),
initSPIBus(SPI::Bus::SPI4, {
initSPIDevice(DRV_IMU_DEVTYPE_MPU6000, SPI::CS{GPIO::PortE, GPIO::Pin4}),
initSPIDevice(DRV_IMU_DEVTYPE_MPU9250, SPI::CS{GPIO::PortE, GPIO::Pin4}),
initSPIDevice(DRV_GYR_DEVTYPE_L3GD20, SPI::CS{GPIO::PortC, GPIO::Pin13}),
initSPIDevice(DRV_BARO_DEVTYPE_MS5611, SPI::CS{GPIO::PortC, GPIO::Pin14}),
initSPIDevice(DRV_IMU_DEVTYPE_LSM303D, SPI::CS{GPIO::PortC, GPIO::Pin15}),
}),
}),
initSPIHWVersion(HW_VER_FMUV2MINI, {
initSPIBus(SPI::Bus::SPI1, {
initSPIDevice(DRV_IMU_DEVTYPE_ICM20608G, SPI::CS{GPIO::PortC, GPIO::Pin15}, SPI::DRDY{GPIO::PortC, GPIO::Pin14}),
initSPIDevice(DRV_BARO_DEVTYPE_MS5611, SPI::CS{GPIO::PortD, GPIO::Pin7}),
initSPIDevice(DRV_DEVTYPE_UNUSED, SPI::CS{GPIO::PortC, GPIO::Pin2}, SPI::DRDY{GPIO::PortD, GPIO::Pin15}), // unused MPU9250
}, {GPIO::PortE, GPIO::Pin3}),
initSPIBus(SPI::Bus::SPI2, {
initSPIDevice(SPIDEV_FLASH(0), SPI::CS{GPIO::PortD, GPIO::Pin10})
}),
initSPIBusExternal(SPI::Bus::SPI4, { // unused, but we must at least define it here
}),
}),
// HW_VER_FMUV2X: treat as HW_VER_FMUV2
};
static constexpr bool unused = validateSPIConfig(px4_spi_buses_all_hw);