/** * @brief Enable the DMA clock and initialize needed DMA Streams * used by the I2C device. * @param Device : I2C Device instance. * @param Direction : Transfer direction. * @param Options : Transfer Options. * @retval None. */ void CPAL_I2C_HAL_DMAInit(CPAL_DevTypeDef Device, CPAL_DirectionTypeDef Direction, uint32_t Options) { /* Enable I2Cx DMA */ __DMA_CLK_CMD(CPAL_I2C_DMA_CLK[Device], ENABLE); /* I2Cx Common Stream Configuration */ CPAL_DMA_InitStructure.DMA_Channel = CPAL_I2C_DMA_CHANNEL[Device]; CPAL_DMA_InitStructure.DMA_Memory0BaseAddr = 0; CPAL_DMA_InitStructure.DMA_BufferSize = 0; CPAL_DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; CPAL_DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; CPAL_DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; CPAL_DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; CPAL_DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; CPAL_DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; CPAL_DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; CPAL_DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull; CPAL_DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; CPAL_DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; /* Select I2Cx DR Address register as DMA PeripheralBaseAddress */ CPAL_DMA_InitStructure.DMA_PeripheralBaseAddr = CPAL_I2C_DR [Device]; /* If TX Direction (Transmission) selected */ if ((Direction & CPAL_DIRECTION_TX) != 0) { /* Select Memory to Peripheral transfer direction */ CPAL_DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; /* Initialize I2Cx DMA Tx Stream */ DMA_Init((DMA_Stream_TypeDef*)CPAL_I2C_DMA_TX_Stream[Device], &CPAL_DMA_InitStructure); } /* If RX Direction (Reception) selected */ if ((Direction & CPAL_DIRECTION_RX ) != 0) { /* Select Peripheral to Memory transfer direction */ CPAL_DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; /* Initialize I2Cx DMA Rx Stream */ DMA_Init((DMA_Stream_TypeDef*)CPAL_I2C_DMA_RX_Stream[Device], &CPAL_DMA_InitStructure); } }
/** * @brief Enable the DMA clock and initialize needed DMA Channels * used by the I2C device. * @param Device : I2C Device instance. * @param Direction : Transfer direction. * @param Options : Transfer Options. * @retval None. */ void CPAL_I2C_HAL_DMAInit(CPAL_DevTypeDef Device, CPAL_DirectionTypeDef Direction, uint32_t Options) { /* Enable I2Cx DMA */ __DMA_CLK_CMD(CPAL_I2C_DMA_CLK[Device], ENABLE); /* I2Cx Common Channel Configuration */ CPAL_DMA_InitStructure.DMA_BufferSize = 0xFFFF; CPAL_DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; CPAL_DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; CPAL_DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte ; CPAL_DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; CPAL_DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh; CPAL_DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; CPAL_DMA_InitStructure.DMA_MemoryBaseAddr = 0; CPAL_DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; /* If TX Direction (Transmission) selected */ if ((Direction & CPAL_DIRECTION_TX) != 0) { /* Select I2Cx TXDR Address register as DMA PeripheralBaseAddress */ CPAL_DMA_InitStructure.DMA_PeripheralBaseAddr = CPAL_I2C_TXDR [Device]; /* Select Memory to Peripheral transfer direction */ CPAL_DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; /* Initialize I2Cx DMA Tx Channel */ DMA_Init((DMA_Channel_TypeDef*)CPAL_I2C_DMA_TX_Channel[Device], &CPAL_DMA_InitStructure); } /* If RX Direction (Reception) selected */ if ((Direction & CPAL_DIRECTION_RX ) != 0) { /* Select I2Cx RXDR Address register as DMA PeripheralBaseAddress */ CPAL_DMA_InitStructure.DMA_PeripheralBaseAddr = CPAL_I2C_RXDR [Device]; /* Select Peripheral to Memory transfer direction */ CPAL_DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; /* Initialize I2Cx DMA Rx Channel */ DMA_Init((DMA_Channel_TypeDef*)CPAL_I2C_DMA_RX_Channel[Device], &CPAL_DMA_InitStructure); } }