diff --git a/src/omv/boards/OPENMV4/omv_boardconfig.h b/src/omv/boards/OPENMV4/omv_boardconfig.h index 784f75821..0c43d1f89 100644 --- a/src/omv/boards/OPENMV4/omv_boardconfig.h +++ b/src/omv/boards/OPENMV4/omv_boardconfig.h @@ -199,6 +199,34 @@ #define I2C_SPIN_DELAY 32 +#define LEPTON_SPI (SPI3) +#define LEPTON_SPI_AF (GPIO_AF6_SPI3) // SPI1/2/3 clock source is PLL2 (160MHz/8 == 20MHz). -#define LEPTON_SPI_PRESCALER (SPI_BAUDRATEPRESCALER_8) +#define LEPTON_SPI_PRESCALER (SPI_BAUDRATEPRESCALER_8) + +#define LEPTON_SPI_IRQn (SPI3_IRQn) +#define LEPTON_SPI_IRQHandler (SPI3_IRQHandler) + +#define LEPTON_SPI_DMA_IRQn (DMA1_Stream0_IRQn) +#define LEPTON_SPI_DMA_STREAM (DMA1_Stream0) + +#define LEPTON_SPI_DMA_REQUEST (DMA_REQUEST_SPI3_RX) +#define LEPTON_SPI_DMA_IRQHandler (DMA1_Stream0_IRQHandler) + +#define LEPTON_SPI_RESET() __HAL_RCC_SPI3_FORCE_RESET() +#define LEPTON_SPI_RELEASE() __HAL_RCC_SPI3_RELEASE_RESET() + +#define LEPTON_SPI_CLK_ENABLE() __HAL_RCC_SPI3_CLK_ENABLE() +#define LEPTON_SPI_CLK_DISABLE() __HAL_RCC_SPI3_CLK_DISABLE() + +#define LEPTON_SPI_SCLK_PIN (GPIO_PIN_3) +#define LEPTON_SPI_MISO_PIN (GPIO_PIN_4) +#define LEPTON_SPI_MOSI_PIN (GPIO_PIN_5) +#define LEPTON_SPI_SSEL_PIN (GPIO_PIN_15) + +#define LEPTON_SPI_SCLK_PORT (GPIOB) +#define LEPTON_SPI_MISO_PORT (GPIOB) +#define LEPTON_SPI_MOSI_PORT (GPIOB) +#define LEPTON_SPI_SSEL_PORT (GPIOA) + #endif //__OMV_BOARDCONFIG_H__ diff --git a/src/omv/lepton.c b/src/omv/lepton.c index 118b4dbb4..b3835a18b 100644 --- a/src/omv/lepton.c +++ b/src/omv/lepton.c @@ -59,12 +59,12 @@ static volatile uint32_t vospi_pid = 0; static volatile uint32_t vospi_seg = 1; static uint32_t vospi_packets = 60; -void SPI3_IRQHandler(void) +void LEPTON_SPI_IRQHandler(void) { HAL_SPI_IRQHandler(&SPIHandle); } -void DMA1_Stream0_IRQHandler(void) +void LEPTON_SPI_DMA_IRQHandler(void) { HAL_DMA_IRQHandler(SPIHandle.hdmarx); } @@ -74,7 +74,7 @@ static void lepton_sync() HAL_SPI_Abort(&SPIHandle); // Disable DMA IRQ - HAL_NVIC_DisableIRQ(DMA1_Stream0_IRQn); + HAL_NVIC_DisableIRQ(LEPTON_SPI_DMA_IRQn); debug_printf("resync...\n"); systick_sleep(200); @@ -83,7 +83,7 @@ static void lepton_sync() vospi_pid = VOSPI_FIRST_PACKET; vospi_seg = VOSPI_FIRST_SEGMENT; - HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn); + HAL_NVIC_EnableIRQ(LEPTON_SPI_DMA_IRQn); HAL_SPI_Receive_DMA(&SPIHandle, vospi_packet, VOSPI_PACKET_SIZE); } @@ -451,33 +451,15 @@ int lepton_init(sensor_t *sensor) SENSOR_HW_FLAGS_SET(sensor, SENSOR_HW_FLAGS_FSYNC, 0); SENSOR_HW_FLAGS_SET(sensor, SENSOR_HW_FLAGS_JPEGE, 0); - GPIO_InitTypeDef GPIO_Init; - GPIO_Init.Pull = GPIO_PULLUP; - GPIO_Init.Mode = GPIO_MODE_AF_PP; - GPIO_Init.Alternate = GPIO_AF6_SPI3; - GPIO_Init.Speed = GPIO_SPEED_FREQ_LOW; - - GPIO_Init.Pin = GPIO_PIN_3; - HAL_GPIO_Init(GPIOB, &GPIO_Init); - - GPIO_Init.Pin = GPIO_PIN_4; - HAL_GPIO_Init(GPIOB, &GPIO_Init); - - GPIO_Init.Pin = GPIO_PIN_5; - HAL_GPIO_Init(GPIOB, &GPIO_Init); - - GPIO_Init.Pin = GPIO_PIN_15; - HAL_GPIO_Init(GPIOA, &GPIO_Init); - // Configure the DMA handler for Transmission process - DMAHandle.Instance = DMA1_Stream0; - DMAHandle.Init.Request = DMA_REQUEST_SPI3_RX; + DMAHandle.Instance = LEPTON_SPI_DMA_STREAM; + DMAHandle.Init.Request = LEPTON_SPI_DMA_REQUEST; DMAHandle.Init.Mode = DMA_CIRCULAR; DMAHandle.Init.Priority = DMA_PRIORITY_HIGH; DMAHandle.Init.Direction = DMA_PERIPH_TO_MEMORY; // When the DMA is configured in direct mode (the FIFO is disabled), the source and // destination transfer widths are equal, and both defined by PSIZE (MSIZE is ignored). - // Additionally, the burst transfers are not possible (MBURST and PBURST are ignored). + // Additionally, burst transfers are not possible (MBURST and PBURST are both ignored). DMAHandle.Init.FIFOMode = DMA_FIFOMODE_DISABLE; DMAHandle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; // Note MBURST and PBURST are ignored. @@ -489,8 +471,8 @@ int lepton_init(sensor_t *sensor) DMAHandle.Init.PeriphInc = DMA_PINC_DISABLE; // NVIC configuration for DMA transfer complete interrupt - NVIC_SetPriority(DMA1_Stream0_IRQn, IRQ_PRI_DMA21); - HAL_NVIC_DisableIRQ(DMA1_Stream0_IRQn); + NVIC_SetPriority(LEPTON_SPI_DMA_IRQn, IRQ_PRI_DMA21); + HAL_NVIC_DisableIRQ(LEPTON_SPI_DMA_IRQn); HAL_DMA_DeInit(&DMAHandle); if (HAL_DMA_Init(&DMAHandle) != HAL_OK) { @@ -499,7 +481,7 @@ int lepton_init(sensor_t *sensor) } memset(&SPIHandle, 0, sizeof(SPIHandle)); - SPIHandle.Instance = SPI3; + SPIHandle.Instance = LEPTON_SPI; SPIHandle.Init.NSS = SPI_NSS_HARD_OUTPUT; SPIHandle.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; SPIHandle.Init.NSSPolarity = SPI_NSS_POLARITY_LOW; @@ -515,11 +497,10 @@ int lepton_init(sensor_t *sensor) // Recommanded setting to avoid glitches SPIHandle.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE; - __HAL_RCC_SPI3_CLK_ENABLE(); if (HAL_SPI_Init(&SPIHandle) != HAL_OK) { - __HAL_RCC_SPI3_FORCE_RESET(); - __HAL_RCC_SPI3_RELEASE_RESET(); - __HAL_RCC_SPI3_CLK_DISABLE(); + LEPTON_SPI_RESET(); + LEPTON_SPI_RELEASE(); + LEPTON_SPI_CLK_DISABLE(); return -1; } @@ -527,8 +508,8 @@ int lepton_init(sensor_t *sensor) __HAL_LINKDMA(&SPIHandle, hdmarx, DMAHandle); // NVIC configuration for SPI transfer complete interrupt - NVIC_SetPriority(SPI3_IRQn, IRQ_PRI_DCMI); - HAL_NVIC_EnableIRQ(SPI3_IRQn); + NVIC_SetPriority(LEPTON_SPI_IRQn, IRQ_PRI_DCMI); + HAL_NVIC_EnableIRQ(LEPTON_SPI_IRQn); return 0; } diff --git a/src/omv/stm32fxxx_hal_msp.c b/src/omv/stm32fxxx_hal_msp.c index 4c2810c3e..7272923b5 100644 --- a/src/omv/stm32fxxx_hal_msp.c +++ b/src/omv/stm32fxxx_hal_msp.c @@ -200,6 +200,33 @@ void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) } } +void HAL_SPI_MspInit(SPI_HandleTypeDef *hspi) +{ + #if defined(LEPTON_SPI) + if (hspi->Instance == LEPTON_SPI) { + LEPTON_SPI_CLK_ENABLE(); + + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.Pull = GPIO_PULLUP; + GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; + GPIO_InitStructure.Alternate = LEPTON_SPI_AF; + GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_LOW; + + GPIO_InitStructure.Pin = LEPTON_SPI_SCLK_PIN; + HAL_GPIO_Init(LEPTON_SPI_SCLK_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = LEPTON_SPI_MISO_PIN; + HAL_GPIO_Init(LEPTON_SPI_MISO_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = LEPTON_SPI_MOSI_PIN; + HAL_GPIO_Init(LEPTON_SPI_MOSI_PORT, &GPIO_InitStructure); + + GPIO_InitStructure.Pin = LEPTON_SPI_SSEL_PIN; + HAL_GPIO_Init(LEPTON_SPI_SSEL_PORT, &GPIO_InitStructure); + } + #endif +} + void HAL_MspDeInit(void) {