Код
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];
}
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
}
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){};