summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwdfk-prog <[email protected]>2024-07-02 09:27:13 +0800
committerRbb666 <[email protected]>2024-07-12 17:48:17 +0800
commit6e7cf3a6087397a99db5c2444a2d7f79c1f58722 (patch)
tree503e220da430fbb7992fbec06f8caf0feac0ad6b
parentd7914defddc67863033ef4b49a99601d79b9ecd0 (diff)
[components][SPI][spi-bit-ops]修复可能的异常操作
* 移除初始化时未进行引脚初始化就进行引脚设置可能导致的异常 * CS引脚配置判断完善 * xfer返回值优化
-rw-r--r--components/drivers/spi/spi-bit-ops.c55
1 files changed, 25 insertions, 30 deletions
diff --git a/components/drivers/spi/spi-bit-ops.c b/components/drivers/spi/spi-bit-ops.c
index f551741873..679ee44f0c 100644
--- a/components/drivers/spi/spi-bit-ops.c
+++ b/components/drivers/spi/spi-bit-ops.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2006-2023, RT-Thread Development Team
+ * Copyright (c) 2006-2024, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
@@ -423,6 +423,7 @@ rt_ssize_t spi_bit_xfer(struct rt_spi_device *device, struct rt_spi_message *mes
struct rt_spi_bit_ops *ops = obj->ops;
struct rt_spi_configuration *config = &obj->config;
rt_base_t cs_pin = device->cs_pin;
+ rt_ssize_t length = 0;
RT_ASSERT(device != NULL);
RT_ASSERT(message != NULL);
@@ -443,10 +444,17 @@ rt_ssize_t spi_bit_xfer(struct rt_spi_device *device, struct rt_spi_message *mes
#endif
/* take CS */
- if (message->cs_take && (cs_pin != PIN_NONE))
+ if (message->cs_take && !(device->config.mode & RT_SPI_NO_CS) && (cs_pin != PIN_NONE))
{
LOG_I("spi take cs\n");
- rt_pin_write(cs_pin, PIN_LOW);
+ if (device->config.mode & RT_SPI_CS_HIGH)
+ {
+ rt_pin_write(cs_pin, PIN_HIGH);
+ }
+ else
+ {
+ rt_pin_write(cs_pin, PIN_LOW);
+ }
spi_delay(ops);
/* spi phase */
@@ -461,50 +469,41 @@ rt_ssize_t spi_bit_xfer(struct rt_spi_device *device, struct rt_spi_message *mes
{
if (config->data_width <= 8)
{
- spi_xfer_3line_data8(ops,
- config,
- message->send_buf,
- message->recv_buf,
- message->length);
+ length = spi_xfer_3line_data8(ops, config, message->send_buf, message->recv_buf, message->length);
}
else if (config->data_width <= 16)
{
- spi_xfer_3line_data16(ops,
- config,
- message->send_buf,
- message->recv_buf,
- message->length);
+ length = spi_xfer_3line_data16(ops, config, message->send_buf, message->recv_buf, message->length);
}
}
else
{
if (config->data_width <= 8)
{
- spi_xfer_4line_data8(ops,
- config,
- message->send_buf,
- message->recv_buf,
- message->length);
+ length = spi_xfer_4line_data8(ops, config, message->send_buf, message->recv_buf, message->length);
}
else if (config->data_width <= 16)
{
- spi_xfer_4line_data16(ops,
- config,
- message->send_buf,
- message->recv_buf,
- message->length);
+ length = spi_xfer_4line_data16(ops, config, message->send_buf, message->recv_buf, message->length);
}
}
/* release CS */
- if (message->cs_release && (cs_pin != PIN_NONE))
+ if (message->cs_take && !(device->config.mode & RT_SPI_NO_CS) && (cs_pin != PIN_NONE))
{
spi_delay(ops);
- rt_pin_write(cs_pin, PIN_HIGH);
+ if (device->config.mode & RT_SPI_CS_HIGH)
+ {
+ rt_pin_write(cs_pin, PIN_LOW);
+ }
+ else
+ {
+ rt_pin_write(cs_pin, PIN_HIGH);
+ }
LOG_I("spi release cs\n");
}
- return message->length;
+ return length;
}
static const struct rt_spi_ops spi_bit_bus_ops =
@@ -522,9 +521,5 @@ rt_err_t rt_spi_bit_add_bus(struct rt_spi_bit_obj *obj,
obj->config.max_hz = 1 * 1000 * 1000;
obj->config.mode = RT_SPI_MASTER | RT_SPI_MSB | RT_SPI_MODE_0;
- /* idle status */
- if (obj->config.mode & RT_SPI_CPOL) SCLK_H(ops);
- else SCLK_L(ops);
-
return rt_spi_bus_register(&obj->bus, bus_name, &spi_bit_bus_ops);
}