mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-23 16:25:26 +03:00
First cut of conversion of SPI to new IO (#435)
This commit is contained in:
parent
ebebeb154f
commit
b7bf34c4c4
34 changed files with 722 additions and 723 deletions
|
@ -25,7 +25,7 @@
|
|||
#include "common/maths.h"
|
||||
|
||||
#include "system.h"
|
||||
#include "gpio.h"
|
||||
#include "io.h"
|
||||
#include "bus_spi.h"
|
||||
|
||||
#include "sensor.h"
|
||||
|
@ -66,24 +66,22 @@
|
|||
|
||||
#define BOOT ((uint8_t)0x80)
|
||||
|
||||
#define ENABLE_L3GD20 IOLo(mpul3gd20CsPin)
|
||||
#define DISABLE_L3GD20 IOHi(mpul3gd20CsPin)
|
||||
|
||||
static IO_t mpul3gd20CsPin = IO_NONE;
|
||||
|
||||
static void l3gd20SpiInit(SPI_TypeDef *SPIx)
|
||||
{
|
||||
UNUSED(SPIx); // FIXME
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
|
||||
RCC_AHBPeriphClockCmd(L3GD20_CS_GPIO_CLK_PERIPHERAL, ENABLE);
|
||||
mpul3gd20CsPin = IOGetByTag(IO_TAG(L3GD20_CS_PIN));
|
||||
IOInit(mpul3gd20CsPin, OWNER_MPU, RESOURCE_SPI_CS, 0);
|
||||
IOConfigGPIO(mpul3gd20CsPin, SPI_IO_CS_CFG);
|
||||
|
||||
GPIO_InitStructure.GPIO_Pin = L3GD20_CS_PIN;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||
DISABLE_L3GD20;
|
||||
|
||||
GPIO_Init(L3GD20_CS_GPIO, &GPIO_InitStructure);
|
||||
|
||||
GPIO_SetBits(L3GD20_CS_GPIO, L3GD20_CS_PIN);
|
||||
|
||||
spiSetDivisor(L3GD20_SPI, SPI_9MHZ_CLOCK_DIVIDER);
|
||||
spiSetDivisor(L3GD20_SPI, SPI_CLOCK_STANDARD);
|
||||
}
|
||||
|
||||
void l3gd20GyroInit(uint8_t lpf)
|
||||
|
@ -92,32 +90,32 @@ void l3gd20GyroInit(uint8_t lpf)
|
|||
|
||||
l3gd20SpiInit(L3GD20_SPI);
|
||||
|
||||
GPIO_ResetBits(L3GD20_CS_GPIO, L3GD20_CS_PIN);
|
||||
ENABLE_L3GD20;
|
||||
|
||||
spiTransferByte(L3GD20_SPI, CTRL_REG5_ADDR);
|
||||
spiTransferByte(L3GD20_SPI, BOOT);
|
||||
|
||||
GPIO_SetBits(L3GD20_CS_GPIO, L3GD20_CS_PIN);
|
||||
DISABLE_L3GD20;
|
||||
|
||||
delayMicroseconds(100);
|
||||
|
||||
GPIO_ResetBits(L3GD20_CS_GPIO, L3GD20_CS_PIN);
|
||||
ENABLE_L3GD20;
|
||||
|
||||
spiTransferByte(L3GD20_SPI, CTRL_REG1_ADDR);
|
||||
|
||||
spiTransferByte(L3GD20_SPI, MODE_ACTIVE | OUTPUT_DATARATE_3 | AXES_ENABLE | BANDWIDTH_3);
|
||||
//spiTransferByte(L3GD20_SPI, MODE_ACTIVE | OUTPUT_DATARATE_4 | AXES_ENABLE | BANDWIDTH_4);
|
||||
|
||||
GPIO_SetBits(L3GD20_CS_GPIO, L3GD20_CS_PIN);
|
||||
DISABLE_L3GD20;
|
||||
|
||||
delayMicroseconds(1);
|
||||
|
||||
GPIO_ResetBits(L3GD20_CS_GPIO, L3GD20_CS_PIN);
|
||||
ENABLE_L3GD20;
|
||||
|
||||
spiTransferByte(L3GD20_SPI, CTRL_REG4_ADDR);
|
||||
spiTransferByte(L3GD20_SPI, BLOCK_DATA_UPDATE_CONTINUOUS | BLE_MSB | FULLSCALE_2000);
|
||||
|
||||
GPIO_SetBits(L3GD20_CS_GPIO, L3GD20_CS_PIN);
|
||||
DISABLE_L3GD20;
|
||||
|
||||
delay(100);
|
||||
}
|
||||
|
@ -126,7 +124,7 @@ static bool l3gd20GyroRead(int16_t *gyroADC)
|
|||
{
|
||||
uint8_t buf[6];
|
||||
|
||||
GPIO_ResetBits(L3GD20_CS_GPIO, L3GD20_CS_PIN);
|
||||
ENABLE_L3GD20;
|
||||
spiTransferByte(L3GD20_SPI, OUT_X_L_ADDR | READ_CMD | MULTIPLEBYTE_CMD);
|
||||
|
||||
uint8_t index;
|
||||
|
@ -134,7 +132,7 @@ static bool l3gd20GyroRead(int16_t *gyroADC)
|
|||
buf[index] = spiTransferByte(L3GD20_SPI, DUMMY_BYTE);
|
||||
}
|
||||
|
||||
GPIO_SetBits(L3GD20_CS_GPIO, L3GD20_CS_PIN);
|
||||
DISABLE_L3GD20;
|
||||
|
||||
gyroADC[0] = (int16_t)((buf[0] << 8) | buf[1]);
|
||||
gyroADC[1] = (int16_t)((buf[2] << 8) | buf[3]);
|
||||
|
|
|
@ -171,4 +171,3 @@ bool lsm303dlhcAccDetect(acc_t *acc)
|
|||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -24,30 +24,32 @@
|
|||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <platform.h>
|
||||
#include "platform.h"
|
||||
|
||||
#include "common/axis.h"
|
||||
#include "common/maths.h"
|
||||
|
||||
#include "system.h"
|
||||
#include "gpio.h"
|
||||
#include "io.h"
|
||||
#include "exti.h"
|
||||
#include "bus_spi.h"
|
||||
|
||||
#include "gyro_sync.h"
|
||||
|
||||
#include "sensor.h"
|
||||
#include "accgyro.h"
|
||||
#include "accgyro_mpu.h"
|
||||
|
||||
#if defined(USE_GYRO_SPI_MPU6000) || defined(USE_ACC_SPI_MPU6000)
|
||||
|
||||
#include "accgyro_spi_mpu6000.h"
|
||||
|
||||
static void mpu6000AccAndGyroInit(void);
|
||||
|
||||
extern uint8_t mpuLowPassFilter;
|
||||
|
||||
static bool mpuSpi6000InitDone = false;
|
||||
|
||||
|
||||
// Bits
|
||||
#define BIT_SLEEP 0x40
|
||||
#define BIT_H_RESET 0x80
|
||||
|
@ -97,9 +99,10 @@ static bool mpuSpi6000InitDone = false;
|
|||
#define MPU6000_REV_D9 0x59
|
||||
#define MPU6000_REV_D10 0x5A
|
||||
|
||||
#define DISABLE_MPU6000 GPIO_SetBits(MPU6000_CS_GPIO, MPU6000_CS_PIN)
|
||||
#define ENABLE_MPU6000 GPIO_ResetBits(MPU6000_CS_GPIO, MPU6000_CS_PIN)
|
||||
#define DISABLE_MPU6000 IOHi(mpuSpi6000CsPin)
|
||||
#define ENABLE_MPU6000 IOLo(mpuSpi6000CsPin)
|
||||
|
||||
static IO_t mpuSpi6000CsPin = IO_NONE;
|
||||
|
||||
bool mpu6000WriteRegister(uint8_t reg, uint8_t data)
|
||||
{
|
||||
|
@ -127,12 +130,14 @@ void mpu6000SpiGyroInit(uint8_t lpf)
|
|||
|
||||
mpu6000AccAndGyroInit();
|
||||
|
||||
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_0_5625MHZ_CLOCK_DIVIDER);
|
||||
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_CLOCK_INITIALIZATON);
|
||||
|
||||
// Accel and Gyro DLPF Setting
|
||||
mpu6000WriteRegister(MPU6000_CONFIG, lpf);
|
||||
delayMicroseconds(1);
|
||||
|
||||
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_CLOCK_FAST); // 18 MHz SPI clock
|
||||
|
||||
int16_t data[3];
|
||||
mpuGyroRead(data);
|
||||
|
||||
|
@ -153,7 +158,13 @@ bool mpu6000SpiDetect(void)
|
|||
uint8_t in;
|
||||
uint8_t attemptsRemaining = 5;
|
||||
|
||||
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_0_5625MHZ_CLOCK_DIVIDER);
|
||||
#ifdef MPU6000_CS_PIN
|
||||
mpuSpi6000CsPin = IOGetByTag(IO_TAG(MPU6000_CS_PIN));
|
||||
#endif
|
||||
IOInit(mpuSpi6000CsPin, OWNER_MPU, RESOURCE_SPI_CS, 0);
|
||||
IOConfigGPIO(mpuSpi6000CsPin, SPI_IO_CS_CFG);
|
||||
|
||||
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_CLOCK_INITIALIZATON);
|
||||
|
||||
mpu6000WriteRegister(MPU_RA_PWR_MGMT_1, BIT_H_RESET);
|
||||
|
||||
|
@ -201,7 +212,7 @@ static void mpu6000AccAndGyroInit(void)
|
|||
return;
|
||||
}
|
||||
|
||||
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_0_5625MHZ_CLOCK_DIVIDER);
|
||||
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_CLOCK_INITIALIZATON);
|
||||
|
||||
// Device Reset
|
||||
mpu6000WriteRegister(MPU_RA_PWR_MGMT_1, BIT_H_RESET);
|
||||
|
@ -212,14 +223,14 @@ static void mpu6000AccAndGyroInit(void)
|
|||
|
||||
// Clock Source PPL with Z axis gyro reference
|
||||
mpu6000WriteRegister(MPU_RA_PWR_MGMT_1, MPU_CLK_SEL_PLLGYROZ);
|
||||
delayMicroseconds(1);
|
||||
delayMicroseconds(15);
|
||||
|
||||
// Disable Primary I2C Interface
|
||||
mpu6000WriteRegister(MPU_RA_USER_CTRL, BIT_I2C_IF_DIS);
|
||||
delayMicroseconds(1);
|
||||
delayMicroseconds(15);
|
||||
|
||||
mpu6000WriteRegister(MPU_RA_PWR_MGMT_2, 0x00);
|
||||
delayMicroseconds(1);
|
||||
delayMicroseconds(15);
|
||||
|
||||
// Accel Sample Rate 1kHz
|
||||
// Gyroscope Output Rate = 1kHz when the DLPF is enabled
|
||||
|
@ -228,22 +239,23 @@ static void mpu6000AccAndGyroInit(void)
|
|||
|
||||
// Gyro +/- 1000 DPS Full Scale
|
||||
mpu6000WriteRegister(MPU_RA_GYRO_CONFIG, INV_FSR_2000DPS << 3);
|
||||
delayMicroseconds(1);
|
||||
delayMicroseconds(15);
|
||||
|
||||
// Accel +/- 8 G Full Scale
|
||||
mpu6000WriteRegister(MPU_RA_ACCEL_CONFIG, INV_FSR_8G << 3);
|
||||
delayMicroseconds(1);
|
||||
mpu6000WriteRegister(MPU_RA_ACCEL_CONFIG, INV_FSR_16G << 3);
|
||||
delayMicroseconds(15);
|
||||
|
||||
|
||||
mpu6000WriteRegister(MPU_RA_INT_PIN_CFG, 0 << 7 | 0 << 6 | 0 << 5 | 1 << 4 | 0 << 3 | 0 << 2 | 0 << 1 | 0 << 0); // INT_ANYRD_2CLEAR
|
||||
delayMicroseconds(1);
|
||||
delayMicroseconds(15);
|
||||
|
||||
#ifdef USE_MPU_DATA_READY_SIGNAL
|
||||
mpu6000WriteRegister(MPU_RA_INT_ENABLE, MPU_RF_DATA_RDY_EN);
|
||||
delayMicroseconds(1);
|
||||
delayMicroseconds(15);
|
||||
#endif
|
||||
|
||||
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_18MHZ_CLOCK_DIVIDER); // 18 MHz SPI clock
|
||||
spiSetDivisor(MPU6000_SPI_INSTANCE, SPI_CLOCK_FAST);
|
||||
delayMicroseconds(1);
|
||||
|
||||
mpuSpi6000InitDone = true;
|
||||
}
|
||||
|
@ -269,9 +281,10 @@ bool mpu6000SpiGyroDetect(gyro_t *gyro)
|
|||
gyro->init = mpu6000SpiGyroInit;
|
||||
gyro->read = mpuGyroRead;
|
||||
gyro->intStatus = checkMPUDataReady;
|
||||
|
||||
// 16.4 dps/lsb scalefactor
|
||||
gyro->scale = 1.0f / 16.4f;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
|
||||
#include "system.h"
|
||||
#include "exti.h"
|
||||
#include "gpio.h"
|
||||
#include "io.h"
|
||||
#include "bus_spi.h"
|
||||
|
||||
#include "sensor.h"
|
||||
|
@ -35,8 +35,10 @@
|
|||
#include "accgyro_mpu6500.h"
|
||||
#include "accgyro_spi_mpu6500.h"
|
||||
|
||||
#define DISABLE_MPU6500 GPIO_SetBits(MPU6500_CS_GPIO, MPU6500_CS_PIN)
|
||||
#define ENABLE_MPU6500 GPIO_ResetBits(MPU6500_CS_GPIO, MPU6500_CS_PIN)
|
||||
#define DISABLE_MPU6500 IOHi(mpuSpi6500CsPin)
|
||||
#define ENABLE_MPU6500 IOLo(mpuSpi6500CsPin)
|
||||
|
||||
static IO_t mpuSpi6500CsPin = IO_NONE;
|
||||
|
||||
bool mpu6500WriteRegister(uint8_t reg, uint8_t data)
|
||||
{
|
||||
|
@ -66,46 +68,24 @@ static void mpu6500SpiInit(void)
|
|||
return;
|
||||
}
|
||||
|
||||
#ifdef STM32F303xC
|
||||
RCC_AHBPeriphClockCmd(MPU6500_CS_GPIO_CLK_PERIPHERAL, ENABLE);
|
||||
mpuSpi6500CsPin = IOGetByTag(IO_TAG(MPU6500_CS_PIN));
|
||||
IOInit(mpuSpi6500CsPin, OWNER_MPU, RESOURCE_SPI_CS, 0);
|
||||
IOConfigGPIO(mpuSpi6500CsPin, SPI_IO_CS_CFG);
|
||||
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
GPIO_InitStructure.GPIO_Pin = MPU6500_CS_PIN;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||
|
||||
GPIO_Init(MPU6500_CS_GPIO, &GPIO_InitStructure);
|
||||
#endif
|
||||
|
||||
#ifdef STM32F10X
|
||||
RCC_APB2PeriphClockCmd(MPU6500_CS_GPIO_CLK_PERIPHERAL, ENABLE);
|
||||
|
||||
gpio_config_t gpio;
|
||||
// CS as output
|
||||
gpio.mode = Mode_Out_PP;
|
||||
gpio.pin = MPU6500_CS_PIN;
|
||||
gpio.speed = Speed_50MHz;
|
||||
gpioInit(MPU6500_CS_GPIO, &gpio);
|
||||
#endif
|
||||
|
||||
GPIO_SetBits(MPU6500_CS_GPIO, MPU6500_CS_PIN);
|
||||
|
||||
spiSetDivisor(MPU6500_SPI_INSTANCE, SPI_9MHZ_CLOCK_DIVIDER);
|
||||
spiSetDivisor(MPU6500_SPI_INSTANCE, SPI_CLOCK_FAST);
|
||||
|
||||
hardwareInitialised = true;
|
||||
}
|
||||
|
||||
bool mpu6500SpiDetect(void)
|
||||
{
|
||||
uint8_t sig;
|
||||
uint8_t tmp;
|
||||
|
||||
mpu6500SpiInit();
|
||||
|
||||
mpu6500ReadRegister(MPU_RA_WHO_AM_I, 1, &sig);
|
||||
mpu6500ReadRegister(MPU_RA_WHO_AM_I, 1, &tmp);
|
||||
|
||||
if (sig == MPU6500_WHO_AM_I_CONST || sig == MPU9250_WHO_AM_I_CONST) {
|
||||
if (tmp == MPU6500_WHO_AM_I_CONST || tmp == MPU9250_WHO_AM_I_CONST || tmp == ICM20608G_WHO_AM_I_CONST) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -20,336 +20,222 @@
|
|||
|
||||
#include <platform.h>
|
||||
|
||||
#include "build_config.h"
|
||||
|
||||
#include "gpio.h"
|
||||
|
||||
#include "bus_spi.h"
|
||||
#include "exti.h"
|
||||
#include "io.h"
|
||||
#include "io_impl.h"
|
||||
#include "rcc.h"
|
||||
|
||||
#ifdef USE_SPI_DEVICE_1
|
||||
|
||||
#ifndef SPI1_GPIO
|
||||
#define SPI1_GPIO GPIOA
|
||||
#define SPI1_GPIO_PERIPHERAL RCC_AHBPeriph_GPIOA
|
||||
#define SPI1_NSS_PIN GPIO_Pin_4
|
||||
#define SPI1_NSS_PIN_SOURCE GPIO_PinSource4
|
||||
#define SPI1_SCK_PIN GPIO_Pin_5
|
||||
#define SPI1_SCK_PIN_SOURCE GPIO_PinSource5
|
||||
#define SPI1_MISO_PIN GPIO_Pin_6
|
||||
#define SPI1_MISO_PIN_SOURCE GPIO_PinSource6
|
||||
#define SPI1_MOSI_PIN GPIO_Pin_7
|
||||
#define SPI1_MOSI_PIN_SOURCE GPIO_PinSource7
|
||||
/* for F30x processors */
|
||||
#if defined(STM32F303xC)
|
||||
#ifndef GPIO_AF_SPI1
|
||||
#define GPIO_AF_SPI1 GPIO_AF_5
|
||||
#endif
|
||||
#ifndef GPIO_AF_SPI2
|
||||
#define GPIO_AF_SPI2 GPIO_AF_5
|
||||
#endif
|
||||
#ifndef GPIO_AF_SPI3
|
||||
#define GPIO_AF_SPI3 GPIO_AF_6
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void initSpi1(void)
|
||||
#ifndef SPI1_SCK_PIN
|
||||
#define SPI1_NSS_PIN PA4
|
||||
#define SPI1_SCK_PIN PA5
|
||||
#define SPI1_MISO_PIN PA6
|
||||
#define SPI1_MOSI_PIN PA7
|
||||
#endif
|
||||
|
||||
#ifndef SPI2_SCK_PIN
|
||||
#define SPI2_NSS_PIN PB12
|
||||
#define SPI2_SCK_PIN PB13
|
||||
#define SPI2_MISO_PIN PB14
|
||||
#define SPI2_MOSI_PIN PB15
|
||||
#endif
|
||||
|
||||
#ifndef SPI3_SCK_PIN
|
||||
#define SPI3_NSS_PIN PA15
|
||||
#define SPI3_SCK_PIN PB3
|
||||
#define SPI3_MISO_PIN PB4
|
||||
#define SPI3_MOSI_PIN PB5
|
||||
#endif
|
||||
|
||||
#ifndef SPI1_NSS_PIN
|
||||
#define SPI1_NSS_PIN NONE
|
||||
#endif
|
||||
#ifndef SPI2_NSS_PIN
|
||||
#define SPI2_NSS_PIN NONE
|
||||
#endif
|
||||
#ifndef SPI3_NSS_PIN
|
||||
#define SPI3_NSS_PIN NONE
|
||||
#endif
|
||||
|
||||
static spiDevice_t spiHardwareMap[] = {
|
||||
#if defined(STM32F1)
|
||||
{ .dev = SPI1, .nss = IO_TAG(SPI1_NSS_PIN), .sck = IO_TAG(SPI1_SCK_PIN), .miso = IO_TAG(SPI1_MISO_PIN), .mosi = IO_TAG(SPI1_MOSI_PIN), .rcc = RCC_APB2(SPI1), .af = 0, false },
|
||||
{ .dev = SPI2, .nss = IO_TAG(SPI2_NSS_PIN), .sck = IO_TAG(SPI2_SCK_PIN), .miso = IO_TAG(SPI2_MISO_PIN), .mosi = IO_TAG(SPI2_MOSI_PIN), .rcc = RCC_APB1(SPI2), .af = 0, false },
|
||||
#else
|
||||
{ .dev = SPI1, .nss = IO_TAG(SPI1_NSS_PIN), .sck = IO_TAG(SPI1_SCK_PIN), .miso = IO_TAG(SPI1_MISO_PIN), .mosi = IO_TAG(SPI1_MOSI_PIN), .rcc = RCC_APB2(SPI1), .af = GPIO_AF_SPI1, false },
|
||||
{ .dev = SPI2, .nss = IO_TAG(SPI2_NSS_PIN), .sck = IO_TAG(SPI2_SCK_PIN), .miso = IO_TAG(SPI2_MISO_PIN), .mosi = IO_TAG(SPI2_MOSI_PIN), .rcc = RCC_APB1(SPI2), .af = GPIO_AF_SPI2, false },
|
||||
#endif
|
||||
#if defined(STM32F3) || defined(STM32F4)
|
||||
{ .dev = SPI3, .nss = IO_TAG(SPI3_NSS_PIN), .sck = IO_TAG(SPI3_SCK_PIN), .miso = IO_TAG(SPI3_MISO_PIN), .mosi = IO_TAG(SPI3_MOSI_PIN), .rcc = RCC_APB1(SPI3), .af = GPIO_AF_SPI3, false }
|
||||
#endif
|
||||
};
|
||||
|
||||
SPIDevice spiDeviceByInstance(SPI_TypeDef *instance)
|
||||
{
|
||||
// Specific to the STM32F103
|
||||
// SPI1 Driver
|
||||
// PA4 14 SPI1_NSS
|
||||
// PA5 15 SPI1_SCK
|
||||
// PA6 16 SPI1_MISO
|
||||
// PA7 17 SPI1_MOSI
|
||||
if (instance == SPI1)
|
||||
return SPIDEV_1;
|
||||
|
||||
SPI_InitTypeDef spi;
|
||||
if (instance == SPI2)
|
||||
return SPIDEV_2;
|
||||
|
||||
// Enable SPI1 clock
|
||||
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
|
||||
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1, ENABLE);
|
||||
if (instance == SPI3)
|
||||
return SPIDEV_3;
|
||||
|
||||
#ifdef STM32F303xC
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
return SPIINVALID;
|
||||
}
|
||||
|
||||
RCC_AHBPeriphClockCmd(SPI1_GPIO_PERIPHERAL, ENABLE);
|
||||
void spiInitDevice(SPIDevice device)
|
||||
{
|
||||
SPI_InitTypeDef spiInit;
|
||||
|
||||
GPIO_PinAFConfig(SPI1_GPIO, SPI1_SCK_PIN_SOURCE, GPIO_AF_5);
|
||||
GPIO_PinAFConfig(SPI1_GPIO, SPI1_MISO_PIN_SOURCE, GPIO_AF_5);
|
||||
GPIO_PinAFConfig(SPI1_GPIO, SPI1_MOSI_PIN_SOURCE, GPIO_AF_5);
|
||||
spiDevice_t *spi = &(spiHardwareMap[device]);
|
||||
|
||||
#ifdef SPI1_NSS_PIN_SOURCE
|
||||
GPIO_PinAFConfig(SPI1_GPIO, SPI1_NSS_PIN_SOURCE, GPIO_AF_5);
|
||||
#ifdef SDCARD_SPI_INSTANCE
|
||||
if (spi->dev == SDCARD_SPI_INSTANCE) {
|
||||
spi->sdcard = true;
|
||||
}
|
||||
#endif
|
||||
#ifdef NRF24_SPI_INSTANCE
|
||||
if (spi->dev == NRF24_SPI_INSTANCE) {
|
||||
spi->nrf24l01 = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
// Init pins
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||
// Enable SPI clock
|
||||
RCC_ClockCmd(spi->rcc, ENABLE);
|
||||
RCC_ResetCmd(spi->rcc, ENABLE);
|
||||
|
||||
#ifdef USE_SDCARD_SPI1
|
||||
// Configure pins and pullups for SD-card use
|
||||
IOInit(IOGetByTag(spi->sck), OWNER_SPI, RESOURCE_SPI_SCK, device + 1);
|
||||
IOInit(IOGetByTag(spi->miso), OWNER_SPI, RESOURCE_SPI_MISO, device + 1);
|
||||
IOInit(IOGetByTag(spi->mosi), OWNER_SPI, RESOURCE_SPI_MOSI, device + 1);
|
||||
|
||||
// No pull-up needed since we drive this pin as an output
|
||||
GPIO_InitStructure.GPIO_Pin = SPI1_MOSI_PIN;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||
GPIO_Init(SPI1_GPIO, &GPIO_InitStructure);
|
||||
#if defined(STM32F3) || defined(STM32F4)
|
||||
IOConfigGPIOAF(IOGetByTag(spi->sck), SPI_IO_AF_CFG, spi->af);
|
||||
IOConfigGPIOAF(IOGetByTag(spi->miso), SPI_IO_AF_CFG, spi->af);
|
||||
IOConfigGPIOAF(IOGetByTag(spi->mosi), SPI_IO_AF_CFG, spi->af);
|
||||
|
||||
// Prevent MISO pin from floating when SDCard is deselected (high-Z) or not connected
|
||||
GPIO_InitStructure.GPIO_Pin = SPI1_MISO_PIN;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||||
GPIO_Init(SPI1_GPIO, &GPIO_InitStructure);
|
||||
if (spi->nss) {
|
||||
IOConfigGPIOAF(IOGetByTag(spi->nss), SPI_IO_CS_CFG, spi->af);
|
||||
}
|
||||
#endif
|
||||
#if defined(STM32F10X)
|
||||
IOConfigGPIO(IOGetByTag(spi->sck), SPI_IO_AF_SCK_CFG);
|
||||
IOConfigGPIO(IOGetByTag(spi->miso), SPI_IO_AF_MISO_CFG);
|
||||
IOConfigGPIO(IOGetByTag(spi->mosi), SPI_IO_AF_MOSI_CFG);
|
||||
|
||||
// In clock-low mode, STM32 manual says we should enable a pulldown to match
|
||||
GPIO_InitStructure.GPIO_Pin = SPI1_SCK_PIN;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
|
||||
GPIO_Init(SPI1_GPIO, &GPIO_InitStructure);
|
||||
#else
|
||||
// General-purpose pin config
|
||||
GPIO_InitStructure.GPIO_Pin = SPI1_SCK_PIN | SPI1_MISO_PIN | SPI1_MOSI_PIN;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||
GPIO_Init(SPI1_GPIO, &GPIO_InitStructure);
|
||||
if (spi->nss) {
|
||||
IOConfigGPIO(IOGetByTag(spi->nss), SPI_IO_CS_CFG);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef SPI1_NSS_PIN
|
||||
GPIO_InitStructure.GPIO_Pin = SPI1_NSS_PIN;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||
// Init SPI hardware
|
||||
SPI_I2S_DeInit(spi->dev);
|
||||
|
||||
GPIO_Init(SPI1_GPIO, &GPIO_InitStructure);
|
||||
#endif
|
||||
#endif
|
||||
spiInit.SPI_Mode = SPI_Mode_Master;
|
||||
spiInit.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
|
||||
spiInit.SPI_DataSize = SPI_DataSize_8b;
|
||||
spiInit.SPI_NSS = SPI_NSS_Soft;
|
||||
spiInit.SPI_FirstBit = SPI_FirstBit_MSB;
|
||||
spiInit.SPI_CRCPolynomial = 7;
|
||||
spiInit.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
|
||||
|
||||
#ifdef STM32F10X
|
||||
gpio_config_t gpio;
|
||||
|
||||
// MOSI + SCK as output
|
||||
gpio.mode = Mode_AF_PP;
|
||||
gpio.pin = SPI1_MOSI_PIN | SPI1_SCK_PIN;
|
||||
gpio.speed = Speed_50MHz;
|
||||
gpioInit(SPI1_GPIO, &gpio);
|
||||
|
||||
// MISO as input
|
||||
gpio.pin = SPI1_MISO_PIN;
|
||||
gpio.mode = Mode_IN_FLOATING;
|
||||
gpioInit(SPI1_GPIO, &gpio);
|
||||
|
||||
#ifdef SPI1_NSS_PIN
|
||||
// NSS as gpio slave select
|
||||
gpio.pin = SPI1_NSS_PIN;
|
||||
gpio.mode = Mode_Out_PP;
|
||||
gpioInit(SPI1_GPIO, &gpio);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Init SPI1 hardware
|
||||
SPI_I2S_DeInit(SPI1);
|
||||
|
||||
spi.SPI_Mode = SPI_Mode_Master;
|
||||
spi.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
|
||||
spi.SPI_DataSize = SPI_DataSize_8b;
|
||||
spi.SPI_NSS = SPI_NSS_Soft;
|
||||
spi.SPI_FirstBit = SPI_FirstBit_MSB;
|
||||
spi.SPI_CRCPolynomial = 7;
|
||||
spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
|
||||
|
||||
#if (defined(USE_SDCARD_SPI1) || defined(USE_NRF24_SPI1))
|
||||
spi.SPI_CPOL = SPI_CPOL_Low;
|
||||
spi.SPI_CPHA = SPI_CPHA_1Edge;
|
||||
#else
|
||||
spi.SPI_CPOL = SPI_CPOL_High;
|
||||
spi.SPI_CPHA = SPI_CPHA_2Edge;
|
||||
#endif
|
||||
if (spi->sdcard || spi->nrf24l01) {
|
||||
spiInit.SPI_CPOL = SPI_CPOL_Low;
|
||||
spiInit.SPI_CPHA = SPI_CPHA_1Edge;
|
||||
} else {
|
||||
spiInit.SPI_CPOL = SPI_CPOL_High;
|
||||
spiInit.SPI_CPHA = SPI_CPHA_2Edge;
|
||||
}
|
||||
|
||||
#ifdef STM32F303xC
|
||||
// Configure for 8-bit reads.
|
||||
SPI_RxFIFOThresholdConfig(SPI1, SPI_RxFIFOThreshold_QF);
|
||||
SPI_RxFIFOThresholdConfig(spi->dev, SPI_RxFIFOThreshold_QF);
|
||||
#endif
|
||||
|
||||
SPI_Init(SPI1, &spi);
|
||||
SPI_Cmd(SPI1, ENABLE);
|
||||
SPI_Init(spi->dev, &spiInit);
|
||||
SPI_Cmd(spi->dev, ENABLE);
|
||||
|
||||
#ifdef SPI1_NSS_PIN
|
||||
if (spi->nss) {
|
||||
// Drive NSS high to disable connected SPI device.
|
||||
GPIO_SetBits(SPI1_GPIO, SPI1_NSS_PIN);
|
||||
#endif
|
||||
IOHi(IOGetByTag(spi->nss));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_SPI_DEVICE_2
|
||||
|
||||
#ifndef SPI2_GPIO
|
||||
#define SPI2_GPIO GPIOB
|
||||
#define SPI2_GPIO_PERIPHERAL RCC_AHBPeriph_GPIOB
|
||||
#define SPI2_NSS_PIN GPIO_Pin_12
|
||||
#define SPI2_NSS_PIN_SOURCE GPIO_PinSource12
|
||||
#define SPI2_SCK_PIN GPIO_Pin_13
|
||||
#define SPI2_SCK_PIN_SOURCE GPIO_PinSource13
|
||||
#define SPI2_MISO_PIN GPIO_Pin_14
|
||||
#define SPI2_MISO_PIN_SOURCE GPIO_PinSource14
|
||||
#define SPI2_MOSI_PIN GPIO_Pin_15
|
||||
#define SPI2_MOSI_PIN_SOURCE GPIO_PinSource15
|
||||
#endif
|
||||
|
||||
void initSpi2(void)
|
||||
bool spiInit(SPIDevice device)
|
||||
{
|
||||
// Specific to the STM32F103 / STM32F303 (AF5)
|
||||
// SPI2 Driver
|
||||
// PB12 25 SPI2_NSS
|
||||
// PB13 26 SPI2_SCK
|
||||
// PB14 27 SPI2_MISO
|
||||
// PB15 28 SPI2_MOSI
|
||||
|
||||
SPI_InitTypeDef spi;
|
||||
|
||||
// Enable SPI2 clock
|
||||
RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
|
||||
RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE);
|
||||
|
||||
#ifdef STM32F303xC
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
|
||||
RCC_AHBPeriphClockCmd(SPI2_GPIO_PERIPHERAL, ENABLE);
|
||||
|
||||
GPIO_PinAFConfig(SPI2_GPIO, SPI2_SCK_PIN_SOURCE, GPIO_AF_5);
|
||||
GPIO_PinAFConfig(SPI2_GPIO, SPI2_MISO_PIN_SOURCE, GPIO_AF_5);
|
||||
GPIO_PinAFConfig(SPI2_GPIO, SPI2_MOSI_PIN_SOURCE, GPIO_AF_5);
|
||||
|
||||
#ifdef SPI2_NSS_PIN_SOURCE
|
||||
GPIO_PinAFConfig(SPI2_GPIO, SPI2_NSS_PIN_SOURCE, GPIO_AF_5);
|
||||
#endif
|
||||
|
||||
// Init pins
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||
|
||||
#ifdef USE_SDCARD_SPI2
|
||||
// Configure pins and pullups for SD-card use
|
||||
|
||||
// No pull-up needed since we drive this pin as an output
|
||||
GPIO_InitStructure.GPIO_Pin = SPI2_MOSI_PIN;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||
GPIO_Init(SPI2_GPIO, &GPIO_InitStructure);
|
||||
|
||||
// Prevent MISO pin from floating when SDCard is deselected (high-Z) or not connected
|
||||
GPIO_InitStructure.GPIO_Pin = SPI2_MISO_PIN;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||||
GPIO_Init(SPI2_GPIO, &GPIO_InitStructure);
|
||||
|
||||
// In clock-low mode, STM32 manual says we should enable a pulldown to match
|
||||
GPIO_InitStructure.GPIO_Pin = SPI2_SCK_PIN;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
|
||||
GPIO_Init(SPI2_GPIO, &GPIO_InitStructure);
|
||||
#else
|
||||
// General-purpose pin config
|
||||
GPIO_InitStructure.GPIO_Pin = SPI2_SCK_PIN | SPI2_MISO_PIN | SPI2_MOSI_PIN;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||
GPIO_Init(SPI2_GPIO, &GPIO_InitStructure);
|
||||
#endif
|
||||
|
||||
#ifdef SPI2_NSS_PIN
|
||||
GPIO_InitStructure.GPIO_Pin = SPI2_NSS_PIN;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||
|
||||
GPIO_Init(SPI2_GPIO, &GPIO_InitStructure);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef STM32F10X
|
||||
gpio_config_t gpio;
|
||||
|
||||
// MOSI + SCK as output
|
||||
gpio.mode = Mode_AF_PP;
|
||||
gpio.pin = SPI2_SCK_PIN | SPI2_MOSI_PIN;
|
||||
gpio.speed = Speed_50MHz;
|
||||
gpioInit(SPI2_GPIO, &gpio);
|
||||
|
||||
// MISO as input
|
||||
gpio.pin = SPI2_MISO_PIN;
|
||||
gpio.mode = Mode_IN_FLOATING;
|
||||
gpioInit(SPI2_GPIO, &gpio);
|
||||
|
||||
#ifdef SPI2_NSS_PIN
|
||||
// NSS as gpio slave select
|
||||
gpio.pin = SPI2_NSS_PIN;
|
||||
gpio.mode = Mode_Out_PP;
|
||||
gpioInit(SPI2_GPIO, &gpio);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// Init SPI2 hardware
|
||||
SPI_I2S_DeInit(SPI2);
|
||||
|
||||
spi.SPI_Mode = SPI_Mode_Master;
|
||||
spi.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
|
||||
spi.SPI_DataSize = SPI_DataSize_8b;
|
||||
spi.SPI_NSS = SPI_NSS_Soft;
|
||||
spi.SPI_FirstBit = SPI_FirstBit_MSB;
|
||||
spi.SPI_CRCPolynomial = 7;
|
||||
spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
|
||||
|
||||
#ifdef USE_SDCARD_SPI2
|
||||
spi.SPI_CPOL = SPI_CPOL_Low;
|
||||
spi.SPI_CPHA = SPI_CPHA_1Edge;
|
||||
#else
|
||||
spi.SPI_CPOL = SPI_CPOL_High;
|
||||
spi.SPI_CPHA = SPI_CPHA_2Edge;
|
||||
#endif
|
||||
|
||||
#ifdef STM32F303xC
|
||||
// Configure for 8-bit reads.
|
||||
SPI_RxFIFOThresholdConfig(SPI2, SPI_RxFIFOThreshold_QF);
|
||||
#endif
|
||||
|
||||
SPI_Init(SPI2, &spi);
|
||||
SPI_Cmd(SPI2, ENABLE);
|
||||
|
||||
#ifdef SPI2_NSS_PIN
|
||||
// Drive NSS high to disable connected SPI device.
|
||||
GPIO_SetBits(SPI2_GPIO, SPI2_NSS_PIN);
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
bool spiInit(SPI_TypeDef *instance)
|
||||
{
|
||||
#if (!(defined(USE_SPI_DEVICE_1) && defined(USE_SPI_DEVICE_2)))
|
||||
UNUSED(instance);
|
||||
#endif
|
||||
|
||||
switch (device)
|
||||
{
|
||||
case SPIINVALID:
|
||||
return false;
|
||||
case SPIDEV_1:
|
||||
#ifdef USE_SPI_DEVICE_1
|
||||
if (instance == SPI1) {
|
||||
initSpi1();
|
||||
spiInitDevice(device);
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
break;
|
||||
#endif
|
||||
case SPIDEV_2:
|
||||
#ifdef USE_SPI_DEVICE_2
|
||||
if (instance == SPI2) {
|
||||
initSpi2();
|
||||
spiInitDevice(device);
|
||||
return true;
|
||||
}
|
||||
#else
|
||||
break;
|
||||
#endif
|
||||
case SPIDEV_3:
|
||||
#if defined(USE_SPI_DEVICE_3) && (defined(STM32F303xC) || defined(STM32F4))
|
||||
spiInitDevice(device);
|
||||
return true;
|
||||
#else
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32_t spiTimeoutUserCallback(SPI_TypeDef *instance)
|
||||
{
|
||||
SPIDevice device = spiDeviceByInstance(instance);
|
||||
if (device == SPIINVALID)
|
||||
return -1;
|
||||
spiHardwareMap[device].errorCount++;
|
||||
return spiHardwareMap[device].errorCount;
|
||||
}
|
||||
|
||||
// return uint8_t value or -1 when failure
|
||||
uint8_t spiTransferByte(SPI_TypeDef *instance, uint8_t data)
|
||||
{
|
||||
uint16_t spiTimeout = 1000;
|
||||
|
||||
while (SPI_I2S_GetFlagStatus(instance, SPI_I2S_FLAG_TXE) == RESET) {
|
||||
while (SPI_I2S_GetFlagStatus(instance, SPI_I2S_FLAG_TXE) == RESET)
|
||||
if ((spiTimeout--) == 0)
|
||||
break;
|
||||
}
|
||||
return spiTimeoutUserCallback(instance);
|
||||
|
||||
#ifdef STM32F303xC
|
||||
SPI_SendData8(instance, data);
|
||||
#endif
|
||||
#ifdef STM32F10X
|
||||
#else
|
||||
SPI_I2S_SendData(instance, data);
|
||||
#endif
|
||||
spiTimeout = 1000;
|
||||
while (SPI_I2S_GetFlagStatus(instance, SPI_I2S_FLAG_RXNE) == RESET){
|
||||
while (SPI_I2S_GetFlagStatus(instance, SPI_I2S_FLAG_RXNE) == RESET)
|
||||
if ((spiTimeout--) == 0)
|
||||
break;
|
||||
}
|
||||
return spiTimeoutUserCallback(instance);
|
||||
|
||||
#ifdef STM32F303xC
|
||||
return ((uint8_t)SPI_ReceiveData8(instance));
|
||||
#endif
|
||||
#ifdef STM32F10X
|
||||
#else
|
||||
return ((uint8_t)SPI_I2S_ReceiveData(instance));
|
||||
#endif
|
||||
}
|
||||
|
@ -361,14 +247,13 @@ bool spiIsBusBusy(SPI_TypeDef *instance)
|
|||
{
|
||||
#ifdef STM32F303xC
|
||||
return SPI_GetTransmissionFIFOStatus(instance) != SPI_TransmissionFIFOStatus_Empty || SPI_I2S_GetFlagStatus(instance, SPI_I2S_FLAG_BSY) == SET;
|
||||
#endif
|
||||
#ifdef STM32F10X
|
||||
#else
|
||||
return SPI_I2S_GetFlagStatus(instance, SPI_I2S_FLAG_TXE) == RESET || SPI_I2S_GetFlagStatus(instance, SPI_I2S_FLAG_BSY) == SET;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void spiTransfer(SPI_TypeDef *instance, uint8_t *out, const uint8_t *in, int len)
|
||||
bool spiTransfer(SPI_TypeDef *instance, uint8_t *out, const uint8_t *in, int len)
|
||||
{
|
||||
uint16_t spiTimeout = 1000;
|
||||
|
||||
|
@ -378,32 +263,29 @@ void spiTransfer(SPI_TypeDef *instance, uint8_t *out, const uint8_t *in, int len
|
|||
b = in ? *(in++) : 0xFF;
|
||||
while (SPI_I2S_GetFlagStatus(instance, SPI_I2S_FLAG_TXE) == RESET) {
|
||||
if ((spiTimeout--) == 0)
|
||||
break;
|
||||
return spiTimeoutUserCallback(instance);
|
||||
}
|
||||
#ifdef STM32F303xC
|
||||
SPI_SendData8(instance, b);
|
||||
//SPI_I2S_SendData16(instance, b);
|
||||
#endif
|
||||
#ifdef STM32F10X
|
||||
#else
|
||||
SPI_I2S_SendData(instance, b);
|
||||
#endif
|
||||
spiTimeout = 1000;
|
||||
while (SPI_I2S_GetFlagStatus(instance, SPI_I2S_FLAG_RXNE) == RESET) {
|
||||
if ((spiTimeout--) == 0)
|
||||
break;
|
||||
return spiTimeoutUserCallback(instance);
|
||||
}
|
||||
#ifdef STM32F303xC
|
||||
b = SPI_ReceiveData8(instance);
|
||||
//b = SPI_I2S_ReceiveData16(instance);
|
||||
#endif
|
||||
#ifdef STM32F10X
|
||||
#else
|
||||
b = SPI_I2S_ReceiveData(instance);
|
||||
#endif
|
||||
if (out)
|
||||
*(out++) = b;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void spiSetDivisor(SPI_TypeDef *instance, uint16_t divisor)
|
||||
{
|
||||
|
@ -461,3 +343,18 @@ void spiSetDivisor(SPI_TypeDef *instance, uint16_t divisor)
|
|||
|
||||
SPI_Cmd(instance, ENABLE);
|
||||
}
|
||||
|
||||
uint16_t spiGetErrorCounter(SPI_TypeDef *instance)
|
||||
{
|
||||
SPIDevice device = spiDeviceByInstance(instance);
|
||||
if (device == SPIINVALID)
|
||||
return 0;
|
||||
return spiHardwareMap[device].errorCount;
|
||||
}
|
||||
|
||||
void spiResetErrorCounter(SPI_TypeDef *instance)
|
||||
{
|
||||
SPIDevice device = spiDeviceByInstance(instance);
|
||||
if (device != SPIINVALID)
|
||||
spiHardwareMap[device].errorCount = 0;
|
||||
}
|
||||
|
|
|
@ -17,14 +17,68 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#define SPI_0_28125MHZ_CLOCK_DIVIDER 256
|
||||
#define SPI_0_5625MHZ_CLOCK_DIVIDER 128
|
||||
#define SPI_18MHZ_CLOCK_DIVIDER 2
|
||||
#define SPI_9MHZ_CLOCK_DIVIDER 4
|
||||
#include "io_types.h"
|
||||
#include "rcc_types.h"
|
||||
|
||||
bool spiInit(SPI_TypeDef *instance);
|
||||
#if defined(STM32F4) || defined(STM32F3)
|
||||
#define SPI_IO_AF_CFG IO_CONFIG(GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_NOPULL)
|
||||
#define SPI_IO_AF_SCK_CFG IO_CONFIG(GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_DOWN)
|
||||
#define SPI_IO_AF_MISO_CFG IO_CONFIG(GPIO_Mode_AF, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_UP)
|
||||
#define SPI_IO_CS_CFG IO_CONFIG(GPIO_Mode_OUT, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_NOPULL)
|
||||
#elif defined(STM32F1)
|
||||
#define SPI_IO_AF_SCK_CFG IO_CONFIG(GPIO_Mode_AF_PP, GPIO_Speed_50MHz)
|
||||
#define SPI_IO_AF_MOSI_CFG IO_CONFIG(GPIO_Mode_AF_PP, GPIO_Speed_50MHz)
|
||||
#define SPI_IO_AF_MISO_CFG IO_CONFIG(GPIO_Mode_IN_FLOATING, GPIO_Speed_50MHz)
|
||||
#define SPI_IO_CS_CFG IO_CONFIG(GPIO_Mode_Out_PP, GPIO_Speed_50MHz)
|
||||
#endif
|
||||
|
||||
/*
|
||||
Flash M25p16 tolerates 20mhz, SPI_CLOCK_FAST should sit around 20 or less.
|
||||
*/
|
||||
typedef enum {
|
||||
SPI_CLOCK_INITIALIZATON = 256,
|
||||
#if defined(STM32F4)
|
||||
SPI_CLOCK_SLOW = 128, //00.65625 MHz
|
||||
SPI_CLOCK_STANDARD = 8, //10.50000 MHz
|
||||
SPI_CLOCK_FAST = 4, //21.00000 MHz
|
||||
SPI_CLOCK_ULTRAFAST = 2, //42.00000 MHz
|
||||
#else
|
||||
SPI_CLOCK_SLOW = 128, //00.56250 MHz
|
||||
SPI_CLOCK_STANDARD = 4, //09.00000 MHz
|
||||
SPI_CLOCK_FAST = 2, //18.00000 MHz
|
||||
SPI_CLOCK_ULTRAFAST = 2, //18.00000 MHz
|
||||
#endif
|
||||
} SPIClockDivider_e;
|
||||
|
||||
typedef enum SPIDevice {
|
||||
SPIINVALID = -1,
|
||||
SPIDEV_1 = 0,
|
||||
SPIDEV_2,
|
||||
SPIDEV_3,
|
||||
SPIDEV_MAX = SPIDEV_3,
|
||||
} SPIDevice;
|
||||
|
||||
typedef struct SPIDevice_s {
|
||||
SPI_TypeDef *dev;
|
||||
ioTag_t nss;
|
||||
ioTag_t sck;
|
||||
ioTag_t mosi;
|
||||
ioTag_t miso;
|
||||
rccPeriphTag_t rcc;
|
||||
uint8_t af;
|
||||
volatile uint16_t errorCount;
|
||||
bool sdcard;
|
||||
bool nrf24l01;
|
||||
} spiDevice_t;
|
||||
|
||||
bool spiInit(SPIDevice device);
|
||||
void spiSetDivisor(SPI_TypeDef *instance, uint16_t divisor);
|
||||
uint8_t spiTransferByte(SPI_TypeDef *instance, uint8_t in);
|
||||
bool spiIsBusBusy(SPI_TypeDef *instance);
|
||||
|
||||
void spiTransfer(SPI_TypeDef *instance, uint8_t *out, const uint8_t *in, int len);
|
||||
bool spiTransfer(SPI_TypeDef *instance, uint8_t *out, const uint8_t *in, int len);
|
||||
|
||||
uint16_t spiGetErrorCounter(SPI_TypeDef *instance);
|
||||
void spiResetErrorCounter(SPI_TypeDef *instance);
|
||||
SPIDevice spiDeviceByInstance(SPI_TypeDef *instance);
|
||||
|
||||
|
|
|
@ -20,53 +20,67 @@
|
|||
|
||||
#include <platform.h>
|
||||
|
||||
#include "build_config.h"
|
||||
|
||||
#ifdef USE_SOFTSPI
|
||||
|
||||
#include "gpio.h"
|
||||
#include "build_config.h"
|
||||
|
||||
#include "io.h"
|
||||
#include "io_impl.h"
|
||||
#include "bus_spi.h"
|
||||
#include "bus_spi_soft.h"
|
||||
|
||||
|
||||
void softSpiInit(const softSPIDevice_t *dev)
|
||||
{
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
||||
|
||||
// SCK as output
|
||||
GPIO_InitStructure.GPIO_Pin = dev->sck_pin;
|
||||
GPIO_Init(dev->sck_gpio, &GPIO_InitStructure);
|
||||
// MOSI as output
|
||||
GPIO_InitStructure.GPIO_Pin = dev->mosi_pin;
|
||||
GPIO_Init(dev->mosi_gpio, &GPIO_InitStructure);
|
||||
// MISO as input
|
||||
GPIO_InitStructure.GPIO_Pin = dev->miso_pin;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
||||
GPIO_Init(dev->miso_gpio, &GPIO_InitStructure);
|
||||
#ifdef SOFTSPI_NSS_PIN
|
||||
// NSS as output
|
||||
GPIO_InitStructure.GPIO_Pin = dev->nss_pin;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
||||
GPIO_Init(dev->nss_gpio, &GPIO_InitStructure);
|
||||
IOInit(IOGetByTag(dev->sckTag), OWNER_SOFTSPI, RESOURCE_SPI_SCK, SOFT_SPIDEV_1 + 1);
|
||||
#if defined(STM32F10X)
|
||||
IOConfigGPIO(IOGetByTag(dev->sckTag), IO_CONFIG(GPIO_Mode_Out_PP, GPIO_Speed_50MHz));
|
||||
#elif defined(STM32F3) || defined(STM32F4)
|
||||
IOConfigGPIOAF(IOGetByTag(dev->sckTag), SPI_IO_AF_CFG, 0);
|
||||
#endif
|
||||
|
||||
// MOSI as output
|
||||
IOInit(IOGetByTag(dev->mosiTag), OWNER_SOFTSPI, RESOURCE_SPI_MOSI, SOFT_SPIDEV_1 + 1);
|
||||
#if defined(STM32F10X)
|
||||
IOConfigGPIO(IOGetByTag(dev->mosiTag), IO_CONFIG(GPIO_Mode_Out_PP, GPIO_Speed_50MHz));
|
||||
#elif defined(STM32F3) || defined(STM32F4)
|
||||
IOConfigGPIOAF(IOGetByTag(dev->mosiTag), SPI_IO_AF_CFG, 0);
|
||||
#endif
|
||||
|
||||
// MISO as input
|
||||
IOInit(IOGetByTag(dev->misoTag), OWNER_SOFTSPI, RESOURCE_SPI_MISO, SOFT_SPIDEV_1 + 1);
|
||||
#if defined(STM32F10X)
|
||||
IOConfigGPIO(IOGetByTag(dev->misoTag), IO_CONFIG(GPIO_Mode_IN_FLOATING, GPIO_Speed_50MHz));
|
||||
#elif defined(STM32F3) || defined(STM32F4)
|
||||
IOConfigGPIOAF(IOGetByTag(dev->misoTag), SPI_IO_AF_CFG, 0);
|
||||
#endif
|
||||
|
||||
// NSS as output
|
||||
if (dev->nssTag != IOTAG_NONE) {
|
||||
IOInit(IOGetByTag(dev->nssTag), OWNER_SOFTSPI, RESOURCE_SPI_CS, SOFT_SPIDEV_1 + 1);
|
||||
#if defined(STM32F10X)
|
||||
IOConfigGPIO(IOGetByTag(dev->nssTag), IO_CONFIG(GPIO_Mode_Out_PP, GPIO_Speed_50MHz));
|
||||
#elif defined(STM32F3) || defined(STM32F4)
|
||||
IOConfigGPIOAF(IOGetByTag(dev->nssTag), SPI_IO_AF_CFG, 0);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t softSpiTransferByte(const softSPIDevice_t *dev, uint8_t byte)
|
||||
{
|
||||
for(int ii = 0; ii < 8; ++ii) {
|
||||
if (byte & 0x80) {
|
||||
GPIO_SetBits(dev->mosi_gpio, dev->mosi_pin);
|
||||
IOHi(IOGetByTag(dev->mosiTag));
|
||||
} else {
|
||||
GPIO_ResetBits(dev->mosi_gpio, dev->mosi_pin);
|
||||
IOLo(IOGetByTag(dev->mosiTag));
|
||||
}
|
||||
GPIO_SetBits(dev->sck_gpio, dev->sck_pin);
|
||||
IOHi(IOGetByTag(dev->sckTag));
|
||||
byte <<= 1;
|
||||
if (GPIO_ReadInputDataBit(dev->miso_gpio, dev->miso_pin) == 1) {
|
||||
if (IORead(IOGetByTag(dev->misoTag)) == 1) {
|
||||
byte |= 1;
|
||||
}
|
||||
GPIO_ResetBits(dev->sck_gpio, dev->sck_pin);
|
||||
IOLo(IOGetByTag(dev->sckTag));
|
||||
}
|
||||
return byte;
|
||||
}
|
||||
|
|
|
@ -17,17 +17,18 @@
|
|||
|
||||
#pragma once
|
||||
|
||||
#include "io_types.h"
|
||||
|
||||
typedef enum softSPIDevice {
|
||||
SOFT_SPIDEV_1 = 0,
|
||||
SOFT_SPIDEV_MAX = SOFT_SPIDEV_1,
|
||||
} softSPIDevice_e;
|
||||
|
||||
typedef struct softSPIDevice_s {
|
||||
GPIO_TypeDef* sck_gpio;
|
||||
uint16_t sck_pin;
|
||||
GPIO_TypeDef* mosi_gpio;
|
||||
uint16_t mosi_pin;
|
||||
GPIO_TypeDef* miso_gpio;
|
||||
uint16_t miso_pin;
|
||||
#ifdef SOFTSPI_NSS_PIN
|
||||
GPIO_TypeDef* nss_gpio;
|
||||
uint16_t nss_pin;
|
||||
#endif
|
||||
ioTag_t sckTag;
|
||||
ioTag_t mosiTag;
|
||||
ioTag_t misoTag;
|
||||
ioTag_t nssTag;
|
||||
} softSPIDevice_t;
|
||||
|
||||
|
||||
|
|
|
@ -15,7 +15,6 @@
|
|||
* along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
|
@ -23,9 +22,10 @@
|
|||
|
||||
#ifdef USE_FLASH_M25P16
|
||||
|
||||
#include "drivers/flash_m25p16.h"
|
||||
#include "drivers/bus_spi.h"
|
||||
#include "drivers/system.h"
|
||||
#include "flash_m25p16.h"
|
||||
#include "io.h"
|
||||
#include "bus_spi.h"
|
||||
#include "system.h"
|
||||
|
||||
#define M25P16_INSTRUCTION_RDID 0x9F
|
||||
#define M25P16_INSTRUCTION_READ_BYTES 0x03
|
||||
|
@ -44,11 +44,12 @@
|
|||
#define JEDEC_ID_MICRON_M25P16 0x202015
|
||||
#define JEDEC_ID_MICRON_N25Q064 0x20BA17
|
||||
#define JEDEC_ID_WINBOND_W25Q64 0xEF4017
|
||||
#define JEDEC_ID_MACRONIX_MX25L6406E 0xC22017
|
||||
#define JEDEC_ID_MICRON_N25Q128 0x20ba18
|
||||
#define JEDEC_ID_WINBOND_W25Q128 0xEF4018
|
||||
|
||||
#define DISABLE_M25P16 GPIO_SetBits(M25P16_CS_GPIO, M25P16_CS_PIN)
|
||||
#define ENABLE_M25P16 GPIO_ResetBits(M25P16_CS_GPIO, M25P16_CS_PIN)
|
||||
#define DISABLE_M25P16 IOHi(m25p16CsPin)
|
||||
#define ENABLE_M25P16 IOLo(m25p16CsPin)
|
||||
|
||||
// The timeout we expect between being able to issue page program instructions
|
||||
#define DEFAULT_TIMEOUT_MILLIS 6
|
||||
|
@ -59,6 +60,8 @@
|
|||
|
||||
static flashGeometry_t geometry = {.pageSize = M25P16_PAGESIZE};
|
||||
|
||||
static IO_t m25p16CsPin = IO_NONE;
|
||||
|
||||
/*
|
||||
* Whether we've performed an action that could have made the device busy for writes.
|
||||
*
|
||||
|
@ -92,7 +95,7 @@ static void m25p16_writeEnable()
|
|||
|
||||
static uint8_t m25p16_readStatus()
|
||||
{
|
||||
uint8_t command[2] = {M25P16_INSTRUCTION_READ_STATUS_REG, 0};
|
||||
uint8_t command[2] = { M25P16_INSTRUCTION_READ_STATUS_REG, 0 };
|
||||
uint8_t in[2];
|
||||
|
||||
ENABLE_M25P16;
|
||||
|
@ -131,7 +134,7 @@ bool m25p16_waitForReady(uint32_t timeoutMillis)
|
|||
*/
|
||||
static bool m25p16_readIdentification()
|
||||
{
|
||||
uint8_t out[] = { M25P16_INSTRUCTION_RDID, 0, 0, 0};
|
||||
uint8_t out[] = { M25P16_INSTRUCTION_RDID, 0, 0, 0 };
|
||||
uint8_t in[4];
|
||||
uint32_t chipID;
|
||||
|
||||
|
@ -161,6 +164,7 @@ static bool m25p16_readIdentification()
|
|||
break;
|
||||
case JEDEC_ID_MICRON_N25Q064:
|
||||
case JEDEC_ID_WINBOND_W25Q64:
|
||||
case JEDEC_ID_MACRONIX_MX25L6406E:
|
||||
geometry.sectors = 128;
|
||||
geometry.pagesPerSector = 256;
|
||||
break;
|
||||
|
@ -193,10 +197,36 @@ static bool m25p16_readIdentification()
|
|||
* Attempts to detect a connected m25p16. If found, true is returned and device capacity can be fetched with
|
||||
* m25p16_getGeometry().
|
||||
*/
|
||||
bool m25p16_init()
|
||||
bool m25p16_init(ioTag_t csTag)
|
||||
{
|
||||
/*
|
||||
if we have already detected a flash device we can simply exit
|
||||
|
||||
TODO: change the init param in favour of flash CFG when ParamGroups work is done
|
||||
then cs pin can be specified in hardware_revision.c or config.c (dependent on revision).
|
||||
*/
|
||||
if (geometry.sectors) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (csTag) {
|
||||
m25p16CsPin = IOGetByTag(csTag);
|
||||
} else {
|
||||
#ifdef M25P16_CS_PIN
|
||||
m25p16CsPin = IOGetByTag(IO_TAG(M25P16_CS_PIN));
|
||||
#else
|
||||
return false;
|
||||
#endif
|
||||
}
|
||||
IOInit(m25p16CsPin, OWNER_FLASH, RESOURCE_SPI_CS, 0);
|
||||
IOConfigGPIO(m25p16CsPin, SPI_IO_CS_CFG);
|
||||
|
||||
DISABLE_M25P16;
|
||||
|
||||
#ifndef M25P16_SPI_SHARED
|
||||
//Maximum speed for standard READ command is 20mHz, other commands tolerate 25mHz
|
||||
spiSetDivisor(M25P16_SPI_INSTANCE, SPI_18MHZ_CLOCK_DIVIDER);
|
||||
spiSetDivisor(M25P16_SPI_INSTANCE, SPI_CLOCK_FAST);
|
||||
#endif
|
||||
|
||||
return m25p16_readIdentification();
|
||||
}
|
||||
|
|
|
@ -19,10 +19,11 @@
|
|||
|
||||
#include <stdint.h>
|
||||
#include "flash.h"
|
||||
#include "io_types.h"
|
||||
|
||||
#define M25P16_PAGESIZE 256
|
||||
|
||||
bool m25p16_init();
|
||||
bool m25p16_init(ioTag_t csTag);
|
||||
|
||||
void m25p16_eraseSector(uint32_t address);
|
||||
void m25p16_eraseCompletely();
|
||||
|
|
|
@ -56,13 +56,14 @@ const struct ioPortDef_s ioPortDefs[] = {
|
|||
const char * const ownerNames[OWNER_TOTAL_COUNT] = {
|
||||
"FREE", "PWM", "PPM", "MOTOR", "SERVO", "SOFTSERIAL", "ADC", "SERIAL", "DEBUG", "TIMER",
|
||||
"SONAR", "SYSTEM", "SPI", "I2C", "SDCARD", "FLASH", "USB", "BEEPER", "OSD",
|
||||
"BARO", "MPU", "INVERTER", "LED STRIP", "LED", "RECEIVER", "TRANSMITTER"
|
||||
"BARO", "MPU", "INVERTER", "LED STRIP", "LED", "RECEIVER", "TRANSMITTER",
|
||||
"SOFTSPI", "NRF24"
|
||||
};
|
||||
|
||||
const char * const resourceNames[RESOURCE_TOTAL_COUNT] = {
|
||||
"", // NONE
|
||||
"IN", "OUT", "IN / OUT", "TIMER","UART TX","UART RX","UART TX/RX","EXTI","SCL",
|
||||
"SDA", "SCK","MOSI","MISO","CS","BATTERY","RSSI","EXT","CURRENT"
|
||||
"SDA", "SCK","MOSI","MISO","CS","BATTERY","RSSI","EXT","CURRENT", "CE"
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -30,6 +30,8 @@ typedef enum {
|
|||
OWNER_LED,
|
||||
OWNER_RX,
|
||||
OWNER_TX,
|
||||
OWNER_SOFTSPI,
|
||||
OWNER_NRF24,
|
||||
OWNER_TOTAL_COUNT
|
||||
} resourceOwner_t;
|
||||
|
||||
|
@ -46,6 +48,7 @@ typedef enum {
|
|||
RESOURCE_I2C_SCL, RESOURCE_I2C_SDA,
|
||||
RESOURCE_SPI_SCK, RESOURCE_SPI_MOSI, RESOURCE_SPI_MISO, RESOURCE_SPI_CS,
|
||||
RESOURCE_ADC_BATTERY, RESOURCE_ADC_RSSI, RESOURCE_ADC_EXTERNAL1, RESOURCE_ADC_CURRENT,
|
||||
RESOURCE_NRF24_CE,
|
||||
RESOURCE_TOTAL_COUNT
|
||||
} resourceType_t;
|
||||
|
||||
|
|
|
@ -26,8 +26,12 @@
|
|||
|
||||
#ifdef USE_RX_NRF24
|
||||
|
||||
#include "build_config.h"
|
||||
#include "system.h"
|
||||
#include "gpio.h"
|
||||
#include "io.h"
|
||||
#include "io_impl.h"
|
||||
#include "rcc.h"
|
||||
#include "rx_nrf24l01.h"
|
||||
|
||||
#ifdef UNIT_TEST
|
||||
|
@ -41,25 +45,20 @@ void NRF24L01_SpiInit(void) {}
|
|||
#include "bus_spi.h"
|
||||
#include "bus_spi_soft.h"
|
||||
|
||||
#define DISABLE_NRF24() {GPIO_SetBits(NRF24_CSN_GPIO, NRF24_CSN_PIN);}
|
||||
#define ENABLE_NRF24() {GPIO_ResetBits(NRF24_CSN_GPIO, NRF24_CSN_PIN);}
|
||||
#define NRF24_CE_HI() {GPIO_SetBits(NRF24_CE_GPIO, NRF24_CE_PIN);}
|
||||
#define NRF24_CE_LO() {GPIO_ResetBits(NRF24_CE_GPIO, NRF24_CE_PIN);}
|
||||
#define DISABLE_NRF24() {IOHi(IOGetByTag(IO_TAG(NRF24_CSN_PIN)));}
|
||||
#define ENABLE_NRF24() {IOLo(IOGetByTag(IO_TAG(NRF24_CSN_PIN)));}
|
||||
#define NRF24_CE_HI() {IOHi(IOGetByTag(IO_TAG(NRF24_CE_PIN)));}
|
||||
#define NRF24_CE_LO() {IOLo(IOGetByTag(IO_TAG(NRF24_CE_PIN)));}
|
||||
|
||||
#ifdef USE_NRF24_SOFTSPI
|
||||
static const softSPIDevice_t softSPIDevice = {
|
||||
.sck_gpio = NRF24_SCK_GPIO,
|
||||
.mosi_gpio = NRF24_MOSI_GPIO,
|
||||
.miso_gpio = NRF24_MISO_GPIO,
|
||||
.sck_pin = NRF24_SCK_PIN,
|
||||
.mosi_pin = NRF24_MOSI_PIN,
|
||||
.miso_pin = NRF24_MISO_PIN,
|
||||
#ifdef SOFTSPI_NSS_PIN
|
||||
.nss_pin = NRF24_CSN_PIN,
|
||||
.nss_gpio = NRF24_CSN_GPIO
|
||||
#endif
|
||||
.sckTag = IO_TAG(NRF24_SCK_PIN),
|
||||
.mosiTag = IO_TAG(NRF24_MOSI_PIN),
|
||||
.misoTag = IO_TAG(NRF24_MISO_PIN),
|
||||
// Note: Nordic Semiconductor uses 'CSN', STM uses 'NSS'
|
||||
.nssTag = IO_TAG(NRF24_CSN_PIN),
|
||||
};
|
||||
#endif
|
||||
#endif // USE_NRF24_SOFTSPI
|
||||
|
||||
#ifdef USE_NRF24_SOFTSPI
|
||||
static bool useSoftSPI = false;
|
||||
|
@ -71,39 +70,35 @@ void NRF24L01_SpiInit(nfr24l01_spi_type_e spiType)
|
|||
if (hardwareInitialised) {
|
||||
return;
|
||||
}
|
||||
if (spiType == NFR24L01_SOFTSPI) {
|
||||
|
||||
#ifdef USE_NRF24_SOFTSPI
|
||||
if (spiType == NFR24L01_SOFTSPI) {
|
||||
useSoftSPI = true;
|
||||
softSpiInit(&softSPIDevice);
|
||||
#endif
|
||||
}
|
||||
// Note: Nordic Semiconductor uses 'CSN', STM uses 'NSS'
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||
#if defined(STM32F10X)
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
|
||||
#endif
|
||||
#ifdef STM32F303xC
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
|
||||
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
|
||||
#endif
|
||||
#ifndef SOFTSPI_NSS_PIN
|
||||
// CSN as output
|
||||
const SPIDevice nrf24SPIDevice = SOFT_SPIDEV_1;
|
||||
#else
|
||||
UNUSED(spiType);
|
||||
const SPIDevice nrf24SPIDevice = spiDeviceByInstance(NRF24_SPI_INSTANCE);
|
||||
IOInit(IOGetByTag(IO_TAG(NRF24_CSN_PIN)), OWNER_SPI, RESOURCE_SPI_CS, nrf24SPIDevice + 1);
|
||||
#endif // USE_NRF24_SOFTSPI
|
||||
|
||||
RCC_AHBPeriphClockCmd(NRF24_CSN_GPIO_CLK_PERIPHERAL, ENABLE);
|
||||
GPIO_InitStructure.GPIO_Pin = NRF24_CSN_PIN;
|
||||
GPIO_Init(NRF24_CSN_GPIO, &GPIO_InitStructure);
|
||||
#endif
|
||||
|
||||
// CE as OUTPUT
|
||||
RCC_AHBPeriphClockCmd(NRF24_CE_GPIO_CLK_PERIPHERAL, ENABLE);
|
||||
GPIO_InitStructure.GPIO_Pin = NRF24_CE_PIN;
|
||||
GPIO_Init(NRF24_CE_GPIO, &GPIO_InitStructure);
|
||||
IOInit(IOGetByTag(IO_TAG(NRF24_CE_PIN)), OWNER_NRF24, RESOURCE_NRF24_CE, nrf24SPIDevice + 1);
|
||||
#if defined(STM32F10X)
|
||||
IOConfigGPIO(IOGetByTag(IO_TAG(NRF24_CE_PIN)), SPI_IO_CS_CFG);
|
||||
#elif defined(STM32F3) || defined(STM32F4)
|
||||
IOConfigGPIOAF(IOGetByTag(IO_TAG(NRF24_CE_PIN)), SPI_IO_CS_CFG, 0);
|
||||
#endif
|
||||
|
||||
DISABLE_NRF24();
|
||||
NRF24_CE_LO();
|
||||
|
||||
#ifdef NRF24_SPI_INSTANCE
|
||||
spiSetDivisor(NRF24_SPI_INSTANCE, SPI_9MHZ_CLOCK_DIVIDER);
|
||||
spiSetDivisor(NRF24_SPI_INSTANCE, SPI_CLOCK_STANDARD);
|
||||
#endif
|
||||
hardwareInitialised = true;
|
||||
}
|
||||
|
|
|
@ -15,37 +15,35 @@
|
|||
* along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "sdcard.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <platform.h>
|
||||
|
||||
#include "nvic.h"
|
||||
#include "gpio.h"
|
||||
|
||||
#include "drivers/bus_spi.h"
|
||||
#include "drivers/system.h"
|
||||
|
||||
#include "sdcard_standard.h"
|
||||
#include "platform.h"
|
||||
|
||||
#ifdef USE_SDCARD
|
||||
|
||||
#include "nvic.h"
|
||||
#include "io.h"
|
||||
|
||||
#include "bus_spi.h"
|
||||
#include "system.h"
|
||||
|
||||
#include "sdcard.h"
|
||||
#include "sdcard_standard.h"
|
||||
|
||||
#ifdef AFATFS_USE_INTROSPECTIVE_LOGGING
|
||||
#define SDCARD_PROFILING
|
||||
#endif
|
||||
|
||||
#define SET_CS_HIGH GPIO_SetBits(SDCARD_SPI_CS_GPIO, SDCARD_SPI_CS_PIN)
|
||||
#define SET_CS_LOW GPIO_ResetBits(SDCARD_SPI_CS_GPIO, SDCARD_SPI_CS_PIN)
|
||||
#define SET_CS_HIGH IOHi(sdCardCsPin)
|
||||
#define SET_CS_LOW IOLo(sdCardCsPin)
|
||||
|
||||
#define SDCARD_INIT_NUM_DUMMY_BYTES 10
|
||||
#define SDCARD_MAXIMUM_BYTE_DELAY_FOR_CMD_REPLY 8
|
||||
// Chosen so that CMD8 will have the same CRC as CMD0:
|
||||
#define SDCARD_IF_COND_CHECK_PATTERN 0xAB
|
||||
|
||||
#define SDCARD_TIMEOUT_INIT_MILLIS 2000
|
||||
#define SDCARD_TIMEOUT_INIT_MILLIS 200
|
||||
#define SDCARD_MAX_CONSECUTIVE_FAILURES 8
|
||||
|
||||
/* Break up 512-byte SD card sectors into chunks of this size when writing without DMA to reduce the peak overhead
|
||||
|
@ -117,25 +115,27 @@ static sdcard_t sdcard;
|
|||
|
||||
STATIC_ASSERT(sizeof(sdcardCSD_t) == 16, sdcard_csd_bitfields_didnt_pack_properly);
|
||||
|
||||
#ifdef SDCARD_DETECT_PIN
|
||||
static IO_t sdCardDetectPin = IO_NONE;
|
||||
#endif
|
||||
|
||||
static IO_t sdCardCsPin = IO_NONE;
|
||||
|
||||
void sdcardInsertionDetectDeinit(void)
|
||||
{
|
||||
#ifdef SDCARD_DETECT_PIN
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
|
||||
GPIO_InitStructure.GPIO_Pin = SDCARD_DETECT_PIN;
|
||||
GPIO_Init(SDCARD_DETECT_GPIO_PORT, &GPIO_InitStructure);
|
||||
sdCardDetectPin = IOGetByTag(IO_TAG(SDCARD_DETECT_PIN));
|
||||
IOInit(sdCardDetectPin, OWNER_FREE, RESOURCE_NONE, 0);
|
||||
IOConfigGPIO(sdCardDetectPin, IOCFG_IN_FLOATING);
|
||||
#endif
|
||||
}
|
||||
|
||||
void sdcardInsertionDetectInit(void)
|
||||
{
|
||||
#ifdef SDCARD_DETECT_PIN
|
||||
GPIO_InitTypeDef GPIO_InitStructure;
|
||||
|
||||
GPIO_InitStructure.GPIO_Pin = SDCARD_DETECT_PIN;
|
||||
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
|
||||
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
|
||||
GPIO_Init(SDCARD_DETECT_GPIO_PORT, &GPIO_InitStructure);
|
||||
sdCardDetectPin = IOGetByTag(IO_TAG(SDCARD_DETECT_PIN));
|
||||
IOInit(sdCardDetectPin, OWNER_SDCARD, RESOURCE_INPUT, 0);
|
||||
IOConfigGPIO(sdCardDetectPin, IOCFG_IPU);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -148,7 +148,7 @@ bool sdcard_isInserted(void)
|
|||
|
||||
#ifdef SDCARD_DETECT_PIN
|
||||
|
||||
result = (GPIO_ReadInputData(SDCARD_DETECT_GPIO_PORT) & SDCARD_DETECT_PIN) != 0;
|
||||
result = IORead(sdCardDetectPin) != 0;
|
||||
|
||||
#ifdef SDCARD_DETECT_INVERTED
|
||||
result = !result;
|
||||
|
@ -192,6 +192,11 @@ static void sdcard_deselect(void)
|
|||
*/
|
||||
static void sdcard_reset(void)
|
||||
{
|
||||
if (!sdcard_isInserted()) {
|
||||
sdcard.state = SDCARD_STATE_NOT_PRESENT;
|
||||
return;
|
||||
}
|
||||
|
||||
if (sdcard.state >= SDCARD_STATE_READY) {
|
||||
spiSetDivisor(SDCARD_SPI_INSTANCE, SDCARD_SPI_INITIALIZATION_CLOCK_DIVIDER);
|
||||
}
|
||||
|
@ -407,22 +412,32 @@ static void sdcard_sendDataBlockBegin(uint8_t *buffer, bool multiBlockWrite)
|
|||
spiTransferByte(SDCARD_SPI_INSTANCE, multiBlockWrite ? SDCARD_MULTIPLE_BLOCK_WRITE_START_TOKEN : SDCARD_SINGLE_BLOCK_WRITE_START_TOKEN);
|
||||
|
||||
if (useDMAForTx) {
|
||||
#ifdef SDCARD_DMA_CHANNEL_TX
|
||||
// Queue the transmission of the sector payload
|
||||
#ifdef SDCARD_DMA_CLK
|
||||
RCC_AHB1PeriphClockCmd(SDCARD_DMA_CLK, ENABLE);
|
||||
#endif
|
||||
DMA_InitTypeDef DMA_InitStructure;
|
||||
|
||||
DMA_StructInit(&DMA_InitStructure);
|
||||
#ifdef SDCARD_DMA_CHANNEL
|
||||
DMA_InitStructure.DMA_Channel = SDCARD_DMA_CHANNEL;
|
||||
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t) buffer;
|
||||
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
|
||||
#else
|
||||
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
|
||||
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) buffer;
|
||||
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
|
||||
#endif
|
||||
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &SDCARD_SPI_INSTANCE->DR;
|
||||
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
|
||||
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
|
||||
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
|
||||
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
|
||||
|
||||
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
|
||||
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t) buffer;
|
||||
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
|
||||
|
||||
DMA_InitStructure.DMA_BufferSize = SDCARD_BLOCK_SIZE;
|
||||
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
|
||||
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
|
||||
|
||||
DMA_DeInit(SDCARD_DMA_CHANNEL_TX);
|
||||
|
@ -431,7 +446,9 @@ static void sdcard_sendDataBlockBegin(uint8_t *buffer, bool multiBlockWrite)
|
|||
DMA_Cmd(SDCARD_DMA_CHANNEL_TX, ENABLE);
|
||||
|
||||
SPI_I2S_DMACmd(SDCARD_SPI_INSTANCE, SPI_I2S_DMAReq_Tx, ENABLE);
|
||||
} else {
|
||||
#endif
|
||||
}
|
||||
else {
|
||||
// Send the first chunk now
|
||||
spiTransfer(SDCARD_SPI_INSTANCE, NULL, buffer, SDCARD_NON_DMA_CHUNK_SIZE);
|
||||
}
|
||||
|
@ -532,6 +549,12 @@ void sdcard_init(bool useDMA)
|
|||
(void) useDMA;
|
||||
#endif
|
||||
|
||||
#ifdef SDCARD_SPI_CS_PIN
|
||||
sdCardCsPin = IOGetByTag(IO_TAG(SDCARD_SPI_CS_PIN));
|
||||
IOInit(sdCardCsPin, OWNER_SDCARD, RESOURCE_SPI_CS, 0);
|
||||
IOConfigGPIO(sdCardCsPin, SPI_IO_CS_CFG);
|
||||
#endif // SDCARD_SPI_CS_PIN
|
||||
|
||||
// Max frequency is initially 400kHz
|
||||
spiSetDivisor(SDCARD_SPI_INSTANCE, SDCARD_SPI_INITIALIZATION_CLOCK_DIVIDER);
|
||||
|
||||
|
@ -544,7 +567,13 @@ void sdcard_init(bool useDMA)
|
|||
spiTransfer(SDCARD_SPI_INSTANCE, NULL, NULL, SDCARD_INIT_NUM_DUMMY_BYTES);
|
||||
|
||||
// Wait for that transmission to finish before we enable the SDCard, so it receives the required number of cycles:
|
||||
int time = 100000;
|
||||
while (spiIsBusBusy(SDCARD_SPI_INSTANCE)) {
|
||||
if (time-- == 0) {
|
||||
sdcard.state = SDCARD_STATE_NOT_PRESENT;
|
||||
sdcard.failureCount++;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
sdcard.operationStartTime = millis();
|
||||
|
@ -699,8 +728,14 @@ bool sdcard_poll(void)
|
|||
// Have we finished sending the write yet?
|
||||
sendComplete = false;
|
||||
|
||||
#ifdef SDCARD_DMA_CHANNEL_TX
|
||||
#ifdef SDCARD_DMA_CHANNEL
|
||||
if (useDMAForTx && DMA_GetFlagStatus(SDCARD_DMA_CHANNEL_TX, SDCARD_DMA_CHANNEL_TX_COMPLETE_FLAG) == SET) {
|
||||
DMA_ClearFlag(SDCARD_DMA_CHANNEL_TX, SDCARD_DMA_CHANNEL_TX_COMPLETE_FLAG);
|
||||
#else
|
||||
if (useDMAForTx && DMA_GetFlagStatus(SDCARD_DMA_CHANNEL_TX_COMPLETE_FLAG) == SET) {
|
||||
DMA_ClearFlag(SDCARD_DMA_CHANNEL_TX_COMPLETE_FLAG);
|
||||
#endif
|
||||
|
||||
DMA_Cmd(SDCARD_DMA_CHANNEL_TX, DISABLE);
|
||||
|
||||
|
@ -717,7 +752,7 @@ bool sdcard_poll(void)
|
|||
|
||||
sendComplete = true;
|
||||
}
|
||||
|
||||
#endif
|
||||
if (!useDMAForTx) {
|
||||
// Send another chunk
|
||||
spiTransfer(SDCARD_SPI_INSTANCE, NULL, sdcard.pendingOperation.buffer + SDCARD_NON_DMA_CHUNK_SIZE * sdcard.pendingOperation.chunkIndex, SDCARD_NON_DMA_CHUNK_SIZE);
|
||||
|
|
|
@ -44,6 +44,8 @@
|
|||
#include "drivers/serial.h"
|
||||
#include "drivers/bus_i2c.h"
|
||||
#include "drivers/gpio.h"
|
||||
#include "drivers/io.h"
|
||||
#include "drivers/io_impl.h"
|
||||
#include "drivers/timer.h"
|
||||
#include "drivers/pwm_rx.h"
|
||||
#include "drivers/sdcard.h"
|
||||
|
@ -135,6 +137,9 @@ static void cliVersion(char *cmdline);
|
|||
static void cliRxRange(char *cmdline);
|
||||
static void cliPFlags(char *cmdline);
|
||||
|
||||
#ifndef SKIP_TASK_STATISTICS
|
||||
static void cliResource(char *cmdline);
|
||||
#endif
|
||||
#ifdef GPS
|
||||
static void cliGpsPassthrough(char *cmdline);
|
||||
#endif
|
||||
|
@ -296,6 +301,9 @@ const clicmd_t cmdTable[] = {
|
|||
CLI_COMMAND_DEF("profile", "change profile",
|
||||
"[<index>]", cliProfile),
|
||||
CLI_COMMAND_DEF("rateprofile", "change rate profile", "[<index>]", cliRateProfile),
|
||||
#ifndef SKIP_TASK_STATISTICS
|
||||
CLI_COMMAND_DEF("resource", "view currently used resources", NULL, cliResource),
|
||||
#endif
|
||||
CLI_COMMAND_DEF("rxrange", "configure rx channel ranges", NULL, cliRxRange),
|
||||
CLI_COMMAND_DEF("rxfail", "show/set rx failsafe settings", NULL, cliRxFail),
|
||||
CLI_COMMAND_DEF("save", "save and reboot", NULL, cliSave),
|
||||
|
@ -2901,6 +2909,27 @@ void cliProcess(void)
|
|||
}
|
||||
}
|
||||
|
||||
#ifndef SKIP_TASK_STATISTICS
|
||||
static void cliResource(char *cmdline)
|
||||
{
|
||||
UNUSED(cmdline);
|
||||
cliPrintf("IO:\r\n----------------------\r\n");
|
||||
for (unsigned i = 0; i < DEFIO_IO_USED_COUNT; i++) {
|
||||
const char* owner;
|
||||
owner = ownerNames[ioRecs[i].owner];
|
||||
|
||||
const char* resource;
|
||||
resource = resourceNames[ioRecs[i].resource];
|
||||
|
||||
if (ioRecs[i].index > 0) {
|
||||
cliPrintf("%c%02d: %s%d %s\r\n", IO_GPIOPortIdx(ioRecs + i) + 'A', IO_GPIOPinIdx(ioRecs + i), owner, ioRecs[i].index, resource);
|
||||
} else {
|
||||
cliPrintf("%c%02d: %s %s\r\n", IO_GPIOPortIdx(ioRecs + i) + 'A', IO_GPIOPinIdx(ioRecs + i), owner, resource);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void cliInit(serialConfig_t *serialConfig)
|
||||
{
|
||||
UNUSED(serialConfig);
|
||||
|
|
|
@ -309,8 +309,21 @@ void init(void)
|
|||
|
||||
|
||||
#ifdef USE_SPI
|
||||
spiInit(SPI1);
|
||||
spiInit(SPI2);
|
||||
#ifdef USE_SPI_DEVICE_1
|
||||
spiInit(SPIDEV_1);
|
||||
#endif
|
||||
#ifdef USE_SPI_DEVICE_2
|
||||
spiInit(SPIDEV_2);
|
||||
#endif
|
||||
#ifdef USE_SPI_DEVICE_3
|
||||
#ifdef ALIENFLIGHTF3
|
||||
if (hardwareRevision == AFF3_REV_2) {
|
||||
spiInit(SPIDEV_3);
|
||||
}
|
||||
#else
|
||||
spiInit(SPIDEV_3);
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef USE_HARDWARE_REVISION_DETECTION
|
||||
|
@ -475,10 +488,10 @@ void init(void)
|
|||
#ifdef USE_FLASHFS
|
||||
#ifdef NAZE
|
||||
if (hardwareRevision == NAZE32_REV5) {
|
||||
m25p16_init();
|
||||
m25p16_init(IOTAG_NONE);
|
||||
}
|
||||
#elif defined(USE_FLASH_M25P16)
|
||||
m25p16_init();
|
||||
m25p16_init(IOTAG_NONE);
|
||||
#endif
|
||||
|
||||
flashfsInit();
|
||||
|
|
|
@ -86,13 +86,11 @@
|
|||
#define USE_SPI
|
||||
#define USE_SPI_DEVICE_3
|
||||
|
||||
#define M25P16_CS_GPIO GPIOA
|
||||
#define M25P16_CS_PIN GPIO_Pin_15
|
||||
#define M25P16_CS_PIN PA15
|
||||
#define M25P16_SPI_INSTANCE SPI3
|
||||
|
||||
#define MPU6500_CS_GPIO_CLK_PERIPHERAL RCC_AHBPeriph_GPIOA
|
||||
#define MPU6500_CS_GPIO GPIOA
|
||||
#define MPU6500_CS_PIN GPIO_Pin_15
|
||||
#define MPU6500_CS_PIN PA15
|
||||
#define MPU6500_SPI_INSTANCE SPI3
|
||||
|
||||
#define USE_ADC
|
||||
|
|
|
@ -37,12 +37,10 @@
|
|||
#define USE_I2C
|
||||
#define I2C_DEVICE (I2CDEV_2) // Flex port - SCL/PB10, SDA/PB11
|
||||
|
||||
#define MPU6000_CS_GPIO GPIOA
|
||||
#define MPU6000_CS_PIN GPIO_Pin_4
|
||||
#define MPU6000_CS_PIN PA4
|
||||
#define MPU6000_SPI_INSTANCE SPI1
|
||||
|
||||
#define M25P16_CS_GPIO GPIOB
|
||||
#define M25P16_CS_PIN GPIO_Pin_12
|
||||
#define M25P16_CS_PIN PB12
|
||||
#define M25P16_SPI_INSTANCE SPI2
|
||||
|
||||
#define USE_FLASHFS
|
||||
|
@ -58,7 +56,7 @@
|
|||
|
||||
// External I2C BARO
|
||||
#define BARO
|
||||
#define USE_BARO_MS5611
|
||||
//#define USE_BARO_MS5611
|
||||
#define USE_BARO_BMP085
|
||||
#define USE_BARO_BMP280
|
||||
|
||||
|
@ -106,18 +104,14 @@
|
|||
// RC8 PA1/TIM2 CE / RX_PPM
|
||||
|
||||
// Nordic Semiconductor uses 'CSN', STM uses 'NSS'
|
||||
#define NRF24_CE_GPIO GPIOA
|
||||
#define NRF24_CE_PIN GPIO_Pin_1
|
||||
#define NRF24_CE_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOA
|
||||
#define NRF24_CSN_GPIO GPIOA
|
||||
#define NRF24_CSN_PIN GPIO_Pin_0
|
||||
#define NRF24_CSN_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOA
|
||||
#define NRF24_SCK_GPIO GPIOB
|
||||
#define NRF24_SCK_PIN GPIO_Pin_5
|
||||
#define NRF24_MOSI_GPIO GPIOB
|
||||
#define NRF24_MOSI_PIN GPIO_Pin_1
|
||||
#define NRF24_MISO_GPIO GPIOB
|
||||
#define NRF24_MISO_PIN GPIO_Pin_0
|
||||
#define NRF24_CSN_PIN PA0
|
||||
#define NRF24_CE_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOA
|
||||
#define NRF24_CE_PIN PA1
|
||||
#define NRF24_CSN_PIN PA0
|
||||
#define NRF24_SCK_PIN PB5
|
||||
#define NRF24_MOSI_PIN PB1
|
||||
#define NRF24_MISO_PIN PB0
|
||||
|
||||
#define SERIAL_PORT_COUNT 3
|
||||
|
||||
|
@ -162,7 +156,7 @@
|
|||
//#define USE_SERIAL_4WAY_BLHELI_INTERFACE
|
||||
|
||||
//#define SONAR
|
||||
#define USE_SONAR_SRF10
|
||||
//#define USE_SONAR_SRF10
|
||||
#define SONAR_ECHO_PIN PB0
|
||||
#define SONAR_TRIGGER_PIN PB5
|
||||
|
||||
|
@ -195,12 +189,15 @@
|
|||
#undef SERIAL_RX
|
||||
#undef SPEKTRUM_BIND
|
||||
|
||||
#else
|
||||
#define TARGET_MOTOR_COUNT 6
|
||||
#define DISABLE_UNCOMMON_MIXERS
|
||||
#endif //OPBL
|
||||
|
||||
|
||||
#define SKIP_RX_MSP
|
||||
#ifdef USE_RX_NRF24
|
||||
#define SKIP_RX_PWM_PPM
|
||||
#define SKIP_RX_MSP
|
||||
#undef SERIAL_RX
|
||||
#undef SPEKTRUM_BIND
|
||||
#undef TELEMETRY
|
||||
|
|
|
@ -35,8 +35,7 @@
|
|||
|
||||
#define L3GD20_SPI SPI1
|
||||
#define L3GD20_CS_GPIO_CLK_PERIPHERAL RCC_AHBPeriph_GPIOE
|
||||
#define L3GD20_CS_GPIO GPIOE
|
||||
#define L3GD20_CS_PIN GPIO_Pin_3
|
||||
#define L3GD20_CS_PIN PE3
|
||||
|
||||
#define GYRO_L3GD20_ALIGN CW270_DEG
|
||||
#define GYRO_MPU6050_ALIGN CW0_DEG
|
||||
|
|
|
@ -20,8 +20,6 @@
|
|||
#define TARGET_BOARD_IDENTIFIER "CJM1" // CJMCU
|
||||
#define USE_HARDWARE_REVISION_DETECTION
|
||||
|
||||
#define BRUSHED_MOTORS
|
||||
|
||||
#define LED0 PC14
|
||||
#define LED1 PC13
|
||||
#define LED2 PC15
|
||||
|
@ -35,7 +33,7 @@
|
|||
#define USE_ACC_MPU6050
|
||||
|
||||
//#define MAG
|
||||
#define USE_MAG_HMC5883
|
||||
//#define USE_MAG_HMC5883
|
||||
|
||||
#define USE_UART1
|
||||
#define USE_UART2
|
||||
|
@ -54,22 +52,27 @@
|
|||
#define USE_NRF24_SPI1
|
||||
|
||||
// Nordic Semiconductor uses 'CSN', STM uses 'NSS'
|
||||
#define NRF24_CE_GPIO GPIOA
|
||||
#define NRF24_CE_PIN GPIO_Pin_4
|
||||
#define NRF24_CE_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOA
|
||||
#define NRF24_CSN_GPIO GPIOA
|
||||
#define NRF24_CSN_PIN GPIO_Pin_11
|
||||
#define NRF24_CSN_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOA
|
||||
#define NRF24_IRQ_GPIO GPIOA
|
||||
#define NRF24_IRQ_PIN GPIO_Pin_8
|
||||
#define NRF24_IRQ_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOA
|
||||
#define NRF24_CE_PIN PA4
|
||||
#define NRF24_CSN_PIN PA11
|
||||
#define NRF24_SCK_PIN PA5
|
||||
#define NRF24_MISO_PIN PA6
|
||||
#define NRF24_MOSI_PIN PA7
|
||||
#define NRF24_IRQ_PIN PA8
|
||||
// CJMCU has NSS on PA11, rather than the standard PA4
|
||||
#define SPI1_NSS_PIN NRF24_CSN_PIN
|
||||
#define SPI1_SCK_PIN NRF24_SCK_PIN
|
||||
#define SPI1_MISO_PIN NRF24_MISO_PIN
|
||||
#define SPI1_MOSI_PIN NRF24_MOSI_PIN
|
||||
|
||||
#define USE_RX_NRF24
|
||||
#define USE_RX_CX10
|
||||
#define USE_RX_H8_3D
|
||||
#define USE_RX_REF
|
||||
#define USE_RX_SYMA
|
||||
#define USE_RX_V202
|
||||
//#define USE_RX_SYMA
|
||||
//#define USE_RX_V202
|
||||
//#define NRF24_DEFAULT_PROTOCOL NRF24RX_SYMA_X5C
|
||||
//#define NRF24_DEFAULT_PROTOCOL NRF24RX_REF
|
||||
#define NRF24_DEFAULT_PROTOCOL NRF24RX_H8_3D
|
||||
|
@ -78,25 +81,26 @@
|
|||
|
||||
#define DEFAULT_RX_FEATURE FEATURE_RX_NRF24
|
||||
#define SKIP_RX_PWM_PPM
|
||||
#undef SERIAL_RX
|
||||
#undef SKIP_TASK_STATISTICS
|
||||
#else
|
||||
#define DEFAULT_RX_FEATURE FEATURE_RX_PPM
|
||||
#undef SKIP_RX_MSP
|
||||
|
||||
#define SPEKTRUM_BIND
|
||||
// SART2, PA3
|
||||
// UART2, PA3
|
||||
#define BIND_PIN PA3
|
||||
#endif //USE_RX_NRF24
|
||||
|
||||
#define BRUSHED_MOTORS
|
||||
#define DEFAULT_FEATURES FEATURE_MOTOR_STOP
|
||||
#define SKIP_SERIAL_PASSTHROUGH
|
||||
|
||||
// Since the CJMCU PCB has holes for 4 motors in each corner we can save same flash space by disabling support for other mixers.
|
||||
#define USE_QUAD_MIXER_ONLY
|
||||
#undef USE_SERVOS
|
||||
|
||||
#if (FLASH_SIZE <= 64)
|
||||
//#define SKIP_TASK_STATISTICS
|
||||
//#define SKIP_CLI_COMMAND_HELP
|
||||
#undef SERIAL_RX
|
||||
#undef BLACKBOX
|
||||
#endif
|
||||
|
||||
|
|
|
@ -35,25 +35,19 @@
|
|||
//#define DEBUG_MPU_DATA_READY_INTERRUPT
|
||||
|
||||
#define MPU6500_CS_GPIO_CLK_PERIPHERAL RCC_AHBPeriph_GPIOA
|
||||
#define MPU6500_CS_GPIO GPIOA
|
||||
#define MPU6500_CS_PIN GPIO_Pin_4
|
||||
#define MPU6500_CS_PIN PA4
|
||||
#define MPU6500_SPI_INSTANCE SPI1
|
||||
|
||||
#define MPU6000_CS_GPIO GPIOA
|
||||
#define MPU6000_CS_PIN GPIO_Pin_4
|
||||
#define MPU6000_CS_PIN PA4
|
||||
#define MPU6000_SPI_INSTANCE SPI1
|
||||
|
||||
#define USE_SPI
|
||||
#define USE_SPI_DEVICE_1
|
||||
|
||||
#define SPI1_GPIO GPIOB
|
||||
#define SPI1_GPIO_PERIPHERAL RCC_AHBPeriph_GPIOB
|
||||
#define SPI1_SCK_PIN GPIO_Pin_3
|
||||
#define SPI1_SCK_PIN_SOURCE GPIO_PinSource3
|
||||
#define SPI1_MISO_PIN GPIO_Pin_4
|
||||
#define SPI1_MISO_PIN_SOURCE GPIO_PinSource4
|
||||
#define SPI1_MOSI_PIN GPIO_Pin_5
|
||||
#define SPI1_MOSI_PIN_SOURCE GPIO_PinSource5
|
||||
#define SPI1_SCK_PIN PB3
|
||||
#define SPI1_MISO_PIN PB4
|
||||
#define SPI1_MOSI_PIN PB5
|
||||
|
||||
#define GYRO
|
||||
#define USE_GYRO_MPU6500
|
||||
|
|
|
@ -34,8 +34,8 @@
|
|||
#define BARO
|
||||
#define USE_BARO_MS5611
|
||||
|
||||
#define MAG
|
||||
#define USE_MAG_HMC5883
|
||||
//#define MAG
|
||||
//#define USE_MAG_HMC5883
|
||||
|
||||
#define USE_UART1
|
||||
#define SERIAL_PORT_COUNT 1
|
||||
|
@ -48,6 +48,8 @@
|
|||
|
||||
#define DEFAULT_RX_FEATURE FEATURE_RX_NRF24
|
||||
#define USE_RX_NRF24
|
||||
//#define USE_RX_CX10
|
||||
//#define USE_RX_H8_3D
|
||||
#define USE_RX_SYMA
|
||||
#define USE_RX_V202
|
||||
#define NRF24_DEFAULT_PROTOCOL NRF24RX_V202_1M
|
||||
|
@ -59,14 +61,11 @@
|
|||
#define USE_NRF24_SPI1
|
||||
|
||||
// Nordic Semiconductor uses 'CSN', STM uses 'NSS'
|
||||
#define NRF24_CE_GPIO GPIOA
|
||||
#define NRF24_CE_PIN GPIO_Pin_12
|
||||
#define NRF24_CE_PIN PA12
|
||||
#define NRF24_CE_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOA
|
||||
#define NRF24_CSN_GPIO GPIOA
|
||||
#define NRF24_CSN_PIN GPIO_Pin_4
|
||||
#define NRF24_CSN_PIN PA4
|
||||
#define NRF24_CSN_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOA
|
||||
#define NRF24_IRQ_GPIO GPIOA
|
||||
#define NRF24_IRQ_PIN GPIO_Pin_15
|
||||
#define NRF24_IRQ_PIN PA15
|
||||
#define NRF24_IRQ_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOA
|
||||
|
||||
#define SKIP_RX_MSP
|
||||
|
|
|
@ -25,13 +25,11 @@
|
|||
#define INVERTER PB2
|
||||
#define INVERTER_USART USART2
|
||||
|
||||
#define MPU6000_CS_GPIO GPIOB
|
||||
#define MPU6000_CS_PIN GPIO_Pin_12
|
||||
#define MPU6000_CS_PIN PB12
|
||||
#define MPU6000_SPI_INSTANCE SPI2
|
||||
|
||||
#define MPU6500_CS_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOB
|
||||
#define MPU6500_CS_GPIO GPIOB
|
||||
#define MPU6500_CS_PIN GPIO_Pin_12
|
||||
#define MPU6500_CS_PIN PB12
|
||||
#define MPU6500_SPI_INSTANCE SPI2
|
||||
|
||||
#define GYRO
|
||||
|
|
|
@ -31,14 +31,10 @@
|
|||
#define USE_MPU_DATA_READY_SIGNAL
|
||||
#define ENSURE_MPU_DATA_READY_IS_LOW
|
||||
|
||||
#define MPU6000_CS_GPIO_CLK_PERIPHERAL RCC_AHBPeriph_GPIOA
|
||||
#define MPU6000_CS_GPIO GPIOA
|
||||
#define MPU6000_CS_PIN GPIO_Pin_4
|
||||
#define MPU6000_CS_PIN PA4
|
||||
#define MPU6000_SPI_INSTANCE SPI1
|
||||
|
||||
#define MPU6500_CS_GPIO_CLK_PERIPHERAL RCC_AHBPeriph_GPIOA
|
||||
#define MPU6500_CS_GPIO GPIOA
|
||||
#define MPU6500_CS_PIN GPIO_Pin_4
|
||||
#define MPU6500_CS_PIN PA4
|
||||
#define MPU6500_SPI_INSTANCE SPI1
|
||||
|
||||
#define GYRO
|
||||
|
@ -68,16 +64,10 @@
|
|||
#define USE_SPI_DEVICE_1
|
||||
#define USE_SPI_DEVICE_2 // PB12,13,14,15 on AF5
|
||||
|
||||
#define SPI2_GPIO GPIOB
|
||||
#define SPI2_GPIO_PERIPHERAL RCC_AHBPeriph_GPIOB
|
||||
#define SPI2_NSS_PIN Pin_12
|
||||
#define SPI2_NSS_PIN_SOURCE GPIO_PinSource12
|
||||
#define SPI2_SCK_PIN Pin_13
|
||||
#define SPI2_SCK_PIN_SOURCE GPIO_PinSource13
|
||||
#define SPI2_MISO_PIN Pin_14
|
||||
#define SPI2_MISO_PIN_SOURCE GPIO_PinSource14
|
||||
#define SPI2_MOSI_PIN Pin_15
|
||||
#define SPI2_MOSI_PIN_SOURCE GPIO_PinSource15
|
||||
#define SPI2_NSS_PIN PB12
|
||||
#define SPI2_SCK_PIN PB13
|
||||
#define SPI2_MISO_PIN PB14
|
||||
#define SPI2_MOSI_PIN PB15
|
||||
|
||||
#ifdef FURYF3_SPIFLASH
|
||||
#define USE_FLASHFS
|
||||
|
@ -88,8 +78,7 @@
|
|||
|
||||
#ifdef USE_FLASHFS
|
||||
#define USE_FLASH_M25P16
|
||||
#define M25P16_CS_GPIO GPIOB
|
||||
#define M25P16_CS_PIN GPIO_Pin_12
|
||||
#define M25P16_CS_PIN PB12
|
||||
#define M25P16_SPI_INSTANCE SPI2
|
||||
#define ENABLE_BLACKBOX_LOGGING_ON_SPIFLASH_BY_DEFAULT
|
||||
#endif
|
||||
|
@ -99,11 +88,9 @@
|
|||
|
||||
#define SDCARD_DETECT_INVERTED
|
||||
|
||||
#define SDCARD_DETECT_PIN GPIO_Pin_2
|
||||
#define SDCARD_DETECT_PIN PB2
|
||||
#define SDCARD_DETECT_EXTI_LINE EXTI_Line2
|
||||
#define SDCARD_DETECT_EXTI_PIN_SOURCE EXTI_PinSource2
|
||||
#define SDCARD_DETECT_GPIO_PORT GPIOB
|
||||
#define SDCARD_DETECT_GPIO_CLK RCC_AHBPeriph_GPIOB
|
||||
#define SDCARD_DETECT_EXTI_PORT_SOURCE EXTI_PortSourceGPIOB
|
||||
#define SDCARD_DETECT_EXTI_IRQn EXTI15_10_IRQn
|
||||
|
||||
|
@ -116,7 +103,7 @@
|
|||
// Divide to under 25MHz for normal operation:
|
||||
#define SDCARD_SPI_FULL_SPEED_CLOCK_DIVIDER 2
|
||||
|
||||
// Note, this is the same DMA channel as USART1_RX. Luckily we don't use DMA for USART Rx.
|
||||
// Note, this is the same DMA channel as UART1_RX. Luckily we don't use DMA for USART Rx.
|
||||
#define SDCARD_DMA_CHANNEL_TX DMA1_Channel5
|
||||
#define SDCARD_DMA_CHANNEL_TX_COMPLETE_FLAG DMA1_FLAG_TC5
|
||||
#endif
|
||||
|
|
|
@ -30,26 +30,20 @@
|
|||
#define USE_EXTI
|
||||
#define MPU_INT_EXTI PA5
|
||||
#define EXTI_CALLBACK_HANDLER_COUNT 1 // MPU data ready
|
||||
//#define DEBUG_MPU_DATA_READY_INTERRUPT
|
||||
#define USE_MPU_DATA_READY_SIGNAL
|
||||
#define ENSURE_MPU_DATA_READY_IS_LOW
|
||||
//#define DEBUG_MPU_DATA_READY_INTERRUPT
|
||||
|
||||
#define MPU6500_CS_GPIO_CLK_PERIPHERAL RCC_AHBPeriph_GPIOA
|
||||
#define MPU6500_CS_GPIO GPIOA
|
||||
#define MPU6500_CS_PIN GPIO_Pin_4
|
||||
#define MPU6500_SPI_INSTANCE SPI1
|
||||
|
||||
#define USE_SPI
|
||||
#define USE_SPI_DEVICE_1
|
||||
|
||||
#define SPI1_GPIO GPIOB
|
||||
#define SPI1_GPIO_PERIPHERAL RCC_AHBPeriph_GPIOB
|
||||
#define SPI1_SCK_PIN GPIO_Pin_3
|
||||
#define SPI1_SCK_PIN_SOURCE GPIO_PinSource3
|
||||
#define SPI1_MISO_PIN GPIO_Pin_4
|
||||
#define SPI1_MISO_PIN_SOURCE GPIO_PinSource4
|
||||
#define SPI1_MOSI_PIN GPIO_Pin_5
|
||||
#define SPI1_MOSI_PIN_SOURCE GPIO_PinSource5
|
||||
#define SPI1_SCK_PIN PB3
|
||||
#define SPI1_MISO_PIN PB4
|
||||
#define SPI1_MOSI_PIN PB5
|
||||
#define SPI1_NSS_PIN PA4
|
||||
|
||||
#define MPU6500_CS_PIN SPI1_NSS_PIN
|
||||
#define MPU6500_SPI_INSTANCE SPI1
|
||||
|
||||
#define GYRO
|
||||
#define USE_GYRO_MPU6500
|
||||
|
|
|
@ -40,6 +40,15 @@
|
|||
#define USE_ACC_MPU6050
|
||||
#define ACC_MPU6050_ALIGN CW180_DEG
|
||||
|
||||
#define USE_GYRO_SPI_MPU6000
|
||||
#define GYRO_MPU6000_ALIGN CW180_DEG
|
||||
#define USE_ACC_SPI_MPU6000
|
||||
#define ACC_MPU6000_ALIGN CW180_DEG
|
||||
|
||||
#define MPU6000_CS_GPIO GPIOB
|
||||
#define MPU6000_CS_PIN PB12
|
||||
#define MPU6000_SPI_INSTANCE SPI2
|
||||
|
||||
//#define BARO
|
||||
//#define USE_BARO_MS5611
|
||||
|
||||
|
@ -69,14 +78,9 @@
|
|||
#define USE_SPI
|
||||
#define USE_SPI_DEVICE_2
|
||||
|
||||
#define M25P16_CS_GPIO GPIOB
|
||||
#define M25P16_CS_PIN GPIO_Pin_12
|
||||
#define M25P16_CS_PIN PB12
|
||||
#define M25P16_SPI_INSTANCE SPI2
|
||||
|
||||
#define MPU6000_CS_GPIO GPIOB
|
||||
#define MPU6000_CS_PIN GPIO_Pin_12
|
||||
#define MPU6000_SPI_INSTANCE SPI2
|
||||
|
||||
//#define SENSORS_SET (SENSOR_ACC | SENSOR_BARO | SENSOR_GPS | SENSOR_MAG)
|
||||
#define SENSORS_SET (SENSOR_ACC)
|
||||
|
||||
|
|
|
@ -53,8 +53,8 @@ void detectHardwareRevision(void)
|
|||
|
||||
#ifdef USE_SPI
|
||||
|
||||
#define DISABLE_SPI_CS GPIO_SetBits(NAZE_SPI_CS_GPIO, NAZE_SPI_CS_PIN)
|
||||
#define ENABLE_SPI_CS GPIO_ResetBits(NAZE_SPI_CS_GPIO, NAZE_SPI_CS_PIN)
|
||||
#define DISABLE_SPI_CS IOHi(nazeSpiCsPin)
|
||||
#define ENABLE_SPI_CS IOLo(nazeSpiCsPin)
|
||||
|
||||
#define SPI_DEVICE_NONE (0)
|
||||
#define SPI_DEVICE_FLASH (1)
|
||||
|
@ -63,8 +63,14 @@ void detectHardwareRevision(void)
|
|||
#define M25P16_INSTRUCTION_RDID 0x9F
|
||||
#define FLASH_M25P16_ID (0x202015)
|
||||
|
||||
static IO_t nazeSpiCsPin = IO_NONE;
|
||||
|
||||
uint8_t detectSpiDevice(void)
|
||||
{
|
||||
#ifdef NAZE_SPI_CS_PIN
|
||||
nazeSpiCsPin = IOGetByTag(IO_TAG(NAZE_SPI_CS_PIN));
|
||||
#endif
|
||||
|
||||
uint8_t out[] = { M25P16_INSTRUCTION_RDID, 0, 0, 0 };
|
||||
uint8_t in[4];
|
||||
uint32_t flash_id;
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
|
||||
#define NAZE_SPI_INSTANCE SPI2
|
||||
#define NAZE_SPI_CS_GPIO GPIOB
|
||||
#define NAZE_SPI_CS_PIN GPIO_Pin_12
|
||||
#define NAZE_SPI_CS_PIN PB12
|
||||
#define NAZE_CS_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOB
|
||||
|
||||
// We either have this 16mbit flash chip on SPI or the MPU6500 acc/gyro depending on board revision:
|
||||
|
@ -105,7 +105,7 @@
|
|||
//#define USE_MAG_MAG3110
|
||||
#define MAG_HMC5883_ALIGN CW180_DEG
|
||||
|
||||
#define SONAR
|
||||
//#define SONAR
|
||||
//#define USE_SONAR_SRF10
|
||||
#define SONAR_TRIGGER_PIN PB0
|
||||
#define SONAR_ECHO_PIN PB1
|
||||
|
@ -166,18 +166,13 @@
|
|||
// RC10 PB1/TIM3 MOSI /softserial2 TX / sonar echo / current
|
||||
|
||||
// Nordic Semiconductor uses 'CSN', STM uses 'NSS'
|
||||
#define NRF24_CE_GPIO GPIOA
|
||||
#define NRF24_CE_PIN GPIO_Pin_1
|
||||
#define NRF24_CE_PIN PA1
|
||||
#define NRF24_CE_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOA
|
||||
#define NRF24_CSN_GPIO GPIOA
|
||||
#define NRF24_CSN_PIN GPIO_Pin_6
|
||||
#define NRF24_CSN_PIN PA6
|
||||
#define NRF24_CSN_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOA
|
||||
#define NRF24_SCK_GPIO GPIOA
|
||||
#define NRF24_SCK_PIN GPIO_Pin_7
|
||||
#define NRF24_MOSI_GPIO GPIOB
|
||||
#define NRF24_MOSI_PIN GPIO_Pin_1
|
||||
#define NRF24_MISO_GPIO GPIOB
|
||||
#define NRF24_MISO_PIN GPIO_Pin_0
|
||||
#define NRF24_SCK_PIN PA7
|
||||
#define NRF24_MOSI_PIN PB1
|
||||
#define NRF24_MISO_PIN PB0
|
||||
#endif // USE_NRF24
|
||||
|
||||
#define USE_ADC
|
||||
|
|
|
@ -36,22 +36,17 @@
|
|||
#define USE_SPI_DEVICE_2
|
||||
|
||||
#define PORT103R_SPI_INSTANCE SPI2
|
||||
#define PORT103R_SPI_CS_GPIO GPIOB
|
||||
#define PORT103R_SPI_CS_PIN GPIO_Pin_12
|
||||
#define PORT103R_SPI_CS_PIN PB12
|
||||
|
||||
// We either have this 16mbit flash chip on SPI or the MPU6500 acc/gyro depending on board revision:
|
||||
#define M25P16_CS_GPIO PORT103R_SPI_CS_GPIO
|
||||
#define M25P16_CS_PIN PORT103R_SPI_CS_PIN
|
||||
#define M25P16_SPI_INSTANCE PORT103R_SPI_INSTANCE
|
||||
|
||||
#define MPU6000_CS_GPIO PORT103R_SPI_CS_GPIO
|
||||
#define MPU6000_CS_PIN PORT103R_SPI_CS_PIN
|
||||
#define MPU6000_SPI_INSTANCE PORT103R_SPI_INSTANCE
|
||||
|
||||
#define MPU6500_CS_GPIO PORT103R_SPI_CS_GPIO
|
||||
#define MPU6500_CS_PIN PORT103R_SPI_CS_PIN
|
||||
#define MPU6500_SPI_INSTANCE PORT103R_SPI_INSTANCE
|
||||
#define MPU6500_CS_GPIO_CLK_PERIPHERAL RCC_APB2Periph_GPIOB
|
||||
|
||||
#define GYRO
|
||||
#define USE_FAKE_GYRO
|
||||
|
|
|
@ -83,19 +83,8 @@
|
|||
#define USE_SPI
|
||||
#define USE_SPI_DEVICE_2 // PB12,13,14,15 on AF5
|
||||
|
||||
#define SPI2_GPIO GPIOB
|
||||
#define SPI2_GPIO_PERIPHERAL RCC_AHBPeriph_GPIOB
|
||||
#define SPI2_NSS_PIN Pin_12
|
||||
#define SPI2_NSS_PIN_SOURCE GPIO_PinSource12
|
||||
#define SPI2_SCK_PIN Pin_13
|
||||
#define SPI2_SCK_PIN_SOURCE GPIO_PinSource13
|
||||
#define SPI2_MISO_PIN Pin_14
|
||||
#define SPI2_MISO_PIN_SOURCE GPIO_PinSource14
|
||||
#define SPI2_MOSI_PIN Pin_15
|
||||
#define SPI2_MOSI_PIN_SOURCE GPIO_PinSource15
|
||||
|
||||
#define M25P16_CS_GPIO GPIOB
|
||||
#define M25P16_CS_PIN GPIO_Pin_12
|
||||
#define M25P16_CS_PIN PB12
|
||||
#define M25P16_SPI_INSTANCE SPI2
|
||||
|
||||
#define BOARD_HAS_VOLTAGE_DIVIDER
|
||||
|
|
|
@ -89,19 +89,7 @@
|
|||
#define USE_SPI
|
||||
#define USE_SPI_DEVICE_2 // PB12,13,14,15 on AF5
|
||||
|
||||
#define SPI2_GPIO GPIOB
|
||||
#define SPI2_GPIO_PERIPHERAL RCC_AHBPeriph_GPIOB
|
||||
#define SPI2_NSS_PIN Pin_12
|
||||
#define SPI2_NSS_PIN_SOURCE GPIO_PinSource12
|
||||
#define SPI2_SCK_PIN Pin_13
|
||||
#define SPI2_SCK_PIN_SOURCE GPIO_PinSource13
|
||||
#define SPI2_MISO_PIN Pin_14
|
||||
#define SPI2_MISO_PIN_SOURCE GPIO_PinSource14
|
||||
#define SPI2_MOSI_PIN Pin_15
|
||||
#define SPI2_MOSI_PIN_SOURCE GPIO_PinSource15
|
||||
|
||||
#define M25P16_CS_GPIO GPIOB
|
||||
#define M25P16_CS_PIN GPIO_Pin_12
|
||||
#define M25P16_CS_PIN PB12
|
||||
#define M25P16_SPI_INSTANCE SPI2
|
||||
|
||||
#define BOARD_HAS_VOLTAGE_DIVIDER
|
||||
|
|
|
@ -82,43 +82,23 @@
|
|||
#define USE_SPI_DEVICE_1 // PB9,3,4,5 on AF5 SPI1 (MPU)
|
||||
#define USE_SPI_DEVICE_2 // PB12,13,14,15 on AF5 SPI2 (SDCard)
|
||||
|
||||
#define SPI1_GPIO GPIOB
|
||||
#define SPI1_GPIO_PERIPHERAL RCC_AHBPeriph_GPIOB
|
||||
#define SPI1_NSS_PIN Pin_9
|
||||
#define SPI1_NSS_PIN_SOURCE GPIO_PinSource9
|
||||
#define SPI1_SCK_PIN Pin_3
|
||||
#define SPI1_SCK_PIN_SOURCE GPIO_PinSource3
|
||||
#define SPI1_MISO_PIN Pin_4
|
||||
#define SPI1_MISO_PIN_SOURCE GPIO_PinSource4
|
||||
#define SPI1_MOSI_PIN Pin_5
|
||||
#define SPI1_MOSI_PIN_SOURCE GPIO_PinSource5
|
||||
#define SPI1_NSS_PIN PB9
|
||||
#define SPI1_SCK_PIN PB3
|
||||
#define SPI1_MISO_PIN PB4
|
||||
#define SPI1_MOSI_PIN PB5
|
||||
|
||||
#define SPI2_GPIO GPIOB
|
||||
#define SPI2_GPIO_PERIPHERAL RCC_AHBPeriph_GPIOB
|
||||
#define SPI2_NSS_PIN Pin_12
|
||||
#define SPI2_NSS_PIN_SOURCE GPIO_PinSource12
|
||||
#define SPI2_SCK_PIN Pin_13
|
||||
#define SPI2_SCK_PIN_SOURCE GPIO_PinSource13
|
||||
#define SPI2_MISO_PIN Pin_14
|
||||
#define SPI2_MISO_PIN_SOURCE GPIO_PinSource14
|
||||
#define SPI2_MOSI_PIN Pin_15
|
||||
#define SPI2_MOSI_PIN_SOURCE GPIO_PinSource15
|
||||
#define SPI2_NSS_PIN PB12
|
||||
#define SPI2_SCK_PIN PB13
|
||||
#define SPI2_MISO_PIN PB14
|
||||
#define SPI2_MOSI_PIN PB15
|
||||
|
||||
#define USE_SDCARD
|
||||
#define USE_SDCARD_SPI2
|
||||
|
||||
#define SDCARD_DETECT_INVERTED
|
||||
|
||||
#define SDCARD_DETECT_PIN GPIO_Pin_14
|
||||
#define SDCARD_DETECT_EXTI_LINE EXTI_Line14
|
||||
#define SDCARD_DETECT_EXTI_PIN_SOURCE EXTI_PinSource14
|
||||
#define SDCARD_DETECT_GPIO_PORT GPIOC
|
||||
#define SDCARD_DETECT_GPIO_CLK RCC_AHBPeriph_GPIOC
|
||||
#define SDCARD_DETECT_EXTI_PORT_SOURCE EXTI_PortSourceGPIOC
|
||||
#define SDCARD_DETECT_EXTI_IRQn EXTI15_10_IRQn
|
||||
|
||||
#define SDCARD_DETECT_PIN PC14
|
||||
#define SDCARD_SPI_INSTANCE SPI2
|
||||
#define SDCARD_SPI_CS_GPIO SPI2_GPIO
|
||||
#define SDCARD_SPI_CS_PIN SPI2_NSS_PIN
|
||||
|
||||
// SPI2 is on the APB1 bus whose clock runs at 36MHz. Divide to under 400kHz for init:
|
||||
|
@ -126,14 +106,11 @@
|
|||
// Divide to under 25MHz for normal operation:
|
||||
#define SDCARD_SPI_FULL_SPEED_CLOCK_DIVIDER 2
|
||||
|
||||
// Note, this is the same DMA channel as USART1_RX. Luckily we don't use DMA for USART Rx.
|
||||
// Note, this is the same DMA channel as UART1_RX. Luckily we don't use DMA for USART Rx.
|
||||
#define SDCARD_DMA_CHANNEL_TX DMA1_Channel5
|
||||
#define SDCARD_DMA_CHANNEL_TX_COMPLETE_FLAG DMA1_FLAG_TC5
|
||||
|
||||
|
||||
#define MPU6500_CS_GPIO_CLK_PERIPHERAL SPI1_GPIO_PERIPHERAL
|
||||
#define MPU6500_CS_GPIO SPI1_GPIO
|
||||
#define MPU6500_CS_PIN GPIO_Pin_9
|
||||
#define MPU6500_CS_PIN PB9
|
||||
#define MPU6500_SPI_INSTANCE SPI1
|
||||
|
||||
#define USE_ADC
|
||||
|
|
|
@ -31,18 +31,29 @@
|
|||
#define USE_SPI_DEVICE_1
|
||||
#define USE_SPI_DEVICE_2
|
||||
|
||||
#define SPI2_NSS_PIN PB12
|
||||
#define SPI2_SCK_PIN PB13
|
||||
#define SPI2_MISO_PIN PB14
|
||||
#define SPI2_MOSI_PIN PB15
|
||||
|
||||
#define GYRO
|
||||
#define USE_GYRO_L3GD20
|
||||
|
||||
#define L3GD20_SPI SPI1
|
||||
#define L3GD20_CS_GPIO_CLK_PERIPHERAL RCC_AHBPeriph_GPIOE
|
||||
#define L3GD20_CS_GPIO GPIOE
|
||||
#define L3GD20_CS_PIN GPIO_Pin_3
|
||||
|
||||
#define L3GD20_CS_PIN PE3
|
||||
#define GYRO_L3GD20_ALIGN CW270_DEG
|
||||
|
||||
// Support the GY-91 MPU9250 dev board
|
||||
#define USE_GYRO_MPU6500
|
||||
#define USE_GYRO_SPI_MPU6500
|
||||
#define MPU6500_CS_PIN PC14
|
||||
#define MPU6500_SPI_INSTANCE SPI2
|
||||
#define GYRO_MPU6500_ALIGN CW270_DEG_FLIP
|
||||
|
||||
#define ACC
|
||||
#define USE_ACC_LSM303DLHC
|
||||
#define USE_ACC_MPU6500
|
||||
#define USE_ACC_SPI_MPU6500
|
||||
#define ACC_MPU6500_ALIGN CW270_DEG_FLIP
|
||||
|
||||
#define MAG
|
||||
#define USE_MAG_HMC5883
|
||||
|
|
|
@ -12,6 +12,7 @@ TARGET_SRC = \
|
|||
drivers/accgyro_mpu3050.c \
|
||||
drivers/accgyro_mpu6050.c \
|
||||
drivers/accgyro_mpu6500.c \
|
||||
drivers/accgyro_spi_mpu6500.c \
|
||||
drivers/barometer_bmp280.c \
|
||||
drivers/barometer_ms5611.c \
|
||||
drivers/compass_ak8975.c \
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue