From 7c05d8517c09f6a859b85cca689690d0968c4636 Mon Sep 17 00:00:00 2001 From: liYangYang <941843540@qq.com> Date: Sun, 8 Jan 2023 12:03:42 +0800 Subject: [PATCH] =?UTF-8?q?[STM32][SPI]=E8=A7=A3=E5=86=B3=E6=8C=82?= =?UTF-8?q?=E8=BD=BD=E5=87=BD=E6=95=B0=E9=87=8C=E9=9D=A2=E4=B8=8D=E5=90=8C?= =?UTF-8?q?bsp=E5=AF=B9uaer=5Fdata=E7=9A=84=E6=BB=A5=E7=94=A8=20(#6819)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [spi]attach 片选引脚依赖pin框架 * 修改attach函数 --- bsp/stm32/libraries/HAL_Drivers/drv_spi.c | 34 ++++++++--------------- bsp/stm32/libraries/HAL_Drivers/drv_spi.h | 8 +----- components/drivers/include/drivers/spi.h | 2 ++ components/drivers/spi/spi_core.c | 1 + 4 files changed, 16 insertions(+), 29 deletions(-) diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_spi.c b/bsp/stm32/libraries/HAL_Drivers/drv_spi.c index 201c653dd1..c4b1980181 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_spi.c +++ b/bsp/stm32/libraries/HAL_Drivers/drv_spi.c @@ -85,6 +85,9 @@ static rt_err_t stm32_spi_init(struct stm32_spi *spi_drv, struct rt_spi_configur RT_ASSERT(spi_drv != RT_NULL); RT_ASSERT(cfg != RT_NULL); + rt_pin_mode(cfg->cs_pin, PIN_MODE_OUTPUT); + rt_pin_write(cfg->cs_pin, PIN_HIGH); + SPI_HandleTypeDef *spi_handle = &spi_drv->handle; if (cfg->mode & RT_SPI_SLAVE) @@ -291,19 +294,17 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message * RT_ASSERT(device != RT_NULL); RT_ASSERT(device->bus != RT_NULL); - RT_ASSERT(device->bus->parent.user_data != RT_NULL); RT_ASSERT(message != RT_NULL); struct stm32_spi *spi_drv = rt_container_of(device->bus, struct stm32_spi, spi_bus); SPI_HandleTypeDef *spi_handle = &spi_drv->handle; - struct stm32_hw_spi_cs *cs = device->parent.user_data; if (message->cs_take && !(device->config.mode & RT_SPI_NO_CS)) { if (device->config.mode & RT_SPI_CS_HIGH) - HAL_GPIO_WritePin(cs->GPIOx, cs->GPIO_Pin, GPIO_PIN_SET); + rt_pin_write(device->config.cs_pin, PIN_HIGH); else - HAL_GPIO_WritePin(cs->GPIOx, cs->GPIO_Pin, GPIO_PIN_RESET); + rt_pin_write(device->config.cs_pin, PIN_LOW); } LOG_D("%s transfer prepare and start", spi_drv->config->bus_name); @@ -435,9 +436,9 @@ static rt_uint32_t spixfer(struct rt_spi_device *device, struct rt_spi_message * if (message->cs_release && !(device->config.mode & RT_SPI_NO_CS)) { if (device->config.mode & RT_SPI_CS_HIGH) - HAL_GPIO_WritePin(cs->GPIOx, cs->GPIO_Pin, GPIO_PIN_RESET); + rt_pin_write(device->config.cs_pin, PIN_LOW); else - HAL_GPIO_WritePin(cs->GPIOx, cs->GPIO_Pin, GPIO_PIN_SET); + rt_pin_write(device->config.cs_pin, PIN_HIGH); } return message->length; @@ -570,33 +571,22 @@ static int rt_hw_spi_bus_init(void) /** * Attach the spi device to SPI bus, this function must be used after initialization. */ -rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, GPIO_TypeDef *cs_gpiox, uint16_t cs_gpio_pin) +rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, struct rt_spi_configuration *cfg) { RT_ASSERT(bus_name != RT_NULL); RT_ASSERT(device_name != RT_NULL); rt_err_t result; struct rt_spi_device *spi_device; - struct stm32_hw_spi_cs *cs_pin; - - /* initialize the cs pin && select the slave*/ - GPIO_InitTypeDef GPIO_Initure; - GPIO_Initure.Pin = cs_gpio_pin; - GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP; - GPIO_Initure.Pull = GPIO_PULLUP; - GPIO_Initure.Speed = GPIO_SPEED_FREQ_HIGH; - HAL_GPIO_Init(cs_gpiox, &GPIO_Initure); - HAL_GPIO_WritePin(cs_gpiox, cs_gpio_pin, GPIO_PIN_SET); /* attach the device to spi bus*/ spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device)); RT_ASSERT(spi_device != RT_NULL); - cs_pin = (struct stm32_hw_spi_cs *)rt_malloc(sizeof(struct stm32_hw_spi_cs)); - RT_ASSERT(cs_pin != RT_NULL); - cs_pin->GPIOx = cs_gpiox; - cs_pin->GPIO_Pin = cs_gpio_pin; - result = rt_spi_bus_attach_device(spi_device, device_name, bus_name, (void *)cs_pin); + result = rt_spi_bus_attach_device(spi_device, device_name, bus_name, RT_NULL); + + result = rt_spi_configure(spi_device, cfg); + if (result != RT_EOK) { LOG_E("%s attach to %s faild, %d\n", device_name, bus_name, result); diff --git a/bsp/stm32/libraries/HAL_Drivers/drv_spi.h b/bsp/stm32/libraries/HAL_Drivers/drv_spi.h index bdb5e29ecd..16976bb36e 100644 --- a/bsp/stm32/libraries/HAL_Drivers/drv_spi.h +++ b/bsp/stm32/libraries/HAL_Drivers/drv_spi.h @@ -22,18 +22,12 @@ extern "C" { #endif -rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, GPIO_TypeDef* cs_gpiox, uint16_t cs_gpio_pin); +rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name, struct rt_spi_configuration *cfg); #ifdef __cplusplus } #endif -struct stm32_hw_spi_cs -{ - GPIO_TypeDef* GPIOx; - uint16_t GPIO_Pin; -}; - struct stm32_spi_config { SPI_TypeDef *Instance; diff --git a/components/drivers/include/drivers/spi.h b/components/drivers/include/drivers/spi.h index 0bcac3aac0..2cce830cd6 100644 --- a/components/drivers/include/drivers/spi.h +++ b/components/drivers/include/drivers/spi.h @@ -15,6 +15,7 @@ #include #include +#include #ifdef __cplusplus extern "C"{ @@ -78,6 +79,7 @@ struct rt_spi_configuration rt_uint8_t mode; rt_uint8_t data_width; rt_uint16_t reserved; + rt_base_t cs_pin; rt_uint32_t max_hz; }; diff --git a/components/drivers/spi/spi_core.c b/components/drivers/spi/spi_core.c index 6bc875fccd..7aa09c9010 100644 --- a/components/drivers/spi/spi_core.c +++ b/components/drivers/spi/spi_core.c @@ -80,6 +80,7 @@ rt_err_t rt_spi_configure(struct rt_spi_device *device, device->config.data_width = cfg->data_width; device->config.mode = cfg->mode & RT_SPI_MODE_MASK ; device->config.max_hz = cfg->max_hz ; + device->config.cs_pin = cfg->cs_pin ; if (device->bus != RT_NULL) { -- GitLab