From ae079c1fc5d990ba55714d4b3a51b19f96edaec4 Mon Sep 17 00:00:00 2001
From: WXK <287788329@qq.com>
Date: 星期四, 24 四月 2025 16:01:43 +0800
Subject: [PATCH] 改为中断来低电平触发发送当前扫描数据,3s内扫描不到的会退出,串口来55 AA 75 70 64 61 74 65,进入升级模式

---
 01_SDK/modules/hal/panchip/panplat/pan1070/bsp/peripheral/src/pan_hal_spi.c |   57 +++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 39 insertions(+), 18 deletions(-)

diff --git a/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/peripheral/src/pan_hal_spi.c b/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/peripheral/src/pan_hal_spi.c
index f39a16c..efac240 100644
--- a/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/peripheral/src/pan_hal_spi.c
+++ b/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/peripheral/src/pan_hal_spi.c
@@ -15,8 +15,8 @@
 {
     {
         .pSpix = SPI0,  
-        .initObj = {0},
-        .interruptObj = {0},
+//        .initObj = {0},
+//        .interruptObj = {0},
         .xferStat = SPI_STAT_NULL,
         .pTxBuffPtr = NULL,
         .txXferSize = 0,
@@ -33,8 +33,8 @@
     },
     {
         .pSpix = SPI1,  
-        .initObj = {0},
-        .interruptObj = {0},
+//        .initObj = {0},
+//        .interruptObj = {0},
         .xferStat = SPI_STAT_NULL,
         .pTxBuffPtr = NULL,
         .txXferSize = 0,
@@ -155,11 +155,12 @@
         if (!SPI_IsTxFifoFull(pSpi->pSpix))
         {
             SPI_SendData(pSpi->pSpix, pSpi->pTxBuffPtr[pSpi->txXferCount++]);
+			(void)(pSpi->pSpix->DR);
         }
     }
 	while(SPI_IsBusy(pSpi->pSpix)){}
 }
-uint16_t debug_shuzu[20];
+
 void HAL_SPI_ReceiveData(SPI_HandleTypeDef *pSpi, uint16_t *pBuf, size_t size, uint32_t timeout)
 {
     pSpi->rxXferCount = 0;
@@ -195,8 +196,6 @@
             if (!SPI_IsRxFifoEmpty(pSpi->pSpix))
             {
                 pSpi->pRxBuffPtr[pSpi->rxXferCount++] = SPI_ReceiveData(pSpi->pSpix);
-//                debug_shuzu[pSpi->rxXferCount++]= SPI_ReceiveData(pSpi->pSpix);
-                
             }
         }
     }
@@ -247,7 +246,8 @@
     pSpi->rxXferCount =0;
     pSpi->pRxBuffPtr = pBuf;
     pSpi->rxIntCallback = callback;
-    SPI_EnableIrq(pSpi->pSpix, SPI_IRQ_RX_HALF_FULL | SPI_IRQ_RX_TIMEOUT);
+    SPI_EnableIrq(pSpi->pSpix, SPI_IRQ_RX_HALF_FULL);
+    SPI_EnableIrq(pSpi->pSpix, SPI_IRQ_RX_TIMEOUT);
     NVIC_EnableIRQ(pSpi->IRQn);
 }
 
@@ -300,7 +300,7 @@
     /* Condition check */
     uint32_t DataWidthInByteSrc =  DMAC_Channel_Array[dmaChNum].ConfigTmp.DataWidthSrc;
     // uint32_t DataWidthInByteSrc = 1 <<  DMAC_Channel_Array[dmaChNum].ConfigTmp.DataWidthSrc;
-    uint32_t IsNotDivisible = pSpi->txXferSize % DataWidthInByteSrc;
+//    uint32_t IsNotDivisible = pSpi->txXferSize % DataWidthInByteSrc;
     uint32_t BlockSize = pSpi->txXferSize / DataWidthInByteSrc;    //BlockSize = DataLen / DataWidthInByteSrc
 
     /* Start DMA Tx channel */
@@ -338,7 +338,7 @@
 
     /* Condition check */
     uint32_t RxDataWidthInByteSrc =  DMAC_Channel_Array[dmaChNum].ConfigTmp.DataWidthSrc;
-    uint32_t RxIsNotDivisible = pSpi->rxXferSize % RxDataWidthInByteSrc;
+//    uint32_t RxIsNotDivisible = pSpi->rxXferSize % RxDataWidthInByteSrc;
     uint32_t RxBlockSize = pSpi->rxXferSize / RxDataWidthInByteSrc;    //BlockSize = DataLen / DataWidthInByteSrc
 
 	/*We should clear rx fifo before rx start*/
@@ -429,14 +429,14 @@
     rxChNum = HAL_SPI_ReceiveData_DMA_ForSR(pSpi,pRecvBuf,recvBufSize,recvCallback);
     /* Condition check */
     uint32_t RxDataWidthInByteSrc =  DMAC_Channel_Array[rxChNum].ConfigTmp.DataWidthSrc;
-    uint32_t RxIsNotDivisible = pSpi->rxXferSize % RxDataWidthInByteSrc;
+//    uint32_t RxIsNotDivisible = pSpi->rxXferSize % RxDataWidthInByteSrc;
     uint32_t RxBlockSize = pSpi->rxXferSize / RxDataWidthInByteSrc;    //BlockSize = DataLen / DataWidthInByteSrc
 
 
     /* Condition check */
     uint32_t TxDataWidthInByteSrc =  DMAC_Channel_Array[txChNum].ConfigTmp.DataWidthSrc;
     // uint32_t DataWidthInByteSrc = 1 <<  DMAC_Channel_Array[dmaChNum].ConfigTmp.DataWidthSrc;
-    uint32_t TxIsNotDivisible = pSpi->txXferSize % TxDataWidthInByteSrc;
+//    uint32_t TxIsNotDivisible = pSpi->txXferSize % TxDataWidthInByteSrc;
     uint32_t TxBlockSize = pSpi->txXferSize / TxDataWidthInByteSrc;    //BlockSize = DataLen / DataWidthInByteSrc
 
     /* Start DMA Rx channel */
@@ -457,7 +457,8 @@
             {
                 pSpi->rxIntCallback(SPI_CB_FLAG_INT, pSpi->pRxBuffPtr, pSpi->rxXferCount);
             }
-            SPI_DisableIrq(pSpi->pSpix, SPI_IRQ_RX_HALF_FULL|SPI_IRQ_RX_TIMEOUT);
+            SPI_DisableIrq(pSpi->pSpix, SPI_IRQ_RX_HALF_FULL);
+            SPI_DisableIrq(pSpi->pSpix, SPI_IRQ_RX_TIMEOUT);
             break;
         }
     }
@@ -470,15 +471,20 @@
         if (pSpi->txXferCount < pSpi->txXferSize)
         {
             SPI_SendData(pSpi->pSpix, pSpi->pTxBuffPtr[pSpi->txXferCount++]);
+			if ((!SPI_IsRxFifoEmpty(pSpi->pSpix)) && (pSpi->xferStat == SPI_STAT_RXTX)) {
+				pSpi->pRxBuffPtr[pSpi->rxXferCount++] = SPI_ReceiveData(pSpi->pSpix);
+			}
         }
         if (pSpi->txXferCount >= pSpi->txXferSize)
         {
-			while(SPI_IsBusy(pSpi->pSpix)){}
-            SPI_DisableIrq(pSpi->pSpix, SPI_IRQ_TX_HALF_EMPTY);
+			if (pSpi->initObj.role == SPI_RoleMaster) {
+				while(SPI_IsBusy(pSpi->pSpix)){}
+			}
             if (pSpi->txIntCallback != NULL)
             {
                 pSpi->txIntCallback(SPI_CB_FLAG_INT, pSpi->pTxBuffPtr, pSpi->txXferCount);
             }
+			SPI_DisableIrq(pSpi->pSpix, SPI_IRQ_TX_HALF_EMPTY);
             break;
         }
     }
@@ -500,7 +506,7 @@
    {
        SPI_HandleReceivedData(pSpi);
    }
-   else if (SPI_IsIrqActive(pSpi->pSpix, SPI_IRQ_RX_TIMEOUT))
+   if (SPI_IsIrqActive(pSpi->pSpix, SPI_IRQ_RX_TIMEOUT))
    {
        SPI_HandleReceivedData(pSpi);
    }
@@ -511,15 +517,30 @@
    }
 }
 
-void SPI0_IRQHandler(void)
+__WEAK void SPI0_IRQHandlerOverlay(void)
 {
     SPI_HandleProc(&spiHandleArray[0]);
 }
 
-void SPI1_IRQHandler(void)
+__WEAK void SPI1_IRQHandlerOverlay(void)
 {
     SPI_HandleProc(&spiHandleArray[1]);
 }
 
+void SPI0_IRQHandler(void)
+{
+    PAN_IO_TIMING_TRACK_LEVEL(CONFIG_TRACK_PIN_SPI0_IRQ, 1);
 
+    SPI0_IRQHandlerOverlay();
 
+    PAN_IO_TIMING_TRACK_LEVEL(CONFIG_TRACK_PIN_SPI0_IRQ, 0);
+}
+
+void SPI1_IRQHandler(void)
+{
+    PAN_IO_TIMING_TRACK_LEVEL(CONFIG_TRACK_PIN_SPI1_IRQ, 1);
+
+    SPI1_IRQHandlerOverlay();
+
+    PAN_IO_TIMING_TRACK_LEVEL(CONFIG_TRACK_PIN_SPI1_IRQ, 0);
+}

--
Gitblit v1.9.3