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_i2c.c |   60 +++++++++++++++++++++++++++---------------------------------
 1 files changed, 27 insertions(+), 33 deletions(-)

diff --git a/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/peripheral/src/pan_hal_i2c.c b/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/peripheral/src/pan_hal_i2c.c
index ae2205d..d350148 100644
--- a/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/peripheral/src/pan_hal_i2c.c
+++ b/01_SDK/modules/hal/panchip/panplat/pan1070/bsp/peripheral/src/pan_hal_i2c.c
@@ -291,8 +291,7 @@
     i2c->TxXferSize = Size;
     i2c->TxXferCount = 0;
 
-    I2C_SetTxTirggerLevel(i2c->I2Cx, I2C_TX_TL_0);
-    I2C_DMATransferDataLevel(i2c->I2Cx, I2C_TX_TL_0);
+    I2C_DMATransferDataLevel(i2c->I2Cx, I2C_TX_TL_1); // I2C Tx-FIFO DMA-Trigger-Level = 1
 
     I2C_DMACmd(i2c->I2Cx, ENABLE);
     // Initialize the DMA controller
@@ -305,17 +304,15 @@
     dma_mem2i2c_config.PeripheralDst = i2c->DMA_DST;
     DMAC_Channel_Array[DmaChNum].ConfigTmp = dma_mem2i2c_config;
     DMAC_Channel_Array[DmaChNum].CallbackI2c = Callback;
-    DMAC_Channel_Array[DmaChNum].XferFlag = false;
     DMAC_Channel_Array[DmaChNum].pBuffPtr = (uint32_t *)i2c->pTxBuffPtr;
     DMAC_Channel_Array[DmaChNum].XferSize = i2c->TxXferSize;
     DMAC_Channel_Array[DmaChNum].PeriMode = DMAC_Peri_I2C;
     /*enable dma transfer interrupt*/
     DMAC_ClrIntFlagMsk(DMA, DmaChNum, DMAC_FLAG_INDEX_TFR);
-    
+
     DMAC_SetChannelConfig(DMA, DmaChNum, &DMAC_Channel_Array[DmaChNum].ConfigTmp);
     /*start dma tx channel*/
-
-    DMAC_StartChannel(DMA, DmaChNum, i2c->pTxBuffPtr, (void *)&(i2c->I2Cx->DATACMD), i2c->TxXferSize);
+    DMAC_StartChannel(DMA, DmaChNum, i2c->pTxBuffPtr, (void *)&(i2c->I2Cx->DATACMD), i2c->TxXferSize/4);
 }
 
 static void HAL_I2C_Master_SendData_DMA_U16_STC(I2C_HandleTypeDef *i2c, uint16_t DevAddress, uint16_t *Buf, uint32_t Size, I2C_CallbackFunc Callback)
@@ -324,11 +321,8 @@
     i2c->TxXferSize = Size;
     i2c->TxXferCount = 0;
 
-    I2C_SetTxTirggerLevel(i2c->I2Cx, I2C_TX_TL_0);
-    I2C_DMATransferDataLevel(i2c->I2Cx, I2C_TX_TL_0);
-
-    I2C_SetRxTirggerLevel(i2c->I2Cx, I2C_RX_TL_3);
-    I2C_DMAReceiveDataLevel(i2c->I2Cx, I2C_RX_TL_3);
+    I2C_DMATransferDataLevel(i2c->I2Cx, I2C_TX_TL_1); // I2C Tx-FIFO DMA-Trigger-Level = 1
+    I2C_DMAReceiveDataLevel(i2c->I2Cx, I2C_RX_TL_3);  // I2C Rx-FIFO DMA-Trigger-Level = 4
 
     // Initialize the DMA controller
     DMAC_Init(DMA);
@@ -337,10 +331,9 @@
     uint32_t DmaChNum = 0xFF;
     DmaChNum = DMAC_AcquireChannel(DMA);
 
-    dma_mem2i2c_config.PeripheralDst = i2c->DMA_DST;
+    dma_mem2i2c_u16_config.PeripheralDst = i2c->DMA_DST;
     DMAC_Channel_Array[DmaChNum].ConfigTmp = dma_mem2i2c_u16_config;
     DMAC_Channel_Array[DmaChNum].CallbackI2c = Callback;
-    DMAC_Channel_Array[DmaChNum].XferFlag = false;
     DMAC_Channel_Array[DmaChNum].pBuffPtr = (uint32_t *)Buf;
     DMAC_Channel_Array[DmaChNum].XferSize = i2c->TxXferSize;
     DMAC_Channel_Array[DmaChNum].PeriMode = DMAC_Peri_I2C;
@@ -349,21 +342,24 @@
     
     DMAC_SetChannelConfig(DMA, DmaChNum, &DMAC_Channel_Array[DmaChNum].ConfigTmp);
     /*start dma tx channel*/
-
     DMAC_StartChannel(DMA, DmaChNum, Buf, (void *)&(i2c->I2Cx->DATACMD), i2c->TxXferSize);
-
 }
 
 static uint16_t cmd_buf[256]={0};
 
 void HAL_I2C_Master_ReceiveData_DMA(I2C_HandleTypeDef *i2c, uint16_t DevAddress, uint8_t *Buf, uint32_t Size, I2C_CallbackFunc Callback)
 {
-    uint16_t i;
-	for(i=0;i<Size-1;i++){
+    uint16_t i = 0;
+
+    // Check to avoid buf overflow
+    if (Size > 256) {
+        return;
+    }
+
+    for(; i < Size - 1; i++) {
         cmd_buf[i] = (I2C_CMD_RD << 8);
     }
     cmd_buf[i] = ((I2C_CMD_RD|I2C_CMD_STOP) << 8);
-
 
     HAL_I2C_Master_SendData_DMA_U16_STC(i2c,DevAddress, cmd_buf, Size, NULL);
 
@@ -380,12 +376,11 @@
     dma_i2c2mem_config.PeripheralSrc = i2c->DMA_SRC;
     DMAC_Channel_Array[DmaChNum].ConfigTmp = dma_i2c2mem_config;
     DMAC_Channel_Array[DmaChNum].CallbackI2c = Callback;
-    DMAC_Channel_Array[DmaChNum].XferFlag = false;
     DMAC_Channel_Array[DmaChNum].pBuffPtr = (uint32_t*)i2c->pRxBuffPtr;
     DMAC_Channel_Array[DmaChNum].XferSize = i2c->RxXferSize;
     DMAC_Channel_Array[DmaChNum].PeriMode = DMAC_Peri_I2C;
     DMAC_SetChannelConfig(DMA, DmaChNum, &DMAC_Channel_Array[DmaChNum].ConfigTmp);
-    /*start dma tx channel*/
+    /*start dma rx channel*/
     DMAC_StartChannel(DMA, DmaChNum, (void *)&(i2c->I2Cx->DATACMD), i2c->pRxBuffPtr, i2c->RxXferSize);
     I2C_DMACmd(i2c->I2Cx, ENABLE);
 }
@@ -480,10 +475,7 @@
     i2c->TxXferSize = Size;
     i2c->TxXferCount = 0;
 
-    I2C_SetTxTirggerLevel(i2c->I2Cx, I2C_TX_TL_3);
-    I2C_SetRxTirggerLevel(i2c->I2Cx, I2C_RX_TL_3);
-    I2C_DMATransferDataLevel(i2c->I2Cx, I2C_TX_TL_3);
-    I2C_DMAReceiveDataLevel(i2c->I2Cx, I2C_RX_TL_3);
+    I2C_DMATransferDataLevel(i2c->I2Cx, I2C_TX_TL_1); // I2C Tx-FIFO DMA-Trigger-Level = 1
 
     // Initialize the DMA controller
     DMAC_Init(DMA);
@@ -498,13 +490,12 @@
     dma_mem2i2c_config.PeripheralDst = i2c->DMA_DST;
     DMAC_Channel_Array[DmaChNum].ConfigTmp = dma_mem2i2c_config;
     DMAC_Channel_Array[DmaChNum].CallbackI2c = Callback;
-    DMAC_Channel_Array[DmaChNum].XferFlag = false;
     DMAC_Channel_Array[DmaChNum].pBuffPtr = (uint32_t *)i2c->pTxBuffPtr;
     DMAC_Channel_Array[DmaChNum].XferSize = i2c->TxXferSize;
     DMAC_Channel_Array[DmaChNum].PeriMode = DMAC_Peri_I2C;
     DMAC_SetChannelConfig(DMA, DmaChNum, &DMAC_Channel_Array[DmaChNum].ConfigTmp);
     /*start dma tx channel*/
-    DMAC_StartChannel(DMA, DmaChNum, i2c->pTxBuffPtr, (void *)&(i2c->I2Cx->DATACMD), i2c->TxXferSize/4);
+    DMAC_StartChannel(DMA, DmaChNum, i2c->pTxBuffPtr, (void *)&(i2c->I2Cx->DATACMD), i2c->TxXferSize);
     while(!I2C_GetRawITStatus(i2c->I2Cx, I2C_IT_RD_REQ)){}
     I2C_DMACmd(i2c->I2Cx, ENABLE);
     I2C_ClearITPendingBit(i2c->I2Cx, I2C_IT_RD_REQ);
@@ -516,8 +507,7 @@
     i2c->RxXferSize = Size;
     i2c->RxXferCount = 0;
 
-    I2C_SetRxTirggerLevel(i2c->I2Cx, I2C_RX_TL_3);
-    I2C_DMAReceiveDataLevel(i2c->I2Cx, I2C_RX_TL_3);
+    I2C_DMAReceiveDataLevel(i2c->I2Cx, I2C_RX_TL_3); // I2C Rx-FIFO DMA-Trigger-Level = 4
 
     I2C_DMACmd(i2c->I2Cx, ENABLE);
     // Initialize the DMA controller
@@ -531,17 +521,15 @@
     dma_i2c2mem_config.PeripheralSrc = i2c->DMA_SRC;
     DMAC_Channel_Array[DmaChNum].ConfigTmp = dma_i2c2mem_config;
     DMAC_Channel_Array[DmaChNum].CallbackI2c = Callback;
-    DMAC_Channel_Array[DmaChNum].XferFlag = false;
     DMAC_Channel_Array[DmaChNum].pBuffPtr = (uint32_t *)i2c->pRxBuffPtr;
     DMAC_Channel_Array[DmaChNum].XferSize = i2c->RxXferSize;
     DMAC_Channel_Array[DmaChNum].PeriMode = DMAC_Peri_I2C;
     DMAC_SetChannelConfig(DMA, DmaChNum, &DMAC_Channel_Array[DmaChNum].ConfigTmp);
     /*start dma tx channel*/
     DMAC_StartChannel(DMA, DmaChNum, (void *)&(i2c->I2Cx->DATACMD), i2c->pRxBuffPtr, i2c->RxXferSize);
-
 }
 
-void I2C0_IRQHandler()
+__WEAK void I2C0_IRQHandlerOverlay(void)
 {
     if (I2C_GetITStatus(I2C0, I2C_IT_TX_EMPTY))
     {
@@ -629,8 +617,14 @@
                 }
             }
         }
-    
-        
     }
 }
 
+void I2C0_IRQHandler(void)
+{
+    PAN_IO_TIMING_TRACK_LEVEL(CONFIG_TRACK_PIN_I2C_IRQ, 1);
+
+    I2C0_IRQHandlerOverlay();
+
+    PAN_IO_TIMING_TRACK_LEVEL(CONFIG_TRACK_PIN_I2C_IRQ, 0);
+}

--
Gitblit v1.9.3