diff --git a/components/drivers/spi/spi-bit-ops.c b/components/drivers/spi/spi-bit-ops.c index f551741873b..679ee44f0cb 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); }