mirror of
https://github.com/RT-Thread/rt-thread.git
synced 2025-02-28 01:17:07 +08:00
[STM32][SPI]解决挂载函数里面不同bsp对uaer_data的滥用 (#6819)
* [spi]attach 片选引脚依赖pin框架 * 修改attach函数
This commit is contained in:
parent
98a997c57e
commit
7c05d8517c
@ -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(spi_drv != RT_NULL);
|
||||||
RT_ASSERT(cfg != 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;
|
SPI_HandleTypeDef *spi_handle = &spi_drv->handle;
|
||||||
|
|
||||||
if (cfg->mode & RT_SPI_SLAVE)
|
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 != RT_NULL);
|
||||||
RT_ASSERT(device->bus != RT_NULL);
|
RT_ASSERT(device->bus != RT_NULL);
|
||||||
RT_ASSERT(device->bus->parent.user_data != RT_NULL);
|
|
||||||
RT_ASSERT(message != RT_NULL);
|
RT_ASSERT(message != RT_NULL);
|
||||||
|
|
||||||
struct stm32_spi *spi_drv = rt_container_of(device->bus, struct stm32_spi, spi_bus);
|
struct stm32_spi *spi_drv = rt_container_of(device->bus, struct stm32_spi, spi_bus);
|
||||||
SPI_HandleTypeDef *spi_handle = &spi_drv->handle;
|
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 (message->cs_take && !(device->config.mode & RT_SPI_NO_CS))
|
||||||
{
|
{
|
||||||
if (device->config.mode & RT_SPI_CS_HIGH)
|
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
|
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);
|
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 (message->cs_release && !(device->config.mode & RT_SPI_NO_CS))
|
||||||
{
|
{
|
||||||
if (device->config.mode & RT_SPI_CS_HIGH)
|
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
|
else
|
||||||
HAL_GPIO_WritePin(cs->GPIOx, cs->GPIO_Pin, GPIO_PIN_SET);
|
rt_pin_write(device->config.cs_pin, PIN_HIGH);
|
||||||
}
|
}
|
||||||
|
|
||||||
return message->length;
|
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.
|
* 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(bus_name != RT_NULL);
|
||||||
RT_ASSERT(device_name != RT_NULL);
|
RT_ASSERT(device_name != RT_NULL);
|
||||||
|
|
||||||
rt_err_t result;
|
rt_err_t result;
|
||||||
struct rt_spi_device *spi_device;
|
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*/
|
/* attach the device to spi bus*/
|
||||||
spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device));
|
spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device));
|
||||||
RT_ASSERT(spi_device != RT_NULL);
|
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)
|
if (result != RT_EOK)
|
||||||
{
|
{
|
||||||
LOG_E("%s attach to %s faild, %d\n", device_name, bus_name, result);
|
LOG_E("%s attach to %s faild, %d\n", device_name, bus_name, result);
|
||||||
|
@ -22,18 +22,12 @@
|
|||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct stm32_hw_spi_cs
|
|
||||||
{
|
|
||||||
GPIO_TypeDef* GPIOx;
|
|
||||||
uint16_t GPIO_Pin;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct stm32_spi_config
|
struct stm32_spi_config
|
||||||
{
|
{
|
||||||
SPI_TypeDef *Instance;
|
SPI_TypeDef *Instance;
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
|
#include <rtdevice.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C"{
|
extern "C"{
|
||||||
@ -78,6 +79,7 @@ struct rt_spi_configuration
|
|||||||
rt_uint8_t mode;
|
rt_uint8_t mode;
|
||||||
rt_uint8_t data_width;
|
rt_uint8_t data_width;
|
||||||
rt_uint16_t reserved;
|
rt_uint16_t reserved;
|
||||||
|
rt_base_t cs_pin;
|
||||||
|
|
||||||
rt_uint32_t max_hz;
|
rt_uint32_t max_hz;
|
||||||
};
|
};
|
||||||
|
@ -80,6 +80,7 @@ rt_err_t rt_spi_configure(struct rt_spi_device *device,
|
|||||||
device->config.data_width = cfg->data_width;
|
device->config.data_width = cfg->data_width;
|
||||||
device->config.mode = cfg->mode & RT_SPI_MODE_MASK ;
|
device->config.mode = cfg->mode & RT_SPI_MODE_MASK ;
|
||||||
device->config.max_hz = cfg->max_hz ;
|
device->config.max_hz = cfg->max_hz ;
|
||||||
|
device->config.cs_pin = cfg->cs_pin ;
|
||||||
|
|
||||||
if (device->bus != RT_NULL)
|
if (device->bus != RT_NULL)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user