helpfor studient

Dependents:   STM32_F103-C8T6basecanblink_led

Fork of mbed-dev by mbed official

Revision:
183:a56a73fd2a6f
Parent:
170:19eb464bc2be
--- a/targets/TARGET_Maxim/TARGET_MAX32625/spi_api.c	Fri Feb 16 16:09:33 2018 +0000
+++ b/targets/TARGET_Maxim/TARGET_MAX32625/spi_api.c	Tue Mar 20 16:56:18 2018 +0000
@@ -167,19 +167,58 @@
     return *req.rx_data;
 }
 
-int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length,
-                           char *rx_buffer, int rx_length, char write_fill) {
-    int total = (tx_length > rx_length) ? tx_length : rx_length;
+//******************************************************************************
+int spi_master_block_write(spi_t *obj, const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, char write_fill)
+{
+    spim_req_t req;
+
+    if (!(tx_length | rx_length) ||
+        (tx_length < 0) ||
+        (rx_length < 0)) {
+        return 0;
+    }
+
+    req.width = SPIM_WIDTH_1;
+    req.ssel = 0;
+    req.deass = 1;
+    req.callback = NULL;
 
-    for (int i = 0; i < total; i++) {
-        char out = (i < tx_length) ? tx_buffer[i] : write_fill;
-        char in = spi_master_write(obj, out);
-        if (i < rx_length) {
-            rx_buffer[i] = in;
+    core_util_critical_section_enter();
+    if (tx_length == rx_length) {
+        req.tx_data = (uint8_t *)tx_buffer;
+        req.rx_data = (uint8_t *)rx_buffer;
+        req.len = tx_length;
+        SPIM_Trans(obj->spi, &req);
+    } else if (tx_length < rx_length) {
+        req.tx_data = (tx_length > 0) ? (uint8_t *)tx_buffer : NULL;
+        req.rx_data = (uint8_t *)rx_buffer;
+        req.len = (tx_length > 0) ? tx_length : rx_length;
+        SPIM_Trans(obj->spi, &req);
+
+        if (tx_length) {
+            req.tx_data = NULL;
+            req.rx_data = (uint8_t *)(rx_buffer + tx_length);
+            req.len = rx_length - tx_length;
+            SPIM_Trans(obj->spi, &req);
+        }
+    } else {
+        req.tx_data = (uint8_t *)tx_buffer;
+        req.rx_data = (rx_length > 0) ? (uint8_t *)rx_buffer : NULL;
+        req.len = (rx_length > 0) ? rx_length : tx_length;
+        SPIM_Trans(obj->spi, &req);
+
+        if (rx_length) {
+            req.tx_data = (uint8_t *)(tx_buffer + rx_length);
+            req.rx_data = NULL;
+            req.len = tx_length - rx_length;
+            SPIM_Trans(obj->spi, &req);
         }
     }
+    core_util_critical_section_exit();
 
-    return total;
+    while (SPIM_Busy(obj->spi));
+
+    return tx_length > rx_length ? tx_length : rx_length;
 }
 
 //******************************************************************************
@@ -193,4 +232,3 @@
 {
     return obj->index;
 }
-