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

вопрос по DMA в OMAP-L138

Прошу помощи у знатоков, плотно работавших с OMAP-L138.

 

Задача: принимать данные с внешнего АЦП циклично по SPI.

 

Использую четыре PaRAMset:

 

канал (номер PaRAM set) 22 : для принятия сигнала с АЦП, что данные готовы и отправки dummy byte по SPI

канал 18: для приёма валидных данных с АЦП по SPI (канал 18 слинкован с каналом 64 - пинг буффера)

канал 64: канал пинг буфера, слинкован с каналом 65

канал 65: канал понг буфера, слинкован с каналом 64

 

Соответственно, номер события для EDMA соответствует номеру PaRAMset (номер 18 - SPI_RX).

 

Вопрос: при смене линоквке PaRAM set с 18 на 64 не поменяется источник события? нужно ли переинициализировать источник события для EDMA в этом случае?

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


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

Если правильно понял вопрос...

spi переинициализироать не надо - он и не знает кто его будет писать/читатать.

О прарамсетах:

Настройки 18-го и 65-го должны быть идентичны

Настройки 64-го отличаются от 18 только линком на 65 и src/dst адресом - в соответствии с Вашей задачей

В общем случае правильность работы Вашего пинг понга можно проверить не запуская spi

Инициализируете парамсеты как надо и потом руками (программно) пишите 1 в соответсвующий бит в EVENT SET register в EDMA контроллере - все должно пересылаться и с отключенным spi

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


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

Если правильно понял вопрос...

spi переинициализироать не надо - он и не знает кто его будет писать/читатать.

О прарамсетах:

Настройки 18-го и 65-го должны быть идентичны

Настройки 64-го отличаются от 18 только линком на 65 и src/dst адресом - в соответствии с Вашей задачей

В общем случае правильность работы Вашего пинг понга можно проверить не запуская spi

Инициализируете парамсеты как надо и потом руками (программно) пишите 1 в соответсвующий бит в EVENT SET register в EDMA контроллере - все должно пересылаться и с отключенным spi

 

спасибо за ответ. Я неправильно сформулировал вопрос.

Spi инициализируется один раз и навсегда - это понятно.

 

Вопрос в следующем, когда происходит линк (меняется PaRAM set), нужно ли заново инициализировать источник event для DMA? Дело в том что номер event совпадает с номером PaRAM set (18 - если источник event SPI_RX), когда меняется/линкуется PaRAM set с 18 на 65, остаётся ли event тот же? Или я сильно путаюсь и event тут вообще не причём и при смене PaRAM set меняются только параметры пересылаемых данных?

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


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

При завершении задания для парамсета 18 - контроллер EDMA копирует содиржимое линка (64/65) в парамсет 18 и все продолжает работать без участия процессора.

Таким образом связка ping-pong настраивается 1 раз и работает без участия CPU.

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


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

Спасибо!

Для наглядности, у меня настройка каждого канала происходит в отдельных функциях,

функция для настройки 18го PaRAM set и события от SPI_RX

 

void edmaRecvReload(void)
{
unsigned int shadowRegionId = 1;	// Shadow region used for interrupts
unsigned int edmaRecvChNum = 18;	// Ch18 is SPI1 Receive Event
unsigned int edmaTxEvtQNum = 0;		// Event Queue used
unsigned short edmaRecvACnt = 1;		// 2048 1-byte transmissions
unsigned short edmaBCnt = 2048;		// 1 time transmission
unsigned short edmaCCnt = 1;		// 1 time transmission
unsigned short edmaRecvSrcBIdx = 0;	// Don't want to change the src count offset
unsigned short edmaRecvDesBIdx = 1;	// Increment on destination count offset by one byte
unsigned short edmaRecvSrcCIdx = 0;	// Don't want to change the src count offset
unsigned short edmaRecvDesCIdx = 0;	// Don't want to change the destination count offset
unsigned short edmaBCntReload = 0;	// Don't want to reload B count
   unsigned int writeAddr;


   // Set up DMA Recv channel //////////////////////////////////////////////////////////

   //getWriteBufferAddr(&writeAddr);

   // Associate DMA Channel to Event Queue
   HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_DMAQNUM((edmaRecvChNum) >> 3u)) &=
                        EDMA3CC_DMAQNUM_CLR(edmaRecvChNum);

   HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_DMAQNUM((edmaRecvChNum) >> 3u)) |=
                 EDMA3CC_DMAQNUM_SET((edmaRecvChNum), edmaTxEvtQNum);

   // Enable the Event Interrupt
   HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_S_IESR(shadowRegionId)) |= (0x01u <<  edmaRecvChNum);

   HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_OPT(edmaRecvChNum)) &= EDMA3CC_OPT_TCC_CLR;
   HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_OPT(edmaRecvChNum)) |= EDMA3CC_OPT_TCC_SET(edmaRecvChNum);

   /* Fill the PaRAM Set with transfer specific information */
   recvParamSet.srcAddr    = (unsigned int)&HWREG(SOC_SPI_1_REGS + SPI_SPIBUF);
   recvParamSet.destAddr   = (unsigned int)&PingBuf;

   recvParamSet.aCnt = edmaRecvACnt;
   recvParamSet.bCnt = edmaBCnt;
   recvParamSet.cCnt = edmaCCnt;

   // Setting up the SRC/DES Index
   recvParamSet.srcBIdx = edmaRecvSrcBIdx;
   recvParamSet.destBIdx = edmaRecvDesBIdx;
       /* A Sync Transfer Mode */
   recvParamSet.srcCIdx = edmaRecvSrcCIdx;
   recvParamSet.destCIdx = edmaRecvDesCIdx;


   // 0x4000 is starting add.  8 32 bit register values per channel.  Using ch32.  So 8*4*32+0x4000 = 0x4400
   recvParamSet.linkAddr = (unsigned short)0x4800;
   recvParamSet.bCntReload = edmaBCntReload;

   // Initialize the options register
   recvParamSet.opt = 0u;
   /* Enable Final transfer completion interrupt */
    recvParamSet.opt |= (1 << EDMA3CC_OPT_TCINTEN_SHIFT);
   // Program the TCC
   recvParamSet.opt |= ((edmaRecvChNum << EDMA3CC_OPT_TCC_SHIFT) & EDMA3CC_OPT_TCC);

//    /* Enable Intermediate & Final transfer completion interrupt */
//    paramSet.opt |= (1 << EDMA3CC_OPT_ITCINTEN_SHIFT);
//	recvParamSet.opt |= (1 << EDMA3CC_OPT_TCINTEN_SHIFT);

// Set for A-B synchronized transfer
//    txParamSet.opt |= (1 << EDMA3CC_OPT_SYNCDIM_SHIFT);
   // End Set up DMA Recv channel //////////////////////////////////////////////////////
   /* configure PaRAM Set */

   	    EDMA3SetPaRAM(SOC_EDMA30CC_0_REGS, edmaRecvChNum , &PongParamSet);

   	    /* Enable the transfer */
   	    EDMA3EnableTransfer(SOC_EDMA30CC_0_REGS, edmaRecvChNum , EDMA3_TRIG_MODE_EVENT);


}

 

тогда как функции для 65-го и 64-го PaRAM set не содержат

 

   // Associate DMA Channel to Event Queue
   HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_DMAQNUM((edmaRecvChNum) >> 3u)) &=
                        EDMA3CC_DMAQNUM_CLR(edmaRecvChNum);

   HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_DMAQNUM((edmaRecvChNum) >> 3u)) |=
                 EDMA3CC_DMAQNUM_SET((edmaRecvChNum), edmaTxEvtQNum);

   // Enable the Event Interrupt
   HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_S_IESR(shadowRegionId)) |= (0x01u <<  edmaRecvChNum);

   HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_OPT(edmaRecvChNum)) &= EDMA3CC_OPT_TCC_CLR;
   HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_OPT(edmaRecvChNum)) |= EDMA3CC_OPT_TCC_SET(edmaRecvChNum);

 

так как это делается один раз для 18 канала (SPII_RX).

 

Верно?

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


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

Подход верный.

запуск связки примерно такой:

 

1) запретить EVENT18 в EER (на всякий случай)

2) записать настройки в 64 paramset

3) записать настройки в 65 paramset

4) записать настройки в 18 paramset

5) настроить прерывания от EVENT18 если используются ( выставить бит в IER (через IESR) - куда указывает TCC от 18 paramset )

6) разрешить EVENT18 в EER (через EESR)

7) теперь можно { запускать spi } или { для отладки писать в ESR 1 для EVENT18 - притворяясь spi } => { пересылки должны идти + прерывания должны возникать }

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


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

Подход верный.

запуск связки примерно такой:

 

1) запретить EVENT18 в EER (на всякий случай)

2) записать настройки в 64 paramset

3) записать настройки в 65 paramset

4) записать настройки в 18 paramset

5) настроить прерывания от EVENT18 если используются ( выставить бит в IER (через IESR) - куда указывает TCC от 18 paramset )

6) разрешить EVENT18 в EER (через EESR)

7) теперь можно { запускать spi } или { для отладки писать в ESR 1 для EVENT18 - притворяясь spi } => { пересылки должны идти + прерывания должны возникать }

Большое спасибо!

 

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


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

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

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

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

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

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

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

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

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

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