stm32/spi: Add STM32WL5 SUBGHZ SPI peripheral.
This is a "normal" SPI peripheral with no external pins, to avoid having to grow spi_obj[] for just this one board map it as SPI ID 3 (board has SPI IDs 1,2 already). Signed-off-by: Angus Gratton <angus@redyak.com.au>
This commit is contained in:
parent
a18d62e067
commit
e6cfb77342
|
@ -48,6 +48,10 @@
|
||||||
#define MICROPY_HW_SPI1_MISO (pin_A6) // Arduino D12, pin 5 on CN5
|
#define MICROPY_HW_SPI1_MISO (pin_A6) // Arduino D12, pin 5 on CN5
|
||||||
#define MICROPY_HW_SPI1_MOSI (pin_A7) // Arduino D11, pin 4 on CN5
|
#define MICROPY_HW_SPI1_MOSI (pin_A7) // Arduino D11, pin 4 on CN5
|
||||||
|
|
||||||
|
// SUBGHZSPI Internal radio SPI BUS
|
||||||
|
#define MICROPY_HW_SUBGHZSPI_NAME "SUBGHZ"
|
||||||
|
#define MICROPY_HW_SUBGHZSPI_ID 3
|
||||||
|
|
||||||
// User switch; pressing the button makes the input go low
|
// User switch; pressing the button makes the input go low
|
||||||
#define MICROPY_HW_USRSW_PIN (pin_A0)
|
#define MICROPY_HW_USRSW_PIN (pin_A0)
|
||||||
#define MICROPY_HW_USRSW_PULL (GPIO_PULLUP)
|
#define MICROPY_HW_USRSW_PULL (GPIO_PULLUP)
|
||||||
|
|
|
@ -558,6 +558,10 @@ const dma_descr_t dma_SPI_1_RX = { DMA1_Channel1, DMA_REQUEST_SPI1_RX, dma_id_0,
|
||||||
const dma_descr_t dma_SPI_1_TX = { DMA1_Channel2, DMA_REQUEST_SPI1_TX, dma_id_1, &dma_init_struct_spi_i2c };
|
const dma_descr_t dma_SPI_1_TX = { DMA1_Channel2, DMA_REQUEST_SPI1_TX, dma_id_1, &dma_init_struct_spi_i2c };
|
||||||
const dma_descr_t dma_SPI_2_RX = { DMA1_Channel3, DMA_REQUEST_SPI2_RX, dma_id_2, &dma_init_struct_spi_i2c };
|
const dma_descr_t dma_SPI_2_RX = { DMA1_Channel3, DMA_REQUEST_SPI2_RX, dma_id_2, &dma_init_struct_spi_i2c };
|
||||||
const dma_descr_t dma_SPI_2_TX = { DMA1_Channel4, DMA_REQUEST_SPI2_TX, dma_id_3, &dma_init_struct_spi_i2c };
|
const dma_descr_t dma_SPI_2_TX = { DMA1_Channel4, DMA_REQUEST_SPI2_TX, dma_id_3, &dma_init_struct_spi_i2c };
|
||||||
|
#if defined(STM32WL)
|
||||||
|
const dma_descr_t dma_SPI_SUBGHZ_RX = { DMA1_Channel5, DMA_REQUEST_SUBGHZSPI_RX, dma_id_4, &dma_init_struct_spi_i2c };
|
||||||
|
const dma_descr_t dma_SPI_SUBGHZ_TX = { DMA1_Channel6, DMA_REQUEST_SUBGHZSPI_TX, dma_id_5, &dma_init_struct_spi_i2c };
|
||||||
|
#endif
|
||||||
|
|
||||||
static const uint8_t dma_irqn[NSTREAM] = {
|
static const uint8_t dma_irqn[NSTREAM] = {
|
||||||
DMA1_Channel1_IRQn,
|
DMA1_Channel1_IRQn,
|
||||||
|
|
|
@ -136,6 +136,8 @@ extern const dma_descr_t dma_SPI_3_TX;
|
||||||
extern const dma_descr_t dma_SDIO_0;
|
extern const dma_descr_t dma_SDIO_0;
|
||||||
extern const dma_descr_t dma_I2C_4_TX;
|
extern const dma_descr_t dma_I2C_4_TX;
|
||||||
extern const dma_descr_t dma_I2C_4_RX;
|
extern const dma_descr_t dma_I2C_4_RX;
|
||||||
|
extern const dma_descr_t dma_SPI_SUBGHZ_TX;
|
||||||
|
extern const dma_descr_t dma_SPI_SUBGHZ_RX;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,9 @@ STATIC SPI_HandleTypeDef SPIHandle5 = {.Instance = NULL};
|
||||||
#if defined(MICROPY_HW_SPI6_SCK)
|
#if defined(MICROPY_HW_SPI6_SCK)
|
||||||
STATIC SPI_HandleTypeDef SPIHandle6 = {.Instance = NULL};
|
STATIC SPI_HandleTypeDef SPIHandle6 = {.Instance = NULL};
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(MICROPY_HW_SUBGHZSPI_ID)
|
||||||
|
static SPI_HandleTypeDef SPIHandleSubGhz = {.Instance = NULL};
|
||||||
|
#endif
|
||||||
|
|
||||||
const spi_t spi_obj[6] = {
|
const spi_t spi_obj[6] = {
|
||||||
#if defined(MICROPY_HW_SPI1_SCK)
|
#if defined(MICROPY_HW_SPI1_SCK)
|
||||||
|
@ -76,6 +79,8 @@ const spi_t spi_obj[6] = {
|
||||||
#endif
|
#endif
|
||||||
#if defined(MICROPY_HW_SPI3_SCK)
|
#if defined(MICROPY_HW_SPI3_SCK)
|
||||||
{&SPIHandle3, &dma_SPI_3_TX, &dma_SPI_3_RX},
|
{&SPIHandle3, &dma_SPI_3_TX, &dma_SPI_3_RX},
|
||||||
|
#elif MICROPY_HW_SUBGHZSPI_ID == 3
|
||||||
|
{&SPIHandleSubGhz, &dma_SPI_SUBGHZ_TX, &dma_SPI_SUBGHZ_RX},
|
||||||
#else
|
#else
|
||||||
{NULL, NULL, NULL},
|
{NULL, NULL, NULL},
|
||||||
#endif
|
#endif
|
||||||
|
@ -96,6 +101,10 @@ const spi_t spi_obj[6] = {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(MICROPY_HW_SUBGHZSPI_ID) && MICROPY_HW_SUBGHZSPI_ID != 3
|
||||||
|
#error "spi_obj needs updating for new value of MICROPY_HW_SUBGHZSPI_ID"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(STM32H5) || defined(STM32H7)
|
#if defined(STM32H5) || defined(STM32H7)
|
||||||
// STM32H5/H7 HAL requires SPI IRQs to be enabled and handled.
|
// STM32H5/H7 HAL requires SPI IRQs to be enabled and handled.
|
||||||
#if defined(MICROPY_HW_SPI1_SCK)
|
#if defined(MICROPY_HW_SPI1_SCK)
|
||||||
|
@ -163,6 +172,9 @@ void spi_init0(void) {
|
||||||
#if defined(MICROPY_HW_SPI6_SCK)
|
#if defined(MICROPY_HW_SPI6_SCK)
|
||||||
SPIHandle6.Instance = SPI6;
|
SPIHandle6.Instance = SPI6;
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(MICROPY_HW_SUBGHZSPI_ID)
|
||||||
|
SPIHandleSubGhz.Instance = SUBGHZSPI;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int spi_find_index(mp_obj_t id) {
|
int spi_find_index(mp_obj_t id) {
|
||||||
|
@ -195,6 +207,10 @@ int spi_find_index(mp_obj_t id) {
|
||||||
} else if (strcmp(port, MICROPY_HW_SPI6_NAME) == 0) {
|
} else if (strcmp(port, MICROPY_HW_SPI6_NAME) == 0) {
|
||||||
spi_id = 6;
|
spi_id = 6;
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef MICROPY_HW_SUBGHZSPI_NAME
|
||||||
|
} else if (strcmp(port, MICROPY_HW_SUBGHZSPI_NAME) == 0) {
|
||||||
|
spi_id = MICROPY_HW_SUBGHZSPI_ID;
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("SPI(%s) doesn't exist"), port);
|
mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("SPI(%s) doesn't exist"), port);
|
||||||
}
|
}
|
||||||
|
@ -239,7 +255,7 @@ STATIC uint32_t spi_get_source_freq(SPI_HandleTypeDef *spi) {
|
||||||
} else {
|
} else {
|
||||||
return HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI6);
|
return HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SPI6);
|
||||||
}
|
}
|
||||||
#else
|
#else // !STM32F0, !STM32G0, !STM32H
|
||||||
#if defined(SPI2)
|
#if defined(SPI2)
|
||||||
if (spi->Instance == SPI2) {
|
if (spi->Instance == SPI2) {
|
||||||
// SPI2 is on APB1
|
// SPI2 is on APB1
|
||||||
|
@ -252,11 +268,20 @@ STATIC uint32_t spi_get_source_freq(SPI_HandleTypeDef *spi) {
|
||||||
return HAL_RCC_GetPCLK1Freq();
|
return HAL_RCC_GetPCLK1Freq();
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(MICROPY_HW_SUBGHZSPI_ID)
|
||||||
|
if (spi->Instance == SUBGHZSPI) {
|
||||||
|
// In STM32WL5x, SUBGHZSPI is PCLK3 which is same as HCLK3, no HCLK3->PCLK3 divider exists in clock tree
|
||||||
|
#if !defined(LL_APB3_GRP1_PERIPH_SUBGHZSPI)
|
||||||
|
#error "SPI needs updating for new SUBGHZSPI clock configuration"
|
||||||
|
#endif
|
||||||
|
return HAL_RCC_GetHCLK3Freq();
|
||||||
|
} else
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
// SPI1, SPI4, SPI5 and SPI6 are on APB2
|
// SPI1, SPI4, SPI5 and SPI6 are on APB2
|
||||||
return HAL_RCC_GetPCLK2Freq();
|
return HAL_RCC_GetPCLK2Freq();
|
||||||
}
|
}
|
||||||
#endif
|
#endif // STM32F0, STM32G0, STM32H
|
||||||
}
|
}
|
||||||
|
|
||||||
// sets the parameters in the SPI_InitTypeDef struct
|
// sets the parameters in the SPI_InitTypeDef struct
|
||||||
|
@ -411,6 +436,12 @@ int spi_init(const spi_t *self, bool enable_nss_pin) {
|
||||||
// enable the SPI clock
|
// enable the SPI clock
|
||||||
__HAL_RCC_SPI6_CLK_ENABLE();
|
__HAL_RCC_SPI6_CLK_ENABLE();
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(MICROPY_HW_SUBGHZSPI_ID)
|
||||||
|
} else if (spi->Instance == SUBGHZSPI) {
|
||||||
|
irqn = SUBGHZSPI_IRQn;
|
||||||
|
// pins remain all NULL, internal bus has no GPIO mappings
|
||||||
|
__HAL_RCC_SUBGHZSPI_CLK_ENABLE();
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
// SPI does not exist for this board (shouldn't get here, should be checked by caller)
|
// SPI does not exist for this board (shouldn't get here, should be checked by caller)
|
||||||
return -MP_EINVAL;
|
return -MP_EINVAL;
|
||||||
|
@ -502,6 +533,14 @@ void spi_deinit(const spi_t *spi_obj) {
|
||||||
__HAL_RCC_SPI6_CLK_DISABLE();
|
__HAL_RCC_SPI6_CLK_DISABLE();
|
||||||
HAL_NVIC_DisableIRQ(SPI6_IRQn);
|
HAL_NVIC_DisableIRQ(SPI6_IRQn);
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(MICROPY_HW_SUBGHZSPI_ID)
|
||||||
|
} else if (spi->Instance == SUBGHZSPI) {
|
||||||
|
__HAL_RCC_SUBGHZSPI_FORCE_RESET();
|
||||||
|
__HAL_RCC_SUBGHZSPI_RELEASE_RESET();
|
||||||
|
__HAL_RCC_SUBGHZSPI_CLK_DISABLE();
|
||||||
|
HAL_NVIC_DisableIRQ(SUBGHZSPI_IRQn);
|
||||||
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -661,6 +700,11 @@ void spi_print(const mp_print_t *print, const spi_t *spi_obj, bool legacy) {
|
||||||
spi_num = 6;
|
spi_num = 6;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
#if defined(MICROPY_HW_SUBGHZSPI_ID)
|
||||||
|
else if (spi->Instance == SUBGHZSPI) {
|
||||||
|
spi_num = MICROPY_HW_SUBGHZSPI_ID;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
mp_printf(print, "SPI(%u", spi_num);
|
mp_printf(print, "SPI(%u", spi_num);
|
||||||
if (spi->State != HAL_SPI_STATE_RESET) {
|
if (spi->State != HAL_SPI_STATE_RESET) {
|
||||||
|
|
Loading…
Reference in New Issue