Browse Source

[device][spi] 修复 rt_spi_sendrecv8/16 收发不同时的问题
rt_spi_send_then_recv是先发再等待一个独立的消息接收
rt_spi_transfer是收发同时进行
rt_spi_sendrecv8/16应使用rt_spi_transfer而不是rt_spi_send_then_recv

Meco Man 2 years ago
parent
commit
93968942c2
2 changed files with 30 additions and 21 deletions
  1. 8 14
      components/drivers/include/drivers/spi.h
  2. 22 7
      components/drivers/spi/spi_core.c

+ 8 - 14
components/drivers/include/drivers/spi.h

@@ -237,10 +237,6 @@ rt_err_t rt_spi_send_then_send(struct rt_spi_device *device,
                                const void           *send_buf2,
                                rt_size_t             send_length2);
 
-rt_err_t rt_spi_sendrecv16(struct rt_spi_device *device,
-                           rt_uint16_t senddata,
-                           rt_uint16_t *recvdata);
-
 /**
  * This function transmits data to SPI device.
  *
@@ -256,6 +252,14 @@ rt_ssize_t rt_spi_transfer(struct rt_spi_device *device,
                            void                 *recv_buf,
                            rt_size_t             length);
 
+rt_err_t rt_spi_sendrecv8(struct rt_spi_device *device,
+                          rt_uint8_t            senddata,
+                          rt_uint8_t           *recvdata);
+
+rt_err_t rt_spi_sendrecv16(struct rt_spi_device *device,
+                           rt_uint16_t           senddata,
+                           rt_uint16_t          *recvdata);
+
 /**
  * This function transfers a message list to the SPI device.
  *
@@ -282,16 +286,6 @@ rt_inline rt_size_t rt_spi_send(struct rt_spi_device *device,
     return rt_spi_transfer(device, send_buf, RT_NULL, length);
 }
 
-rt_inline rt_uint8_t rt_spi_sendrecv8(struct rt_spi_device *device,
-                                      rt_uint8_t            data)
-{
-    rt_uint8_t value = 0;
-
-    rt_spi_send_then_recv(device, &data, 1, &value, 1);
-
-    return value;
-}
-
 /**
  * This function appends a message to the SPI message list.
  *

+ 22 - 7
components/drivers/spi/spi_core.c

@@ -343,11 +343,26 @@ __exit:
     return result;
 }
 
+rt_err_t rt_spi_sendrecv8(struct rt_spi_device *device,
+                          rt_uint8_t            senddata,
+                          rt_uint8_t           *recvdata)
+{
+    rt_ssize_t len = rt_spi_transfer(device, &senddata, recvdata, 1);
+    if (len < 0)
+    {
+        return (rt_err_t)len;
+    }
+    else
+    {
+        return RT_EOK;
+    }
+}
+
 rt_err_t rt_spi_sendrecv16(struct rt_spi_device *device,
-                           rt_uint16_t senddata,
-                           rt_uint16_t *recvdata)
+                           rt_uint16_t           senddata,
+                           rt_uint16_t          *recvdata)
 {
-    rt_err_t result;
+    rt_ssize_t len;
     rt_uint16_t tmp;
 
     if (device->config.mode & RT_SPI_MSB)
@@ -356,10 +371,10 @@ rt_err_t rt_spi_sendrecv16(struct rt_spi_device *device,
         senddata = tmp;
     }
 
-    result = rt_spi_send_then_recv(device, &senddata, 2, recvdata, 2);
-    if(result != RT_EOK)
+    len = rt_spi_transfer(device, &senddata, recvdata, 2);
+    if(len < 0)
     {
-        return result;
+        return (rt_err_t)len;
     }
 
     if (device->config.mode & RT_SPI_MSB)
@@ -368,7 +383,7 @@ rt_err_t rt_spi_sendrecv16(struct rt_spi_device *device,
         *recvdata = tmp;
     }
 
-    return result;
+    return RT_EOK;
 }
 
 struct rt_spi_message *rt_spi_transfer_message(struct rt_spi_device  *device,