Browse Source

[components][SPI][spi-bit-ops]修复可能的异常操作
* 移除初始化时未进行引脚初始化就进行引脚设置可能导致的异常
* CS引脚配置判断完善
* xfer返回值优化

wdfk-prog 1 year ago
parent
commit
6e7cf3a608
1 changed files with 25 additions and 30 deletions
  1. 25 30
      components/drivers/spi/spi-bit-ops.c

+ 25 - 30
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);
 }