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