Здравствуйте,начал разбираться с DMA сделал функцию чтения.
Код
uint8_t  WIZCHIP_READ_DMA(uint32_t AddrSel){
  unsigned char buff[4];
  unsigned char read[4];
  GPIO_ResetBits(GPIOB, GPIO_Pin_12);
//-------------------Собираем масив---------------------------------------
  AddrSel |= (_W5500_SPI_READ_ | _W5500_SPI_FDM_OP_LEN1_);
  buff[0]=((AddrSel & 0x00FF0000) >> 16);
  buff[1]=((AddrSel & 0x0000FF00) >>  8);
  buff[2]=((AddrSel & 0x000000FF) >>  0);
  buff[3]=0xFF;
//------------------------------------------------------------------------------
    dmaSEND_TX(DMA1_Stream4,buff,4); // отправляем собранный массив
    dmaRESIVE(DMA1_Stream3,read,4);

  while(DMA_GetFlagStatus(DMA1_Stream4,DMA_FLAG_TCIF4)!=SET){};

  while(DMA_GetFlagStatus(DMA1_Stream3,DMA_FLAG_TCIF3)!=SET){};

  DMA_ClearFlag(DMA1_Stream4,DMA_FLAG_TCIF4);
  DMA_ClearFlag(DMA1_Stream3,DMA_FLAG_TCIF3);

  GPIO_SetBits(GPIOB, GPIO_Pin_12);
  return read[3];
}



dmaSEND_TX и dmaRESIVE одинаковы. Прерывания от DMA выключены.
Код
void dmaSEND_TX(DMA_Stream_TypeDef* DMAy_Streamx,unsigned char * buf,unsigned int len){
  DMAy_Streamx->CR &= ~(uint32_t)DMA_SxCR_EN;// Запрет DMA

  DMAy_Streamx->PAR= (uint32_t)(&SPI2->DR);
  DMAy_Streamx->NDTR = len;
  DMAy_Streamx->M0AR =  (uint32_t)buf;

  DMAy_Streamx->CR |= (uint32_t)DMA_SxCR_EN; // STArt  DMA
}


Это всё работало , пока не запустил SysTick . В обработчике прерываний нечего нету просто инкремент одной переменной.
После этого через пару вызовов функций WIZCHIP_READ_DMA она зависает на
Код
   while(DMA_GetFlagStatus(DMA1_Stream3,DMA_FLAG_TCIF3)!=SET){};


Читал где-то что DMA_FLAG выставляется за ранее как только байт положили в регистр.Но как прерывание то может влияет на опрос флага ?

Что происходит с флагами SPI(Приём/передача) после инициализации DMA Они постоянно дёргаются или после того как весь массив передастся они выставятся ? Это вопрос к тому можно ли SPI флага сделать подобную задержку.
Код
   while(DMA_GetFlagStatus(DMA1_Stream3,DMA_FLAG_TCIF3)!=SET){};