From 4d1dc6334a4c552bea0ee8ebb5302d765bba28a6 Mon Sep 17 00:00:00 2001 From: Liam Howatt Date: Wed, 19 Aug 2026 16:02:22 -0400 Subject: [PATCH] boards/stm32h5/nucleo-h563zi: Register SPI1 spidev. Add board spi1 initialization and generic spi chardev registration for nucleo-h563zi. Specify the SPI1 clock source and frequency on this board for the spi driver. Define the SPI pins for this board. The SPI_A CN7 header pins were used. Include stm32_spi.h in stm32h5/stm32.h. Signed-off-by: Liam Howatt --- arch/arm/src/stm32h5/stm32.h | 1 + .../arm/stm32h5/nucleo-h563zi/include/board.h | 13 ++ .../arm/stm32h5/nucleo-h563zi/src/Make.defs | 4 + .../stm32h5/nucleo-h563zi/src/nucleo-h563zi.h | 25 +++ .../stm32h5/nucleo-h563zi/src/stm32_bringup.c | 12 ++ .../arm/stm32h5/nucleo-h563zi/src/stm32_spi.c | 187 ++++++++++++++++++ 6 files changed, 242 insertions(+) create mode 100644 boards/arm/stm32h5/nucleo-h563zi/src/stm32_spi.c diff --git a/arch/arm/src/stm32h5/stm32.h b/arch/arm/src/stm32h5/stm32.h index 25d810170aa..a5ef98353bc 100644 --- a/arch/arm/src/stm32h5/stm32.h +++ b/arch/arm/src/stm32h5/stm32.h @@ -47,6 +47,7 @@ #include "stm32_lowputc.h" #include "stm32_pwr.h" #include "stm32_rcc.h" +#include "stm32_spi.h" #include "stm32_tim.h" #include "stm32_uart.h" #include "stm32_usbfs.h" diff --git a/boards/arm/stm32h5/nucleo-h563zi/include/board.h b/boards/arm/stm32h5/nucleo-h563zi/include/board.h index 618e7fb4291..187c1bbf6c0 100644 --- a/boards/arm/stm32h5/nucleo-h563zi/include/board.h +++ b/boards/arm/stm32h5/nucleo-h563zi/include/board.h @@ -183,6 +183,10 @@ #endif /* CONFIG_STM32_USE_HSE*/ +/* Select the SPI1 clock and tell driver the frequency */ +#define STM32_RCC_CCIPR3_SPI1SEL RCC_CCIPR3_SPI1SEL_PLL1QCK +#define STM32_SPI1_FREQUENCY STM32_PLL1Q_FREQUENCY + /* Enable CLK48; get it from HSI48 */ #if defined(CONFIG_STM32_USBFS) || defined(CONFIG_STM32_RNG) @@ -332,6 +336,15 @@ /* Alternate function pin selections ****************************************/ +/* SPI1: Arduino Connector CN7 */ + +#define GPIO_SPI1_NSS (GPIO_OUTPUT|GPIO_SPEED_2MHZ| \ + GPIO_PUSHPULL|GPIO_OUTPUT_SET| \ + GPIO_PORTD|GPIO_PIN14) /* PD14 */ +#define GPIO_SPI1_SCK (GPIO_SPI1_SCK_1|GPIO_SPEED_50MHZ) /* PA5 */ +#define GPIO_SPI1_MISO (GPIO_SPI1_MISO_3) /* PG9 */ +#define GPIO_SPI1_MOSI (GPIO_SPI1_MOSI_2|GPIO_SPEED_50MHZ) /* PB5 */ + /* ADC GPIOs ****************************************************************/ #define GPIO_ADC1_INP3 (GPIO_ADC1_INP3_0) diff --git a/boards/arm/stm32h5/nucleo-h563zi/src/Make.defs b/boards/arm/stm32h5/nucleo-h563zi/src/Make.defs index 58888944b0f..828ce6c96c1 100644 --- a/boards/arm/stm32h5/nucleo-h563zi/src/Make.defs +++ b/boards/arm/stm32h5/nucleo-h563zi/src/Make.defs @@ -34,6 +34,10 @@ ifeq ($(CONFIG_ARCH_BUTTONS),y) CSRCS += stm32_buttons.c endif +ifeq ($(CONFIG_STM32_SPI),y) +CSRCS += stm32_spi.c +endif + ifeq ($(CONFIG_ADC),y) CSRCS += stm32_adc.c endif diff --git a/boards/arm/stm32h5/nucleo-h563zi/src/nucleo-h563zi.h b/boards/arm/stm32h5/nucleo-h563zi/src/nucleo-h563zi.h index 1c609efc589..7bbc2507f82 100644 --- a/boards/arm/stm32h5/nucleo-h563zi/src/nucleo-h563zi.h +++ b/boards/arm/stm32h5/nucleo-h563zi/src/nucleo-h563zi.h @@ -115,6 +115,31 @@ int stm32_bringup(void); +#ifdef CONFIG_STM32_SPI +/**************************************************************************** + * Name: stm32_spiregister + * + * Description: + * Called to register spi character driver of initialized + * spi device for the Nucleo-L432KC board. + * + ****************************************************************************/ + +#ifdef CONFIG_SPI_DRIVER +void stm32_spiregister(void); +#endif + +/**************************************************************************** + * Name: stm32_spiinitialize + * + * Description: + * Called to configure SPI chip select GPIO pins. + * + ****************************************************************************/ + +void stm32_spiinitialize(void); +#endif /* CONFIG_STM32_SPI */ + /**************************************************************************** * Name: stm32_adc_setup * diff --git a/boards/arm/stm32h5/nucleo-h563zi/src/stm32_bringup.c b/boards/arm/stm32h5/nucleo-h563zi/src/stm32_bringup.c index eb2cd7e53d4..2cfb9622260 100644 --- a/boards/arm/stm32h5/nucleo-h563zi/src/stm32_bringup.c +++ b/boards/arm/stm32h5/nucleo-h563zi/src/stm32_bringup.c @@ -146,6 +146,18 @@ int stm32_bringup(void) # endif #endif +#ifdef CONFIG_STM32_SPI + /* Cannot call at board init because irq_attach would be called before + * before irq_initialize is called. + */ + + stm32_spiinitialize(); + +#ifdef CONFIG_SPI_DRIVER + stm32_spiregister(); +#endif +#endif /* CONFIG_STM32_SPI */ + #ifdef CONFIG_PWM /* Initialize PWM and register the PWM device. */ diff --git a/boards/arm/stm32h5/nucleo-h563zi/src/stm32_spi.c b/boards/arm/stm32h5/nucleo-h563zi/src/stm32_spi.c new file mode 100644 index 00000000000..b314bb49ef3 --- /dev/null +++ b/boards/arm/stm32h5/nucleo-h563zi/src/stm32_spi.c @@ -0,0 +1,187 @@ +/**************************************************************************** + * boards/arm/stm32h5/nucleo-h563zi/src/stm32_spi.c + * + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include + +#include +#include +#include + +#include "chip.h" +#include + +#include "nucleo-h563zi.h" + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +/* Global driver instances */ + +#ifdef CONFIG_STM32_SPI1 +struct spi_dev_s *g_spi1; +#endif + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Name: stm32_spiregister + * + * Description: + * Called to register spi character driver of + * initialized spi device for the Nucleo-H563ZI board. + * + ****************************************************************************/ + +#ifdef CONFIG_SPI_DRIVER +void stm32_spiregister(void) +{ +#ifdef CONFIG_STM32_SPI1 + int ret = spi_register(g_spi1, 1); + if (ret < 0) + { + spierr("ERROR: FAILED to register driver of SPI port 1\n"); + } +#endif +} +#endif + +/**************************************************************************** + * Name: stm32_spiinitialize + * + * Description: + * Called to configure SPI chip select GPIO pins for the Nucleo-H563ZI + * board. + * + ****************************************************************************/ + +void stm32_spiinitialize(void) +{ + /* NOTE: Clocking for SPI1 was already provided in stm32_rcc.c. + * Configurations of SPI pins is performed in stm32_spi.c. + * Here, we only initialize chip select pins unique to the board + * architecture. + */ + +#ifdef CONFIG_STM32_SPI1 + /* Configure SPI1-based devices */ + + g_spi1 = stm32_spibus_initialize(1); + if (!g_spi1) + { + spierr("ERROR: FAILED to initialize SPI port 1\n"); + } + else + { + spiinfo("INFO: SPI port 1 initialized\n"); + } + + /* Setup CS, EN & IRQ line IOs */ + + stm32_configgpio(GPIO_SPI1_NSS); +#endif +} + +/**************************************************************************** + * Name: stm32_spi1select and stm32_spi1status + * + * Description: + * The external functions, stm32_spi1select and stm32_spi1status + * must be provided by board-specific logic. They are implementations of + * the select and status methods of the SPI interface defined by struct + * spi_ops_s (see include/nuttx/spi/spi.h). All other methods (including + * up_spiinitialize()) are provided by common STM32 logic. To use this + * common SPI logic on your board: + * + * 1. Provide logic in stm32_board_initialize() to configure SPI chip + * select pins. + * 2. Provide stm32_spi1select() and stm32_spi1status() functions + * in your board-specific logic. These functions will perform chip + * selection and status operations using GPIOs in the way your board is + * configured. + * 3. Add a calls to up_spiinitialize() in your low level application + * initialization logic + * 4. The handle returned by up_spiinitialize() may then be used to bind + * the SPI driver to higher level logic (e.g., calling + * mmcsd_spislotinitialize(), for example, will bind the SPI driver to + * the SPI MMC/SD driver). + * + ****************************************************************************/ + +#ifdef CONFIG_STM32_SPI1 +void stm32_spi1select(struct spi_dev_s *dev, uint32_t devid, + bool selected) +{ + spiinfo("devid: %08X CS: %s\n", (int)devid, + selected ? "assert" : "de-assert"); + + stm32_gpiowrite(GPIO_SPI1_NSS, !selected); +} + +uint8_t stm32_spi1status(struct spi_dev_s *dev, uint32_t devid) +{ + return 0; +} +#endif + +/**************************************************************************** + * Name: stm32_spi1cmddata + * + * Description: + * Set or clear the SH1101A A0 or SD1306 D/C n bit to select data (true) + * or command (false). This function must be provided by platform-specific + * logic. This is an implementation of the cmddata method of the SPI + * interface defined by struct spi_ops_s (see include/nuttx/spi/spi.h). + * + * Input Parameters: + * + * spi - SPI device that controls the bus the device that requires the CMD/ + * DATA selection. + * devid - If there are multiple devices on the bus, this selects which one + * to select cmd or data. NOTE: This design restricts, for example, + * one one SPI display per SPI bus. + * cmd - true: select command; false: select data + * + * Returned Value: + * OK on success or negative error code + * + ****************************************************************************/ + +#ifdef CONFIG_SPI_CMDDATA +#ifdef CONFIG_STM32_SPI1 +int stm32_spi1cmddata(struct spi_dev_s *dev, uint32_t devid, bool cmd) +{ + return -ENODEV; +} +#endif +#endif /* CONFIG_SPI_CMDDATA */