From b32910bdb85c6e9d19abf97f1465c573a0bf9d38 Mon Sep 17 00:00:00 2001
From: zhangbo <zhangbo@qq.com>
Date: 星期四, 13 二月 2025 14:06:13 +0800
Subject: [PATCH] 测试版

---
 keil/include/components/uci/src/uci_spi_driver.c |   42 +++++++++++++++++++++++++++---------------
 1 files changed, 27 insertions(+), 15 deletions(-)

diff --git a/keil/include/components/uci/src/uci_spi_driver.c b/keil/include/components/uci/src/uci_spi_driver.c
index 21a4895..76391e3 100644
--- a/keil/include/components/uci/src/uci_spi_driver.c
+++ b/keil/include/components/uci/src/uci_spi_driver.c
@@ -112,7 +112,7 @@
 {
     if (uci_validate(recv_buff))
     {
-        uint16_t frame_len = *(recv_buff + 3) + UCI_HEADER_SIZE;
+        uint16_t frame_len = (uint16_t)((recv_buff[2] << 8) + recv_buff[3] + UCI_HEADER_SIZE);
 
         if (WsfQueueCount(&g_uci_tl_dev.tl_down_queue) < UCI_MAX_DL_ITEMS)
         {
@@ -160,7 +160,6 @@
         if (!tx_idle)
         {
             gpio_pin_set(SLAVE2HOST_HS_GPIO);
-            WsfTimerStop(&g_uci_tl_dev.tl_timer);
             spi_abort_dma(UCI_PORT, SPI_DMA_ABORT_TX | SPI_DMA_ABORT_RX, NULL, NULL);
             if (tl_up_msg != NULL)
             {
@@ -174,20 +173,22 @@
         memset(send_buff, 0, UCI_TX_BUFF_SIZE);
         spi_open(UCI_PORT, &uci_spi_cfg);
         spi_transfer(UCI_PORT, send_buff, recv_buff, UCI_RX_BUFF_SIZE, NULL);
+        WsfTimerStartMs(&g_uci_tl_dev.tl_timer, UCI_HS_TIMEOUT_MS, WSF_TIMER_ONE_SHOT);
+        gpio_enable_irq(HOST2SLAVE_HS_GPIO, GPIO_IRQ_TYPE_RISING_EDGE, host2slave_gpio_callback);
         gpio_pin_clr(SLAVE2HOST_HS_GPIO);
         rx_idle = false;
-        gpio_enable_irq(HOST2SLAVE_HS_GPIO, GPIO_IRQ_TYPE_RISING_EDGE, host2slave_gpio_callback);
         power_mode_request(POWER_UNIT_UCI_RX, POWER_MODE_SLEEP);
     }
     else
     {
+        WsfTimerStop(&g_uci_tl_dev.tl_timer);
         spi_abort_dma(UCI_PORT, SPI_DMA_ABORT_TX | SPI_DMA_ABORT_RX, NULL, NULL);
         rx_over_callback(NULL, 0);
         memset(recv_buff, 0, UCI_RX_BUFF_SIZE);
         memset(send_buff, 0, UCI_TX_BUFF_SIZE);
+        gpio_enable_irq(HOST2SLAVE_HS_GPIO, GPIO_IRQ_TYPE_FALLING_EDGE, host2slave_gpio_callback);
         gpio_pin_set(SLAVE2HOST_HS_GPIO);
         rx_idle = true;
-        gpio_enable_irq(HOST2SLAVE_HS_GPIO, GPIO_IRQ_TYPE_FALLING_EDGE, host2slave_gpio_callback);
         power_mode_clear(POWER_UNIT_UCI_RX);
     }
 }
@@ -211,19 +212,17 @@
             }
             spi_open(UCI_PORT, &uci_spi_cfg);
             spi_transfer(UCI_PORT, send_buff, recv_buff, UCI_RX_BUFF_SIZE, NULL);
+            WsfTimerStartMs(&g_uci_tl_dev.tl_timer, UCI_HS_TIMEOUT_MS, WSF_TIMER_ONE_SHOT);
+            gpio_enable_irq(HOST2SLAVE_HS_GPIO, GPIO_IRQ_TYPE_RISING_EDGE, host2slave_gpio_callback);
             gpio_pin_clr(SLAVE2HOST_HS_GPIO);
-        }
-        else
-        {
-            WsfTimerStop(&g_uci_tl_dev.tl_timer);
         }
 
         rx_idle = false;
-        gpio_enable_irq(HOST2SLAVE_HS_GPIO, GPIO_IRQ_TYPE_RISING_EDGE, host2slave_gpio_callback);
         power_mode_request(POWER_UNIT_UCI_RX, POWER_MODE_SLEEP);
     }
     else
     {
+        WsfTimerStop(&g_uci_tl_dev.tl_timer);
         spi_abort_dma(UCI_PORT, SPI_DMA_ABORT_TX | SPI_DMA_ABORT_RX, NULL, NULL);
         rx_over_callback(NULL, 0);
         if (!tx_idle)
@@ -233,9 +232,9 @@
         }
         memset(recv_buff, 0, UCI_RX_BUFF_SIZE);
         memset(send_buff, 0, UCI_TX_BUFF_SIZE);
+        gpio_enable_irq(HOST2SLAVE_HS_GPIO, GPIO_IRQ_TYPE_FALLING_EDGE, host2slave_gpio_callback);
         gpio_pin_set(SLAVE2HOST_HS_GPIO);
         rx_idle = true;
-        gpio_enable_irq(HOST2SLAVE_HS_GPIO, GPIO_IRQ_TYPE_FALLING_EDGE, host2slave_gpio_callback);
         power_mode_clear(POWER_UNIT_UCI_RX);
         power_mode_clear(POWER_UNIT_UCI_TX);
     }
@@ -288,6 +287,7 @@
                 spi_transfer(UCI_PORT, send_buff, recv_buff, tl_up_msg->msg_length, tx_over_callback);
 #else
                 spi_transfer(UCI_PORT, send_buff, recv_buff, UCI_RX_BUFF_SIZE, NULL);
+                gpio_enable_irq(HOST2SLAVE_HS_GPIO, GPIO_IRQ_TYPE_RISING_EDGE, host2slave_gpio_callback);
 #endif
                 gpio_pin_clr(SLAVE2HOST_HS_GPIO);
                 WsfTimerStartMs(&g_uci_tl_dev.tl_timer, UCI_HS_TIMEOUT_MS, WSF_TIMER_ONE_SHOT);
@@ -318,11 +318,17 @@
 static void uci_tl_timer_notify(void)
 {
     uint32_t lock = int_lock();
+
+    gpio_enable_irq(HOST2SLAVE_HS_GPIO, GPIO_IRQ_TYPE_FALLING_EDGE, host2slave_gpio_callback);
+    gpio_pin_set(SLAVE2HOST_HS_GPIO);
+
     if (!tx_idle)
     {
-        LOG_INFO(TRACE_MODULE_UCI, "UCI Host did not ACK in time\n");
-        gpio_pin_set(SLAVE2HOST_HS_GPIO);
-        spi_abort_dma(UCI_PORT, SPI_DMA_ABORT_TX | SPI_DMA_ABORT_RX, NULL, NULL);
+        if (rx_idle)
+        {
+            LOG_INFO(TRACE_MODULE_UCI, "UCI Host did not ACK in time\n");
+            spi_abort_dma(UCI_PORT, SPI_DMA_ABORT_TX | SPI_DMA_ABORT_RX, NULL, NULL);
+        }
 
         if (++retry_cnt > UCI_SEND_RETRY_MAX)
         {
@@ -345,10 +351,16 @@
 
         g_uci_tl_dev.uci_tl_up_done_notify();
         tx_idle = true;
+        power_mode_clear(POWER_UNIT_UCI_TX);
+    }
+    if (!rx_idle)
+    {
+        LOG_INFO(TRACE_MODULE_UCI, "UCI Host did not send CMD in time after CMD pin has gone low\n");
+        spi_abort_dma(UCI_PORT, SPI_DMA_ABORT_TX | SPI_DMA_ABORT_RX, NULL, NULL);
+        rx_idle = true;
+        power_mode_clear(POWER_UNIT_UCI_RX);
     }
     int_unlock(lock);
-
-    power_mode_clear(POWER_UNIT_UCI_TX);
 }
 
 #endif

--
Gitblit v1.9.3