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