ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
23 июля
1305009
AlexG (29.04.2023 18:51, просмотров: 1222)
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 сработал на передачу, исходя из происходящего обнуления счетчика байтов которые надо передать