From adfc7e798b9cbdd022bf8df971843436912a0fe5 Mon Sep 17 00:00:00 2001
From: chen <15335560115@163.com>
Date: 星期日, 20 七月 2025 16:58:30 +0800
Subject: [PATCH] 成功移植g_com_map表逻辑,初步测试能读能写,并且TDOA效果和官方一致

---
 keil/include/components/uci/src/uci_spi_driver.c |   50 ++++++++++++++++++++++++++++++++------------------
 1 files changed, 32 insertions(+), 18 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..02079c6 100644
--- a/keil/include/components/uci/src/uci_spi_driver.c
+++ b/keil/include/components/uci/src/uci_spi_driver.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and
+ * Copyright (c) 2019-2025 Beijing Hanwei Innovation Technology Ltd. Co. and
  * its subsidiaries and affiliates (collectly called MKSEMI).
  *
  * All rights reserved.
@@ -66,6 +66,8 @@
 uci_tl_dev_t g_uci_tl_dev = {
     .uci_tl_setup = &uci_tl_setup,
     .uci_tl_resume = &uci_tl_setup,
+    .uci_tl_rx_stop = NULL,
+    .uci_tl_rx_restart = NULL,
     .uci_tl_up_is_active = &uci_tl_up_is_active,
     .uci_tl_up_req = &uci_tl_up_req,
     .uci_tl_timer_notify = &uci_tl_timer_notify,
@@ -112,7 +114,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)
         {
@@ -140,7 +142,7 @@
 
 static void tx_over_callback(void *dev, uint32_t err_code)
 {
-    WsfTimerStop(&g_uci_tl_dev.tl_timer);
+    mk_timer_list_stop_timer(&g_uci_tl_dev.tl_timer);
 
     if (tl_up_msg)
     {
@@ -160,7 +162,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 +175,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);
+        mk_timer_list_start_timer(&g_uci_tl_dev.tl_timer, UCI_HS_TIMEOUT_MS, MK_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
     {
+        mk_timer_list_stop_timer(&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 +214,17 @@
             }
             spi_open(UCI_PORT, &uci_spi_cfg);
             spi_transfer(UCI_PORT, send_buff, recv_buff, UCI_RX_BUFF_SIZE, NULL);
+            mk_timer_list_start_timer(&g_uci_tl_dev.tl_timer, UCI_HS_TIMEOUT_MS, MK_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
     {
+        mk_timer_list_stop_timer(&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 +234,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,9 +289,10 @@
                 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);
+                mk_timer_list_start_timer(&g_uci_tl_dev.tl_timer, UCI_HS_TIMEOUT_MS, MK_TIMER_ONE_SHOT);
                 power_mode_request(POWER_UNIT_UCI_TX, POWER_MODE_SLEEP);
             }
         }
@@ -318,11 +320,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 +353,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