TigerSHARC 0 6 августа, 2014 Опубликовано 6 августа, 2014 · Жалоба Прошу помощи у знатоков, плотно работавших с 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 в этом случае? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BratherLU 0 7 августа, 2014 Опубликовано 7 августа, 2014 · Жалоба Если правильно понял вопрос... spi переинициализироать не надо - он и не знает кто его будет писать/читатать. О прарамсетах: Настройки 18-го и 65-го должны быть идентичны Настройки 64-го отличаются от 18 только линком на 65 и src/dst адресом - в соответствии с Вашей задачей В общем случае правильность работы Вашего пинг понга можно проверить не запуская spi Инициализируете парамсеты как надо и потом руками (программно) пишите 1 в соответсвующий бит в EVENT SET register в EDMA контроллере - все должно пересылаться и с отключенным spi Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 7 августа, 2014 Опубликовано 7 августа, 2014 · Жалоба Если правильно понял вопрос... 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 меняются только параметры пересылаемых данных? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BratherLU 0 7 августа, 2014 Опубликовано 7 августа, 2014 · Жалоба При завершении задания для парамсета 18 - контроллер EDMA копирует содиржимое линка (64/65) в парамсет 18 и все продолжает работать без участия процессора. Таким образом связка ping-pong настраивается 1 раз и работает без участия CPU. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 7 августа, 2014 Опубликовано 7 августа, 2014 · Жалоба Спасибо! Для наглядности, у меня настройка каждого канала происходит в отдельных функциях, функция для настройки 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). Верно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BratherLU 0 7 августа, 2014 Опубликовано 7 августа, 2014 · Жалоба Подход верный. запуск связки примерно такой: 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 } => { пересылки должны идти + прерывания должны возникать } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 7 августа, 2014 Опубликовано 7 августа, 2014 · Жалоба Подход верный. запуск связки примерно такой: 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 } => { пересылки должны идти + прерывания должны возникать } Большое спасибо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться