mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-06-01 21:07:40 +08:00
[spi][stm32] get rid of stupid remapping, SPI3 is now really spi3 (spi0 doesn't exist on stm32)
This commit is contained in:
@@ -150,7 +150,7 @@ else ifeq ($(BOARD), lisa_m)
|
|||||||
# defaults to i2c baro bmp085 on the board
|
# defaults to i2c baro bmp085 on the board
|
||||||
LISA_M_BARO ?= BARO_BOARD_BMP085
|
LISA_M_BARO ?= BARO_BOARD_BMP085
|
||||||
ifeq ($(LISA_M_BARO), BARO_MS5611_SPI)
|
ifeq ($(LISA_M_BARO), BARO_MS5611_SPI)
|
||||||
include $(CFG_SHARED)/spi.makefile
|
include $(CFG_SHARED)/spi_master.makefile
|
||||||
ap.CFLAGS += -DUSE_SPI2 -DUSE_SPI_SLAVE3
|
ap.CFLAGS += -DUSE_SPI2 -DUSE_SPI_SLAVE3
|
||||||
ap.srcs += $(SRC_BOARD)/baro_ms5611_spi.c
|
ap.srcs += $(SRC_BOARD)/baro_ms5611_spi.c
|
||||||
else ifeq ($(LISA_M_BARO), BARO_MS5611_I2C)
|
else ifeq ($(LISA_M_BARO), BARO_MS5611_I2C)
|
||||||
@@ -167,7 +167,7 @@ else ifeq ($(BOARD), lia)
|
|||||||
# fixme, reuse the baro drivers in lisa_m dir
|
# fixme, reuse the baro drivers in lisa_m dir
|
||||||
LIA_BARO ?= BARO_MS5611_SPI
|
LIA_BARO ?= BARO_MS5611_SPI
|
||||||
ifeq ($(LIA_BARO), BARO_MS5611_SPI)
|
ifeq ($(LIA_BARO), BARO_MS5611_SPI)
|
||||||
include $(CFG_SHARED)/spi.makefile
|
include $(CFG_SHARED)/spi_master.makefile
|
||||||
ap.CFLAGS += -DUSE_SPI2 -DUSE_SPI_SLAVE3
|
ap.CFLAGS += -DUSE_SPI2 -DUSE_SPI_SLAVE3
|
||||||
ap.srcs += boards/lisa_m/baro_ms5611_spi.c
|
ap.srcs += boards/lisa_m/baro_ms5611_spi.c
|
||||||
else ifeq ($(LIA_BARO), BARO_MS5611_I2C)
|
else ifeq ($(LIA_BARO), BARO_MS5611_I2C)
|
||||||
@@ -178,7 +178,7 @@ LIA_BARO ?= BARO_MS5611_SPI
|
|||||||
|
|
||||||
# navgo baro
|
# navgo baro
|
||||||
else ifeq ($(BOARD), navgo)
|
else ifeq ($(BOARD), navgo)
|
||||||
include $(CFG_SHARED)/spi.makefile
|
include $(CFG_SHARED)/spi_master.makefile
|
||||||
ap.CFLAGS += -DUSE_SPI_SLAVE0
|
ap.CFLAGS += -DUSE_SPI_SLAVE0
|
||||||
ap.CFLAGS += -DUSE_SPI1
|
ap.CFLAGS += -DUSE_SPI1
|
||||||
ap.srcs += peripherals/mcp355x.c
|
ap.srcs += peripherals/mcp355x.c
|
||||||
|
|||||||
@@ -10,9 +10,9 @@ ifeq ($(INTER_MCU_SLAVE),)
|
|||||||
INTER_MCU_SLAVE = SLAVE0
|
INTER_MCU_SLAVE = SLAVE0
|
||||||
endif
|
endif
|
||||||
|
|
||||||
fbw.CFLAGS += -DMCU_SPI_LINK -DUSE_$(INTER_MCU_SPI)_SLAVE -DSPI_SLAVE
|
fbw.CFLAGS += -DMCU_SPI_LINK -DUSE_$(INTER_MCU_SPI)_SLAVE -DSPI_SLAVE -DUSE_SPI
|
||||||
fbw.srcs += $(SRC_FIXEDWING)/link_mcu_spi.c mcu_periph/spi.c $(SRC_ARCH)/mcu_periph/spi_arch.c
|
fbw.srcs += $(SRC_FIXEDWING)/link_mcu_spi.c mcu_periph/spi.c $(SRC_ARCH)/mcu_periph/spi_arch.c
|
||||||
ap_srcs += $(SRC_FIRMWARE)/fbw_downlink.c
|
ap_srcs += $(SRC_FIRMWARE)/fbw_downlink.c
|
||||||
ap.CFLAGS += -DMCU_SPI_LINK -DUSE_$(INTER_MCU_SPI) -DSPI_MASTER -DUSE_SPI_$(INTER_MCU_SLAVE)
|
ap.CFLAGS += -DMCU_SPI_LINK -DUSE_$(INTER_MCU_SPI) -DSPI_MASTER -DUSE_SPI_$(INTER_MCU_SLAVE) -DUSE_SPI
|
||||||
ap.srcs += $(SRC_FIXEDWING)/link_mcu_spi.c mcu_periph/spi.c $(SRC_ARCH)/mcu_periph/spi_arch.c
|
ap.srcs += $(SRC_FIXEDWING)/link_mcu_spi.c mcu_periph/spi.c $(SRC_ARCH)/mcu_periph/spi_arch.c
|
||||||
SEPARATE_FBW = 1
|
SEPARATE_FBW = 1
|
||||||
|
|||||||
@@ -27,9 +27,7 @@ IMU_ASPIRIN_SRCS += $(SRC_SUBSYSTEMS)/imu/imu_aspirin.c
|
|||||||
#IMU_ASPIRIN_SRCS += $(SRC_ARCH)/subsystems/imu/imu_aspirin_arch.c
|
#IMU_ASPIRIN_SRCS += $(SRC_ARCH)/subsystems/imu/imu_aspirin_arch.c
|
||||||
IMU_ASPIRIN_CFLAGS += -DASPIRIN_ARCH_INDEP
|
IMU_ASPIRIN_CFLAGS += -DASPIRIN_ARCH_INDEP
|
||||||
|
|
||||||
IMU_ASPIRIN_SRCS += mcu_periph/spi.c $(SRC_ARCH)/mcu_periph/spi_arch.c
|
include $(CFG_SHARED)/spi_master.makefile
|
||||||
|
|
||||||
IMU_ASPIRIN_CFLAGS += -DUSE_SPI -DSPI_MASTER
|
|
||||||
|
|
||||||
# for fixedwing firmware and ap only
|
# for fixedwing firmware and ap only
|
||||||
ifeq ($(TARGET), ap)
|
ifeq ($(TARGET), ap)
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ IMU_ASPIRIN_CFLAGS += -DIMU_TYPE_H=\"imu/imu_aspirin2.h\"
|
|||||||
IMU_ASPIRIN_SRCS = $(SRC_SUBSYSTEMS)/imu.c \
|
IMU_ASPIRIN_SRCS = $(SRC_SUBSYSTEMS)/imu.c \
|
||||||
$(SRC_SUBSYSTEMS)/imu/imu_aspirin2.c
|
$(SRC_SUBSYSTEMS)/imu/imu_aspirin2.c
|
||||||
|
|
||||||
include $(CFG_SHARED)/spi.makefile
|
include $(CFG_SHARED)/spi_master.makefile
|
||||||
|
|
||||||
ifeq ($(ARCH), lpc21)
|
ifeq ($(ARCH), lpc21)
|
||||||
IMU_ASPIRIN_CFLAGS += -DUSE_SPI1
|
IMU_ASPIRIN_CFLAGS += -DUSE_SPI1
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ IMU_ASPIRIN_CFLAGS += -DIMU_TYPE_H=\"imu/imu_aspirin2.h\"
|
|||||||
IMU_ASPIRIN_SRCS = $(SRC_SUBSYSTEMS)/imu.c \
|
IMU_ASPIRIN_SRCS = $(SRC_SUBSYSTEMS)/imu.c \
|
||||||
$(SRC_SUBSYSTEMS)/imu/imu_aspirin2.c
|
$(SRC_SUBSYSTEMS)/imu/imu_aspirin2.c
|
||||||
|
|
||||||
include $(CFG_SHARED)/spi.makefile
|
include $(CFG_SHARED)/spi_master.makefile
|
||||||
|
|
||||||
ifeq ($(ARCH), lpc21)
|
ifeq ($(ARCH), lpc21)
|
||||||
IMU_ASPIRIN_CFLAGS += -DUSE_SPI1
|
IMU_ASPIRIN_CFLAGS += -DUSE_SPI1
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ imu_srcs += $(SRC_SUBSYSTEMS)/imu/imu_b2.c
|
|||||||
imu_srcs += peripherals/max1168.c
|
imu_srcs += peripherals/max1168.c
|
||||||
imu_srcs += $(SRC_ARCH)/peripherals/max1168_arch.c
|
imu_srcs += $(SRC_ARCH)/peripherals/max1168_arch.c
|
||||||
|
|
||||||
include $(CFG_SHARED)/spi.makefile
|
include $(CFG_SHARED)/spi_master.makefile
|
||||||
|
|
||||||
ifeq ($(ARCH), lpc21)
|
ifeq ($(ARCH), lpc21)
|
||||||
imu_CFLAGS += -DUSE_SPI_SLAVE0
|
imu_CFLAGS += -DUSE_SPI_SLAVE0
|
||||||
|
|||||||
@@ -1,13 +0,0 @@
|
|||||||
# Hey Emacs, this is a -*- makefile -*-
|
|
||||||
|
|
||||||
ifndef SPI_INCLUDED
|
|
||||||
|
|
||||||
SPI_INCLUDED = 1
|
|
||||||
|
|
||||||
#generic spi driver
|
|
||||||
$(TARGET).CFLAGS += -DUSE_SPI -DSPI_MASTER
|
|
||||||
|
|
||||||
ap.srcs += mcu_periph/spi.c $(SRC_ARCH)/mcu_periph/spi_arch.c
|
|
||||||
sim.srcs += mcu_periph/spi.c $(SRC_ARCH)/mcu_periph/spi_arch.c
|
|
||||||
|
|
||||||
endif
|
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
# Hey Emacs, this is a -*- makefile -*-
|
||||||
|
|
||||||
|
ifndef SPI_INCLUDED
|
||||||
|
|
||||||
|
SPI_INCLUDED = 1
|
||||||
|
|
||||||
|
#generic spi master driver
|
||||||
|
SPI_CFLAGS = -DUSE_SPI -DSPI_MASTER
|
||||||
|
SPI_SRCS = mcu_periph/spi.c $(SRC_ARCH)/mcu_periph/spi_arch.c
|
||||||
|
|
||||||
|
ap.CFLAGS += $(SPI_CFLAGS)
|
||||||
|
ap.srcs += $(SPI_SRCS)
|
||||||
|
|
||||||
|
endif
|
||||||
@@ -27,19 +27,6 @@
|
|||||||
* Handling of SPI hardware for STM32.
|
* Handling of SPI hardware for STM32.
|
||||||
* SPI Master code.
|
* SPI Master code.
|
||||||
*
|
*
|
||||||
* This file manages the SPI implementation how it appears to the chip.
|
|
||||||
* The public "API" that is used across the modules has different ideas about the
|
|
||||||
* numbers used in the spi structures (spi_periph).
|
|
||||||
*
|
|
||||||
* This means that from the outside, a spi_periph 2 may be mapped to SPI2, even though it's
|
|
||||||
* not the primary spi peripheral to use. Alternatively, it may as well be spi0 (mcu_periph/spi.c)
|
|
||||||
* which connects to the IMU (SPI2), instead of spi2.
|
|
||||||
*
|
|
||||||
* See the "spix_arch_init()" functions to see where the mapping occurs.
|
|
||||||
*
|
|
||||||
* This does require modifications in the makefiles, because the correct arch_init needs to be called
|
|
||||||
* for the selection of aspirin v2.1 for example.
|
|
||||||
*
|
|
||||||
* When a transaction is submitted:
|
* When a transaction is submitted:
|
||||||
* - The transaction is added to the queue if there is space, otherwise it returns false
|
* - The transaction is added to the queue if there is space, otherwise it returns false
|
||||||
* - The pending state is set
|
* - The pending state is set
|
||||||
@@ -100,7 +87,7 @@ struct spi_periph_dma {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#if USE_SPI0
|
#if USE_SPI0
|
||||||
static struct spi_periph_dma spi0_dma;
|
#error "The STM32 doesn't have SPI0"
|
||||||
#endif
|
#endif
|
||||||
#if USE_SPI1
|
#if USE_SPI1
|
||||||
static struct spi_periph_dma spi1_dma;
|
static struct spi_periph_dma spi1_dma;
|
||||||
@@ -108,18 +95,10 @@ static struct spi_periph_dma spi1_dma;
|
|||||||
#if USE_SPI2
|
#if USE_SPI2
|
||||||
static struct spi_periph_dma spi2_dma;
|
static struct spi_periph_dma spi2_dma;
|
||||||
#endif
|
#endif
|
||||||
|
#if USE_SPI3
|
||||||
|
static struct spi_periph_dma spi3_dma;
|
||||||
|
#endif
|
||||||
|
|
||||||
// SPI2 Slave Selection
|
|
||||||
|
|
||||||
// This mapping is related to the mapping of spi(x) structures in the modules and not
|
|
||||||
// necessarily to the identifiers as they appear to the processor.
|
|
||||||
// The IMU on Lisam2 for example is assigned to the SPI2 bus, but we continue to use
|
|
||||||
// the mapping to spi(x) structures as in modules here. The actual mapping of pins
|
|
||||||
// occurs in "arch_init".
|
|
||||||
// What this means is that we're effectively 'locking':
|
|
||||||
// SPI2 to spi2
|
|
||||||
// SPI1 to spi1
|
|
||||||
// SPI3 to spi0
|
|
||||||
|
|
||||||
#define SPI_SELECT_SLAVE0_PERIPH RCC_APB2ENR_IOPAEN
|
#define SPI_SELECT_SLAVE0_PERIPH RCC_APB2ENR_IOPAEN
|
||||||
#define SPI_SELECT_SLAVE0_PORT GPIOA
|
#define SPI_SELECT_SLAVE0_PORT GPIOA
|
||||||
@@ -233,79 +212,33 @@ static void spi_arch_int_disable( struct spi_periph *spi ) {
|
|||||||
* These functions map the publically available "spi" structures to
|
* These functions map the publically available "spi" structures to
|
||||||
* specific pins on this processor
|
* specific pins on this processor
|
||||||
*/
|
*/
|
||||||
#if USE_SPI0
|
|
||||||
void spi0_arch_init(void) {
|
|
||||||
|
|
||||||
// Enable SPI3 Periph and gpio clocks -------------------------------------------------
|
|
||||||
rcc_peripheral_enable_clock(&RCC_APB1ENR, RCC_APB1ENR_SPI3EN);
|
|
||||||
|
|
||||||
// Configure GPIOs: SCK, MISO and MOSI --------------------------------
|
|
||||||
gpio_set_mode(GPIO_BANK_SPI3_SCK, GPIO_MODE_OUTPUT_50_MHZ,
|
|
||||||
GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_SPI3_SCK |
|
|
||||||
GPIO_SPI3_MOSI);
|
|
||||||
|
|
||||||
gpio_set_mode(GPIO_BANK_SPI3_MISO, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT,
|
|
||||||
GPIO_SPI3_MISO);
|
|
||||||
|
|
||||||
// reset SPI
|
|
||||||
spi_reset(SPI3);
|
|
||||||
|
|
||||||
// Disable SPI peripheral
|
|
||||||
spi_disable(SPI3);
|
|
||||||
|
|
||||||
// Initialize the slave select pins
|
|
||||||
// done from mcu_init, is it really necessary to do that here?
|
|
||||||
//spi_init_slaves();
|
|
||||||
|
|
||||||
// rcc_peripheral_enable_clock(&RCC_AHBENR, RCC_AHBENR_OTGFSEN);
|
|
||||||
|
|
||||||
spi0_dma.config = (SPIDss8bit << 6) | (SPIDiv64 << 3) | (SPIMSBFirst << 2) | (SPICphaEdge2 << 1) | (SPICpolIdleHigh);
|
|
||||||
|
|
||||||
// Force SPI mode over I2S.
|
|
||||||
SPI3_I2SCFGR = 0;
|
|
||||||
|
|
||||||
// configure master SPI.
|
|
||||||
spi_init_master(SPI3, SPI_CR1_BAUDRATE_FPCLK_DIV_64, SPI_CR1_CPOL_CLK_TO_1_WHEN_IDLE,
|
|
||||||
SPI_CR1_CPHA_CLK_TRANSITION_2, SPI_CR1_DFF_8BIT, SPI_CR1_MSBFIRST);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Set NSS management to software.
|
|
||||||
*
|
|
||||||
* Note:
|
|
||||||
* Setting nss high is very important, even if we are controlling the GPIO
|
|
||||||
* ourselves this bit needs to be at least set to 1, otherwise the spi
|
|
||||||
* peripheral will not send any data out.
|
|
||||||
*/
|
|
||||||
spi_enable_software_slave_management(SPI3);
|
|
||||||
spi_set_nss_high(SPI3);
|
|
||||||
|
|
||||||
// Enable SPI_3 DMA clock ---------------------------------------------------
|
|
||||||
rcc_peripheral_enable_clock(&RCC_AHBENR, RCC_AHBENR_DMA2EN);
|
|
||||||
|
|
||||||
// Enable SPI3 periph.
|
|
||||||
spi_enable(SPI3);
|
|
||||||
|
|
||||||
spi0.init_struct = &spi0_dma;
|
|
||||||
spi0_dma.spi = SPI3;
|
|
||||||
spi0_dma.spidr = (u32)&SPI3_DR;
|
|
||||||
spi0_dma.dma = DMA2;
|
|
||||||
spi0_dma.rx_chan = DMA_CHANNEL1;
|
|
||||||
spi0_dma.tx_chan = DMA_CHANNEL2;
|
|
||||||
spi0_dma.rx_nvic_irq = NVIC_DMA2_CHANNEL1_IRQ;
|
|
||||||
spi0_dma.tx_nvic_irq = NVIC_DMA2_CHANNEL2_IRQ;
|
|
||||||
spi0_dma.other_dma_finished = 0;
|
|
||||||
|
|
||||||
spi0.trans_insert_idx = 0;
|
|
||||||
spi0.trans_extract_idx = 0;
|
|
||||||
spi0.status = SPIIdle;
|
|
||||||
|
|
||||||
spi_arch_int_enable( &spi0 );
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if USE_SPI1
|
#if USE_SPI1
|
||||||
void spi1_arch_init(void) {
|
void spi1_arch_init(void) {
|
||||||
|
|
||||||
|
// set the default configuration
|
||||||
|
spi1_dma.spi = SPI1;
|
||||||
|
spi1_dma.spidr = (u32)&SPI1_DR;
|
||||||
|
spi1_dma.dma = DMA1;
|
||||||
|
spi1_dma.rx_chan = DMA_CHANNEL2;
|
||||||
|
spi1_dma.tx_chan = DMA_CHANNEL3;
|
||||||
|
spi1_dma.rx_nvic_irq = NVIC_DMA1_CHANNEL2_IRQ;
|
||||||
|
spi1_dma.tx_nvic_irq = NVIC_DMA1_CHANNEL3_IRQ;
|
||||||
|
|
||||||
|
// set the default configuration
|
||||||
|
spi1_dma.other_dma_finished = 0;
|
||||||
|
spi1_dma.cdiv = SPI_CR1_BAUDRATE_FPCLK_DIV_64;
|
||||||
|
spi1_dma.cpol = SPI_CR1_CPOL_CLK_TO_1_WHEN_IDLE;
|
||||||
|
spi1_dma.cpha = SPI_CR1_CPHA_CLK_TRANSITION_2;
|
||||||
|
spi1_dma.dss = SPI_CR1_DFF_8BIT;
|
||||||
|
spi1_dma.bo = SPI_CR1_MSBFIRST;
|
||||||
|
spi1_dma.config = (SPIDss8bit << 6) | (SPIDiv64 << 3) | (SPIMSBFirst << 2) | (SPICphaEdge2 << 1) | (SPICpolIdleHigh);
|
||||||
|
|
||||||
|
// set init struct, indices and status
|
||||||
|
spi1.init_struct = &spi1_dma;
|
||||||
|
spi1.trans_insert_idx = 0;
|
||||||
|
spi1.trans_extract_idx = 0;
|
||||||
|
spi1.status = SPIIdle;
|
||||||
|
|
||||||
// Enable SPI1 Periph and gpio clocks -------------------------------------------------
|
// Enable SPI1 Periph and gpio clocks -------------------------------------------------
|
||||||
rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_SPI1EN);
|
rcc_peripheral_enable_clock(&RCC_APB2ENR, RCC_APB2ENR_SPI1EN);
|
||||||
|
|
||||||
@@ -332,12 +265,8 @@ void spi1_arch_init(void) {
|
|||||||
// Force SPI mode over I2S.
|
// Force SPI mode over I2S.
|
||||||
SPI1_I2SCFGR = 0;
|
SPI1_I2SCFGR = 0;
|
||||||
|
|
||||||
spi1_dma.config = (SPIDss8bit << 6) | (SPIDiv64 << 3) | (SPIMSBFirst << 2) | (SPICphaEdge2 << 1) | (SPICpolIdleHigh);
|
|
||||||
|
|
||||||
// configure master SPI.
|
// configure master SPI.
|
||||||
spi_init_master(SPI1, SPI_CR1_BAUDRATE_FPCLK_DIV_64, SPI_CR1_CPOL_CLK_TO_1_WHEN_IDLE,
|
spi_init_master(SPI1, spi1_dma.cdiv, spi1_dma.cpol, spi1_dma.cpha, spi1_dma.dss, spi1_dma.bo);
|
||||||
SPI_CR1_CPHA_CLK_TRANSITION_2, SPI_CR1_DFF_8BIT, SPI_CR1_MSBFIRST);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set NSS management to software.
|
* Set NSS management to software.
|
||||||
*
|
*
|
||||||
@@ -355,20 +284,6 @@ void spi1_arch_init(void) {
|
|||||||
// Enable SPI1 periph.
|
// Enable SPI1 periph.
|
||||||
spi_enable(SPI1);
|
spi_enable(SPI1);
|
||||||
|
|
||||||
spi1.init_struct = &spi1_dma;
|
|
||||||
spi1_dma.spi = SPI1;
|
|
||||||
spi1_dma.spidr = (u32)&SPI1_DR;
|
|
||||||
spi1_dma.dma = DMA1;
|
|
||||||
spi1_dma.rx_chan = DMA_CHANNEL2;
|
|
||||||
spi1_dma.tx_chan = DMA_CHANNEL3;
|
|
||||||
spi1_dma.rx_nvic_irq = NVIC_DMA1_CHANNEL2_IRQ;
|
|
||||||
spi1_dma.tx_nvic_irq = NVIC_DMA1_CHANNEL3_IRQ;
|
|
||||||
spi1_dma.other_dma_finished = 0;
|
|
||||||
|
|
||||||
spi1.trans_insert_idx = 0;
|
|
||||||
spi1.trans_extract_idx = 0;
|
|
||||||
spi1.status = SPIIdle;
|
|
||||||
|
|
||||||
spi_arch_int_enable( &spi1 );
|
spi_arch_int_enable( &spi1 );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -376,6 +291,30 @@ void spi1_arch_init(void) {
|
|||||||
#if USE_SPI2
|
#if USE_SPI2
|
||||||
void spi2_arch_init(void) {
|
void spi2_arch_init(void) {
|
||||||
|
|
||||||
|
// set the default configuration
|
||||||
|
spi2_dma.spi = SPI2;
|
||||||
|
spi2_dma.spidr = (u32)&SPI2_DR;
|
||||||
|
spi2_dma.dma = DMA1;
|
||||||
|
spi2_dma.rx_chan = DMA_CHANNEL4;
|
||||||
|
spi2_dma.tx_chan = DMA_CHANNEL5;
|
||||||
|
spi2_dma.rx_nvic_irq = NVIC_DMA1_CHANNEL4_IRQ;
|
||||||
|
spi2_dma.tx_nvic_irq = NVIC_DMA1_CHANNEL5_IRQ;
|
||||||
|
|
||||||
|
spi2_dma.other_dma_finished = 0;
|
||||||
|
spi2_dma.cdiv = SPI_CR1_BAUDRATE_FPCLK_DIV_64;
|
||||||
|
spi2_dma.cpol = SPI_CR1_CPOL_CLK_TO_1_WHEN_IDLE;
|
||||||
|
spi2_dma.cpha = SPI_CR1_CPHA_CLK_TRANSITION_2;
|
||||||
|
spi2_dma.dss = SPI_CR1_DFF_8BIT;
|
||||||
|
spi2_dma.bo = SPI_CR1_MSBFIRST;
|
||||||
|
spi2_dma.config = (SPIDss8bit << 6) | (SPIDiv64 << 3) | (SPIMSBFirst << 2) | (SPICphaEdge2 << 1) | (SPICpolIdleHigh);
|
||||||
|
|
||||||
|
// set init struct, indices and status
|
||||||
|
spi2.init_struct = &spi2_dma;
|
||||||
|
spi2.trans_insert_idx = 0;
|
||||||
|
spi2.trans_extract_idx = 0;
|
||||||
|
spi2.status = SPIIdle;
|
||||||
|
|
||||||
|
|
||||||
// Enable SPI2 Periph and gpio clocks -------------------------------------------------
|
// Enable SPI2 Periph and gpio clocks -------------------------------------------------
|
||||||
rcc_peripheral_enable_clock(&RCC_APB1ENR, RCC_APB1ENR_SPI2EN);
|
rcc_peripheral_enable_clock(&RCC_APB1ENR, RCC_APB1ENR_SPI2EN);
|
||||||
|
|
||||||
@@ -402,11 +341,8 @@ void spi2_arch_init(void) {
|
|||||||
// Force SPI mode over I2S.
|
// Force SPI mode over I2S.
|
||||||
SPI2_I2SCFGR = 0;
|
SPI2_I2SCFGR = 0;
|
||||||
|
|
||||||
spi2_dma.config = (SPIDss8bit << 6) | (SPIDiv64 << 3) | (SPIMSBFirst << 2) | (SPICphaEdge2 << 1) | (SPICpolIdleHigh);
|
|
||||||
|
|
||||||
// configure master SPI.
|
// configure master SPI.
|
||||||
spi_init_master(SPI2, SPI_CR1_BAUDRATE_FPCLK_DIV_64, SPI_CR1_CPOL_CLK_TO_1_WHEN_IDLE,
|
spi_init_master(SPI2, spi2_dma.cdiv, spi2_dma.cpol, spi2_dma.cpha, spi2_dma.dss, spi2_dma.bo);
|
||||||
SPI_CR1_CPHA_CLK_TRANSITION_2, SPI_CR1_DFF_8BIT, SPI_CR1_MSBFIRST);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set NSS management to software.
|
* Set NSS management to software.
|
||||||
@@ -425,24 +361,87 @@ void spi2_arch_init(void) {
|
|||||||
// Enable SPI2 periph.
|
// Enable SPI2 periph.
|
||||||
spi_enable(SPI2);
|
spi_enable(SPI2);
|
||||||
|
|
||||||
spi2.init_struct = &spi2_dma;
|
|
||||||
spi2_dma.spi = SPI2;
|
|
||||||
spi2_dma.spidr = (u32)&SPI2_DR;
|
|
||||||
spi2_dma.dma = DMA1;
|
|
||||||
spi2_dma.rx_chan = DMA_CHANNEL4;
|
|
||||||
spi2_dma.tx_chan = DMA_CHANNEL5;
|
|
||||||
spi2_dma.rx_nvic_irq = NVIC_DMA1_CHANNEL4_IRQ;
|
|
||||||
spi2_dma.tx_nvic_irq = NVIC_DMA1_CHANNEL5_IRQ;
|
|
||||||
spi2_dma.other_dma_finished = 0;
|
|
||||||
|
|
||||||
spi2.trans_insert_idx = 0;
|
|
||||||
spi2.trans_extract_idx = 0;
|
|
||||||
spi2.status = SPIIdle;
|
|
||||||
|
|
||||||
spi_arch_int_enable( &spi2 );
|
spi_arch_int_enable( &spi2 );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if USE_SPI3
|
||||||
|
void spi3_arch_init(void) {
|
||||||
|
|
||||||
|
// set the default configuration
|
||||||
|
spi3_dma.spi = SPI3;
|
||||||
|
spi3_dma.spidr = (u32)&SPI3_DR;
|
||||||
|
spi3_dma.dma = DMA2;
|
||||||
|
spi3_dma.rx_chan = DMA_CHANNEL1;
|
||||||
|
spi3_dma.tx_chan = DMA_CHANNEL2;
|
||||||
|
spi3_dma.rx_nvic_irq = NVIC_DMA2_CHANNEL1_IRQ;
|
||||||
|
spi3_dma.tx_nvic_irq = NVIC_DMA2_CHANNEL2_IRQ;
|
||||||
|
|
||||||
|
spi3_dma.other_dma_finished = 0;
|
||||||
|
spi3_dma.cdiv = SPI_CR1_BAUDRATE_FPCLK_DIV_64;
|
||||||
|
spi3_dma.cpol = SPI_CR1_CPOL_CLK_TO_1_WHEN_IDLE;
|
||||||
|
spi3_dma.cpha = SPI_CR1_CPHA_CLK_TRANSITION_2;
|
||||||
|
spi3_dma.dss = SPI_CR1_DFF_8BIT;
|
||||||
|
spi3_dma.bo = SPI_CR1_MSBFIRST;
|
||||||
|
spi3_dma.config = (SPIDss8bit << 6) | (SPIDiv64 << 3) | (SPIMSBFirst << 2) | (SPICphaEdge2 << 1) | (SPICpolIdleHigh);
|
||||||
|
|
||||||
|
// set init struct, indices and status
|
||||||
|
spi3.init_struct = &spi3_dma;
|
||||||
|
spi3.trans_insert_idx = 0;
|
||||||
|
spi3.trans_extract_idx = 0;
|
||||||
|
spi3.status = SPIIdle;
|
||||||
|
|
||||||
|
|
||||||
|
// Enable SPI3 Periph and gpio clocks -------------------------------------------------
|
||||||
|
rcc_peripheral_enable_clock(&RCC_APB1ENR, RCC_APB1ENR_SPI3EN);
|
||||||
|
|
||||||
|
// Configure GPIOs: SCK, MISO and MOSI --------------------------------
|
||||||
|
gpio_set_mode(GPIO_BANK_SPI3_SCK, GPIO_MODE_OUTPUT_50_MHZ,
|
||||||
|
GPIO_CNF_OUTPUT_ALTFN_PUSHPULL, GPIO_SPI3_SCK |
|
||||||
|
GPIO_SPI3_MOSI);
|
||||||
|
|
||||||
|
gpio_set_mode(GPIO_BANK_SPI3_MISO, GPIO_MODE_INPUT, GPIO_CNF_INPUT_FLOAT,
|
||||||
|
GPIO_SPI3_MISO);
|
||||||
|
|
||||||
|
// reset SPI
|
||||||
|
spi_reset(SPI3);
|
||||||
|
|
||||||
|
// Disable SPI peripheral
|
||||||
|
spi_disable(SPI3);
|
||||||
|
|
||||||
|
// Initialize the slave select pins
|
||||||
|
// done from mcu_init, is it really necessary to do that here?
|
||||||
|
//spi_init_slaves();
|
||||||
|
|
||||||
|
// rcc_peripheral_enable_clock(&RCC_AHBENR, RCC_AHBENR_OTGFSEN);
|
||||||
|
|
||||||
|
// Force SPI mode over I2S.
|
||||||
|
SPI3_I2SCFGR = 0;
|
||||||
|
|
||||||
|
// configure master SPI.
|
||||||
|
spi_init_master(SPI3, spi3_dma.cdiv, spi3_dma.cpol, spi3_dma.cpha, spi3_dma.dss, spi3_dma.bo);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set NSS management to software.
|
||||||
|
*
|
||||||
|
* Note:
|
||||||
|
* Setting nss high is very important, even if we are controlling the GPIO
|
||||||
|
* ourselves this bit needs to be at least set to 1, otherwise the spi
|
||||||
|
* peripheral will not send any data out.
|
||||||
|
*/
|
||||||
|
spi_enable_software_slave_management(SPI3);
|
||||||
|
spi_set_nss_high(SPI3);
|
||||||
|
|
||||||
|
// Enable SPI_3 DMA clock ---------------------------------------------------
|
||||||
|
rcc_peripheral_enable_clock(&RCC_AHBENR, RCC_AHBENR_DMA2EN);
|
||||||
|
|
||||||
|
// Enable SPI3 periph.
|
||||||
|
spi_enable(SPI3);
|
||||||
|
|
||||||
|
spi_arch_int_enable( &spi3 );
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static void spi_rw(struct spi_periph* p, struct spi_transaction * _trans)
|
static void spi_rw(struct spi_periph* p, struct spi_transaction * _trans)
|
||||||
{
|
{
|
||||||
struct spi_periph_dma *dma;
|
struct spi_periph_dma *dma;
|
||||||
@@ -808,7 +807,7 @@ void dma1_channel5_isr(void)
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if USE_SPI0
|
#if USE_SPI3
|
||||||
/// receive transferred over DMA
|
/// receive transferred over DMA
|
||||||
void dma2_channel1_isr(void)
|
void dma2_channel1_isr(void)
|
||||||
{
|
{
|
||||||
|
|||||||
+11
-3
@@ -49,7 +49,7 @@
|
|||||||
#ifdef USE_USB_SERIAL
|
#ifdef USE_USB_SERIAL
|
||||||
#include "mcu_periph/usb_serial.h"
|
#include "mcu_periph/usb_serial.h"
|
||||||
#endif
|
#endif
|
||||||
#if USE_SPI0 || USE_SPI1 || USE_SPI2 || USE_SPI0_SLAVE || USE_SPI1_SLAVE || USE_SPI2_SLAVE
|
#if USE_SPI
|
||||||
#include "mcu_periph/spi.h"
|
#include "mcu_periph/spi.h"
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_DAC
|
#ifdef USE_DAC
|
||||||
@@ -103,6 +103,10 @@ void mcu_init(void) {
|
|||||||
#ifdef USE_USB_SERIAL
|
#ifdef USE_USB_SERIAL
|
||||||
VCOM_init();
|
VCOM_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if USE_SPI
|
||||||
|
#if SPI_MASTER
|
||||||
|
|
||||||
#if USE_SPI0
|
#if USE_SPI0
|
||||||
spi0_init();
|
spi0_init();
|
||||||
#endif
|
#endif
|
||||||
@@ -112,9 +116,10 @@ void mcu_init(void) {
|
|||||||
#if USE_SPI2
|
#if USE_SPI2
|
||||||
spi2_init();
|
spi2_init();
|
||||||
#endif
|
#endif
|
||||||
#if USE_SPI0 || USE_SPI1 || USE_SPI2
|
|
||||||
spi_init_slaves();
|
spi_init_slaves();
|
||||||
#endif
|
#endif // SPI_MASTER
|
||||||
|
|
||||||
|
#if SPI_SLAVE
|
||||||
#if USE_SPI0_SLAVE
|
#if USE_SPI0_SLAVE
|
||||||
spi0_slave_init();
|
spi0_slave_init();
|
||||||
#endif
|
#endif
|
||||||
@@ -124,6 +129,9 @@ void mcu_init(void) {
|
|||||||
#if USE_SPI2_SLAVE
|
#if USE_SPI2_SLAVE
|
||||||
spi2_slave_init();
|
spi2_slave_init();
|
||||||
#endif
|
#endif
|
||||||
|
#endif // SPI_SLAVE
|
||||||
|
#endif // USE_SPI
|
||||||
|
|
||||||
#ifdef USE_DAC
|
#ifdef USE_DAC
|
||||||
dac_init();
|
dac_init();
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -194,7 +194,7 @@ extern void spi0_init(void);
|
|||||||
*/
|
*/
|
||||||
extern void spi0_arch_init(void);
|
extern void spi0_arch_init(void);
|
||||||
|
|
||||||
#endif
|
#endif // USE_SPI0
|
||||||
|
|
||||||
#if USE_SPI1
|
#if USE_SPI1
|
||||||
|
|
||||||
@@ -206,7 +206,7 @@ extern void spi1_init(void);
|
|||||||
*/
|
*/
|
||||||
extern void spi1_arch_init(void);
|
extern void spi1_arch_init(void);
|
||||||
|
|
||||||
#endif
|
#endif // USE_SPI1
|
||||||
|
|
||||||
#if USE_SPI2
|
#if USE_SPI2
|
||||||
|
|
||||||
@@ -218,8 +218,19 @@ extern void spi2_init(void);
|
|||||||
*/
|
*/
|
||||||
extern void spi2_arch_init(void);
|
extern void spi2_arch_init(void);
|
||||||
|
|
||||||
|
#endif // USE_SPI2
|
||||||
|
|
||||||
#endif
|
#if USE_SPI3
|
||||||
|
|
||||||
|
extern struct spi_periph spi3;
|
||||||
|
extern void spi3_init(void);
|
||||||
|
|
||||||
|
/** Architecture dependant SPI3 initialization.
|
||||||
|
* Must be implemented by underlying architecture
|
||||||
|
*/
|
||||||
|
extern void spi3_arch_init(void);
|
||||||
|
|
||||||
|
#endif // USE_SPI3
|
||||||
|
|
||||||
/** Initialize a spi peripheral.
|
/** Initialize a spi peripheral.
|
||||||
* @param p spi peripheral to be configured
|
* @param p spi peripheral to be configured
|
||||||
@@ -275,7 +286,7 @@ extern bool_t spi_resume(struct spi_periph* p, uint8_t slave);
|
|||||||
extern struct spi_periph spi0;
|
extern struct spi_periph spi0;
|
||||||
extern void spi0_slave_init(void);
|
extern void spi0_slave_init(void);
|
||||||
|
|
||||||
/** Architecture dependant SPI1 initialization.
|
/** Architecture dependant SPI0 initialization as slave.
|
||||||
* Must be implemented by underlying architecture
|
* Must be implemented by underlying architecture
|
||||||
*/
|
*/
|
||||||
extern void spi0_slave_arch_init(void);
|
extern void spi0_slave_arch_init(void);
|
||||||
@@ -287,7 +298,7 @@ extern void spi0_slave_arch_init(void);
|
|||||||
extern struct spi_periph spi1;
|
extern struct spi_periph spi1;
|
||||||
extern void spi1_slave_init(void);
|
extern void spi1_slave_init(void);
|
||||||
|
|
||||||
/** Architecture dependant SPI1 initialization.
|
/** Architecture dependant SPI1 initialization as slave.
|
||||||
* Must be implemented by underlying architecture
|
* Must be implemented by underlying architecture
|
||||||
*/
|
*/
|
||||||
extern void spi1_slave_arch_init(void);
|
extern void spi1_slave_arch_init(void);
|
||||||
@@ -299,13 +310,25 @@ extern void spi1_slave_arch_init(void);
|
|||||||
extern struct spi_periph spi2;
|
extern struct spi_periph spi2;
|
||||||
extern void spi2_slave_init(void);
|
extern void spi2_slave_init(void);
|
||||||
|
|
||||||
/** Architecture dependant SPI1 initialization.
|
/** Architecture dependant SPI2 initialization as slave.
|
||||||
* Must be implemented by underlying architecture
|
* Must be implemented by underlying architecture
|
||||||
*/
|
*/
|
||||||
extern void spi2_slave_arch_init(void);
|
extern void spi2_slave_arch_init(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if USE_SPI3_SLAVE
|
||||||
|
|
||||||
|
extern struct spi_periph spi3;
|
||||||
|
extern void spi3_slave_init(void);
|
||||||
|
|
||||||
|
/** Architecture dependant SPI3 initialization as slave.
|
||||||
|
* Must be implemented by underlying architecture
|
||||||
|
*/
|
||||||
|
extern void spi3_slave_arch_init(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/** Initialize a spi peripheral in slave mode.
|
/** Initialize a spi peripheral in slave mode.
|
||||||
* @param p spi peripheral to be configured
|
* @param p spi peripheral to be configured
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user