реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> DMA+SPI, wiznet read регистры
pokk
сообщение Feb 20 2014, 09:07
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 91
Регистрация: 3-07-11
Пользователь №: 66 028



Здравствуйте,начал разбираться с 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){};
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 10:42
Рейтинг@Mail.ru


Страница сгенерированна за 0.01337 секунд с 7
ELECTRONIX ©2004-2016