POV_ (02.03.2020 20:52, просмотров: 4) ответил Aleksey_75 на чудо-чудное! решил попробовать SPI через DMA, и столкнулся с чудесами флаг TCIFx взводится раньше чем фактически заканчивается передача, по факту в середине последнего передаваемого байта.
Пару лет назад озадачился переводом своей платы на стм32 и захотел DMA... Ну как-то на тестовом примере оно сразу взлетело, вопросов не возникло.
void SenBlocAtDMA(uint8_t *buf, uint32_t addr, uint32_t len)
{
DMA_InitTypeDef DMA_InitStructure;
dfStartContinuesWrite(addr, 0);
DMA_DeInit(DMA1_Channel3); //tx
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&SPI1->DR);
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)buf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure.DMA_BufferSize = len;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_Low;
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel3, &DMA_InitStructure);
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);
DMA_Cmd(DMA1_Channel3, ENABLE);
while (DMA_GetFlagStatus(DMA1_IT_TC3) != SET);
DMA_ClearITPendingBit(DMA1_IT_TC3);
DMA_Cmd(DMA1_Channel3, DISABLE);
dfStopContinuesWrite();
}