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