| | |
| | | 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 |
| | |
| | | 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) |
| | |
| | | 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); |
| | |
| | | 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; |
| | |
| | | |
| | | 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); |
| | | |
| | |
| | | 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); |
| | | } |
| | |
| | | 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); |
| | |
| | | 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); |
| | |
| | | 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 |
| | |
| | | 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)) |
| | | { |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | } |
| | | } |
| | | |
| | | 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); |
| | | } |