Перейти к содержанию
    

ATSAML21 DMAC прерывания по окончании передачи

Использую DMAC при работе с DAC. Два массива данных для передачи, соответственно два дескриптора ДМА, первичный и вторичный. Все работает, как нужно. Сконфигурированы прерывания по окончании передачи каждого блока. То есть в течение передачи обоих массивов происходит два прерывания. Каким образом программно различить эти прерывания?
Суть в том, что пока один массив пересылается в DAC, значения второго требуется обновлять.

 

PS: В качестве возможного решения видится подсчет произошедших прерываний, и выбор четное-нечетное. Но этот метод мне не кажется надежным.

Изменено пользователем nanorobot

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пришел к выводу, что это невозможно. Решил проблему иначе. Прерывания от DMAC по окончании всей тразакции. По передаче блока - генерация события, и, соответственно, прерывание уже от EVSYS.

Изменено пользователем nanorobot

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, nanorobot сказал:

PS: В качестве возможного решения видится подсчет произошедших прерываний, и выбор четное-нечетное. Но этот метод мне не кажется надежным.

Почему? Почти всегда так и делаю. На всех МК. Никогда не подводило.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 minutes ago, jcxz said:

Почему? Почти всегда так и делаю. На всех МК. Никогда не подводило.

На всех МК?.. Далеко не для всех мк есть понятие дескриптора  DMA, а без него и подобной проблемы не может возникнуть(?)

PS. по крайней той системы какскадирования дескрипторов, какая есть в ATSAML, еще что то похожее я видел у Alwinner V3S

Изменено пользователем nanorobot

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

38 минут назад, nanorobot сказал:

На всех МК?.. Далеко не для всех мк есть понятие дескриптора  DMA, а без него и подобной проблемы не может возникнуть(?)

Linked Lists (NXP, Infineon), Double Buffer (STM32), Ping-Pong (TI Tiva) или ещё как - называться оно может по-разному и набор возможностей может отличаться. Но суть одна: непрерывный поток, обеспечиваемый двумя или более переключаемыми DMA-буферами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

  // если хочется, то можно передать указатель на свои аргументы
  XDMAD_SetCallback(&Dma, dmaSSC_RXch, (XdmadTransferCallback)SSC_Rx_Cb, NULL);
  XDMAD_SetCallback(&Dma, dmaSSC_TXch, (XdmadTransferCallback)SSC_Tx_Cb, NULL);

__________________________________________

  // без доп аргументов *arg
static void SSC_Tx_Cb(uint32_t channel)
{
  //dPIN_OFF(PIN_TEST1);  
  //d0print("SSCDMAcb tx ch:%u dmach:%u\n\r", channel, dmaSSC_TXch);  // потом убрать это
  //NVIC_DisableIRQ(XDMAC_IRQn);
  
  XdmacChid * CHID = &(Dma.pXdmacs->XDMAC_CHID[dmaSSC_TXch]);
  u32 i;
  

  if ( (CHID->XDMAC_CNDA) == (u32)&LLIview0_TX[0] )
  { 
    pF_bufTX_rdy = &F_bufTX[0];
    // в этот момент передаётся вторая часть буфера - по осциллу, и по выводу здесь       
  }
  else //if ((CHID->XDMAC_CNDA) == (u32)&LLIview0_TX[1])         
  {
    pF_bufTX_rdy = &F_bufTX[FBTX_LEN/2];    
  }
  

Я сделал так, всё работает. (ps. same70)

Изменено пользователем TU-104

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...