CH32F207. Отлаживаю передачу по I2C в режиме Master с
использованием DMA. Код из STшной AN2824, почищенный от не-DMA
способов передачи. Первый пакет уходит нормально, а при попытке
передать второй такой-же DMA срабатывает раньше времени, сразу при
разрешении канала. Напоминает эффект от оставленного несброшенным
флага прерывания при использовании прерываний. В Reference Manual'е
сказано, что DMA чрабатывает по событию TxE, но перед ложным
срабатыванием DMA бит TxE в регистре STAR1 I2C читается как 0.
void I2C_DMAConfig(I2C_TypeDef* I2Cx, uint8_t* pBuffer, uint32_t BufferSize, uint32_t Direction)
{
/* Initialize the DMA with the new parameters */
if (Direction == I2C_DIRECTION_TX)
{
/* Configure the DMA Tx Channel with the buffer address and the buffer size */
I2CDMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)pBuffer;
I2CDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
I2CDMA_InitStructure.DMA_BufferSize = (uint32_t)BufferSize;
if (I2Cx == I2C1)
{
I2CDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)I2C1_DR_Address;
DMA_Cmd(I2C1_DMA_CHANNEL_TX, DISABLE);
DMA_Init(I2C1_DMA_CHANNEL_TX, &I2CDMA_InitStructure);
DMA_Cmd(I2C1_DMA_CHANNEL_TX, ENABLE); // <<<<<< при попытке передать второй пакет DMA срабатывает здесь
}
PS: Я делаю вывод, что канал DMA сработал на передачу, исходя из происходящего обнуления счетчика байтов которые надо передать