Телефонуйте » (+38) 096 227 41 41

Метою лабораторної роботи є вивчення контролера покращеного прямого доступу до пам'яті (EDMA3 - Enhanced Direct Memory Access Controller ) та програмування EDMA для передачі даних з одного буфера до іншого.


Приклад роботи програми.

Особливості використання EDMA

Контролер EDMA - один з важливих внутрішніх периферійних пристроїв, який дозволяє копіювати дані з одного місця до іншого без застосування процесора (розвантажує центральний процесор від передачі даних). Контролер EDMA може переміщувати дані до і з будь-яких комірок пам'яті, включаючи внутрішню пам'ять (L2 кеш, SRAM), периферійні пристрої та зовнішню пам'ять.

Попередні серії C6x DSP C6201 і C6701 мали більш просту периферію, яка називалася контролером DMA. Архітектура контролера EDMA повністю відрізняється від контролера DMA. Покращення в EDMA включають в себе 64 канали з програмованим пріоритетом, а також можливість пов'язувати і з’єднувати передавачі даних.


Перенесення блоків пам’яті.

Перенесення може виконуватися процесором, що не є ефективним через використання ресурсів процесора не за призначенням (процесор має виконувати фільтрацію, ШПФ та інші алгоритми обробки даних).

Деякі особливості EDMA:

• Контролер EDMA включає в себе регістри подій і обробки переривання, кодер подій, параметр RAM, а також апаратні засоби генерації адреси.
• EDMA має 64 незалежних канали, яким можуть бути призначені пріоритети.
• Передача даних може бути ініційована процесором CPU або подіями.
• Коли відбувається подія, параметри передачі зчитуються з пам'яті параметрів (PaRAM). Ці параметри передаються до апаратних засобів генерації адрес.
• У EDMA можна передавати елементи: 8-бітові дані, 16-бітові півслова або 32-бітові слова.
• Можна запрограмувати передачу складних блоків. EDMA може передавати одномірні і двомірні блоки даних, що складаються з безліч кадрів.
• Після  передачі елементу, адреса джерела і/або адреса призначення може залишитися такою ж, може бути збільшена або зменшена на один елемент, або збільшена чи зменшена на величину, яка знаходиться в регістрі ELEIDX для каналу. Масиви зміщуються регістром FRMIDX для каналу.
• Після завершення передачі, EDMA може продовжувати передачу даних за допомогою зв'язування з іншою запрограмованою передачею в параметрах RAM для каналу або шляхом зчеплення з передачею для іншого каналу.
•  EDMA може генерувати переривання завершення передачі для центрального процесора
• EDMA має режим швидкого DMA (QDMA), який може бути використаний для швидких, разових передач. QDMA використовує тригер-слово для передачі (тобто при записі в регістр тригера, він запускає передачу), і використовується для переміщення даних пам'ять-пам'ять. Він не може бути налаштований на роботу з периферійними подіями.

DMA призначається для реагування на такі події периферійних пристроїв, як сигнал - «дані готові». Наприклад, звичайна система, яка використовує послідовний порт підключений до АЦП, збирає вибірки кожен період. Коли ці «дані» готові  для копіювання в пам'ять, синхронізована подія відправляється в DMA, і DMA копіює дані від регістра периферії в буфер пам'яті незалежно від процесора. Після того, як буфер заповниться, DMA може перервати процесор, щоб сказати «у вас є буфер для обробки» ... і так далі.

Передачею DMA можна керувати 3 різними способами: (1) ручний запуск; (2) за допомогою синхронізації подій від периферійного пристрою; (3) за допомогою ланцюгової події, тобто завершення роботи каналу X може почати роботу каналу Y.

Для передачі потрібні: адреса джерела, адреса одержувача і розмір (скільки даних копіювати). Значення розміру є тривимірним - ACNT, BCNT і CCNT. ACNT визначає кількість байтів на «елемент». Наприклад, для 16-бітових аудіоданих ACNT буде 2 байта. Це «мінімальний» розмір пакета, що передається.

BCNT вказує число «елементів» в «кадрі» або «лінії».

CCNT визначає розмір «блоку» або кількість кадрів в блоці.

Кожне зі значень регістрів – це 16-bit unsigned (діапазон 0-65535) - може приймати максимальне значення приблизно 64К. Таким чином, максимальний розмір переданого 64К * 64К * 64К - досить великий.

Приклад.

Вам потрібно перенести 12 байт з місця на місце. Які  значення будуть у ACNT, BCNT і CCNT?   Ви можете зробити це 3ма способами:

Найкращий спосіб залежить від ваших системних потреб і типу синхронізації.

Є два типи синхронізації передачі:

A-синхронізація (“A” Synchronization) передачі: одновимірні дані обслуговуються на подію.
АВ-синхронізація (“AB” Synchronization) передачі: двовимірні дані обслуговуються на подію.

“A” Synchronization 

Подія (така як повне заповнення регістру прийому McBSP) ініціює передачу рівно 1 масиву ACNT байт (2 байта). Наприклад, McBSP з’єднується з кодеком. І ви хочете синхронізувати кожне перенесення 16-розрядного слова з буфера прийому в пам’ять, коли він повний, або в буфер передачі, коли він пустий). EVTx - подія х.

“AB” Synchronization

Подія ініціює двовимірну передачу BCNT масивів ACNT байт (A * B). Наприклад, рядок відео пікселів (кожен рядок має BCNT пікселів, що складаються з 3-х байт, кожен - Y, Cb, Cr).

Для більш складних передач EDMA використовує індексацію BIDX і CIDX. Кожен індекс може бути встановлений окремо для джерела SRC і призначення DST. BIDX - індекс в байтах між ACNT масивами (однакове для A-синхронізації і AB-синхронізації). Наприклад, якщо хочете зміщувати адресу джерела на 4 байти після передачі кожного елемента, то можете встановити  значення BIDX рівне 4. Після того, як EDMA закінчить передачу першого елемента, адреса джерела буде зміщена на 4 байти (плюс або мінус) для наступної передачі. Адреса призначення має такі ж можливості індексування.

Значення регістру CIDX може бути використане для зміщення адреси джерела або призначення після того, як перенесений "кадр" або "лінія". CIDX-індекс в байтах між BCNT кадрами (відрізняється для А-синхронізації і AB-синхронізації). CIDX відстань обчислюється від початкової адреси раніше переданого блоку (масиву для A-синхронізації, кадру для AB-синхронізації) до наступного кадру, що підлягає передачі.

BIDX/CIDX - 16-розрядні значення (діапазон від -32768 до +32767). Поєднання цих індексів може автоматично виконувати «сортування каналів» вхідних та вихідних даних без затрати на це додаткового часу.


Приклад «сортування»

EDMA3 також дозволяє «зв'язувати» і «зціплювати». Зв'язування являє собою процес «перезавантаження» канальних регістрів конфігурації периферії (або буферного дескриптору) іншим набором після того, як відбулася перша передача. Наприклад, коли канал X завершений, ви можете передати те ж саме знову. Додаткові набори параметрів «Reload» доступні для  виконання іншої конфігурації, яка може бути «перезавантажена» автоматично в регістри каналу х після завершення передачі. Це не починає передачу - це тільки налаштовує канал для наступної передачі. «Зціплення» - це можливість завершення одного каналу, щоб викликати іншу передачу. Наприклад, якщо канал Х приєднаний до каналу Y, коли канал Х завершує роботу, він запускає канал Y для передачі.

Структура EDMA

Контролер EDMA3 складається з двох основних блоків:

Контролер каналу EDMA3 (EDMA3CC) – це інтерфейс користувача для контролера EDMA3. EDMA3CC включає в себе параметр RAM (PaRam), керуючі регістри каналу і регістри управління перериванням. Він визначає пріоритети вхідних запитів або подій від периферійних пристроїв і подає запити на передачу (TR) в контролер передачі.

Контролер(и) передачі EDMA3 (EDMA3TC) відповідальний за переміщення даних. EDMA3TC видає команди читання/запису даних до адрес джерела і призначення, запрограмованих для даної передачі.

Parameter RAM (PaRAM)

Контролер EDMA3 створено на основі RAM (ОЗП) архітектури. З цієї причини, контекст передачі (адреси джерела/призначення, розміри, індекси тощо) для каналів DMA/QDMA зберігаються в параметр RAM. EDMA3 має 256 наборів параметрів RAM, які містять інформацію про налаштування передачі даних.
64 канали DMA і 8 каналів QDMA можуть бути збережені в будь-якому з 256 наборів, а потім запущені на виконання (3 різними способами).

Кожен з наборів містить 12 регістрів.

·    Options (наприклад, переривання, зціплення, режим синхронізації).
·    SRC/DST адреси.
·    ACNT/BCNT/CCNT (розмір передачі).
·    4 індекси  SRC/DST.
·    BCNTRLD (BCNT reload for 3D xfrs).
·    LINK (вказівник на інший набір параметрів ОЗУ).

Процес передачі блоку:

1. Запуск передачі.
2. EDMA3 виконує передачу.
3. Дії після передачі.

- повідомити центральний процесор (переривання)
- почати іншу передачу (зціплення)

Кожен з 64 каналів може запускатися  наступними способами:

1)    Запуск подіями від периферійних пристроїв – регістри EER/ER. Наприклад, події:

• McBSP 0/1 (REVT0/1, XEVT0/1)
• Timer 0/1 (TEVTLO/HI 0/1)
• GPIO (GPINT[15:5])
• Chip Int Cntlr 3 (CIC3[15:0])
• VCP2 (VCP2REVT/XEVT)
• TCP2 (TCP2REVT/XEVT)
• FSEVT[13:4]
• I2C (ICREVT/XEVT)

Кожна подія з’єднана з відповідним каналом DMA (наприклад, XEVT1 → Ch 14) і може вмикатися/вимикатися через регістр EER. Детальніше про з’єднання подій і каналів в додатку.

2)    Ручний запуск – регістр ESR. CPU записує «1» в відповідний біт регістра набору подій (ESR).

3)    Ланцюговий запуск – регістр CER.

Використовується для виконання послідовності запитів передачі TR після однієї події. Наприклад: EVT0 запускає Ch0, Ch0 завершується і запускає Ch1 (ТСС = 1). Ланцюгові події фіксуються в регістрі ланцюга подій (CER).

Приклад заповнення параметрів РАМ:

Код завершення передачі (TCC)

ТСС генерується, коли передача завершується.

ТСС може бути використано, щоб викликати переривання центрального процесора і/або іншу передачу (ланцюжки).
Кожен запит TR нижче представляє один запит «Transfer Request», який є для ACNT байтів (А-SYNC) або ACNT * BCNT байтів (АВ-синхронізація).
Завершення Передачі сигналізує про повне завершення передачі послідовності.
Chain Event Register (CER [TCC]) встановлює 1, якщо був обраний режим TCCHEN (зціплення).
Interrupt Pending Register (IPR [ТСС]) встановлюється в 1, якщо був обраний режим TCINTEN (це може перервати процесор).

Виконання лабораторної роботи

Для запуску EDMA3 потрібно виконати наступні кроки:

1. Проініціалізувати Модуль EDMA3.

2. Налаштувати канали:

·    Номер каналу #, Хендл.
·    Опції регістру.
·    Інші параметри каналу (ACNT, BCNT тощо).
·    Запис відповідне значення в PARAM.

3. Запустити канал (в режимі ручному, синхронізації, ...)

Для створення програми скористаємося готовою бібліотекою CSL[].

1.  Зробіть копію проекту з минулої роботи та запустіть.
Код у файлі замініть на наступний.

#include <cerrno>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "ti\platform\platform.h"
#include "ti\platform\resource_mgr.h"

// бібліотека  для ЕDMA
#include <ti/csl/csl_edma3.h>
#include <ti/csl/csl_edma3Aux.h>

/************************** Global Variables *************************/

/* Global Buffers (Source and Destination)  */
#define SIZE 128
Uint16 srcBuff[SIZE];
Uint16 dstBuff[SIZE];


/* OSAL functions for Platform Library */
platform_info p_info;
uint8_t *Osal_platformMalloc (uint32_t num_bytes, uint32_t alignment);
void Osal_platformFree (uint8_t *dataPtr, uint32_t num_bytes);
void Osal_platformSpiCsEnter(void);
void Osal_platformSpiCsExit (void);

void main(void) {
    uint32_t i;

    // ------ init for   platform  LED and UART ------------
    /*
    // не підтримується симулятором, тільки платою
    platform_init_flags init_flags;
    platform_init_config init_config;

    // Initialize platform with default values
    memset(&init_flags, 0x01, sizeof(platform_init_flags));
    memset(&init_config, 0, sizeof(platform_init_config));

    if (platform_init(&init_flags, &init_config) != Platform_EOK) {
        return;
    }
//    platform_uart_init();
//    platform_uart_set_baudrate(115200);
    platform_get_info(&p_info);
    */
    //-------------------------------------------------------------
    // --------------------------------- init edma
    CSL_Edma3Context     context;
    CSL_Status             status;
    CSL_Edma3Handle     hEdmaModule;
    CSL_Edma3Obj         edmaObj;
   // EDMA Instance 0, 1 and 2;
   /* EDMA Instance 1 and 2: Supports 64 DMA Channels. else - 16 */
    Uint8  instNum = 0;
    // for channel
    CSL_Edma3ChannelObj       chObj;
    CSL_Edma3ChannelAttr       chAttr;
    CSL_Edma3ChannelHandle  hChannel;

    Uint8  channelNum = 4; // 0 - 63 or 0 -15
    // для param set
    CSL_Edma3ParamHandle        hParam;
    CSL_Edma3ParamSetup         myParamSetup;
    Uint16 PsetNum = 2;
    // ініціалізація модуля  edma
    status = CSL_edma3Init(&context);

    // відкрити модуль і отримати хендл для подальшої роботи
    hEdmaModule = CSL_edma3Open(&edmaObj, instNum, NULL, &status);

    // тут можна включити/налаштувати переривання

    // параметри каналу
    chAttr.regionNum = CSL_EDMA3_REGION_GLOBAL;

    // Channel w/no event tied to it
    chAttr.chaNum = channelNum;

    hChannel = CSL_edma3ChannelOpen(&chObj, instNum, &chAttr, &status);

    // налаштовуємо блок Options / param set

    myParamSetup.option = CSL_EDMA3_OPT_MAKE( CSL_EDMA3_ITCCH_DIS,
                                              CSL_EDMA3_TCCH_DIS,
                                              CSL_EDMA3_ITCINT_DIS,
                                              CSL_EDMA3_TCINT_DIS,      /* or CSL_EDMA3_TCINT_EN*/
                                              0, CSL_EDMA3_TCC_NORMAL,
                                              CSL_EDMA3_FIFOWIDTH_NONE,
                                              CSL_EDMA3_STATIC_DIS,
                                              CSL_EDMA3_SYNC_AB,          /*CSL_EDMA3_SYNC_A*/
                                              CSL_EDMA3_ADDRMODE_INCR,
                                              CSL_EDMA3_ADDRMODE_INCR
                                             );

    myParamSetup.srcAddr    = (Uint32)srcBuff;            // Source Addr
    myParamSetup.aCntbCnt   = CSL_EDMA3_CNT_MAKE(sizeof(srcBuff[0])*SIZE,1);    // aCntbCnt - (ACNT, BCNT)
    myParamSetup.dstAddr    = (Uint32)dstBuff;               // Dest Addr
    myParamSetup.srcDstBidx = CSL_EDMA3_BIDX_MAKE(1,1);     // srcDstBidx -  (SRCBIDX, DSTBIDX)
    myParamSetup.linkBcntrld= CSL_EDMA3_LINKBCNTRLD_MAKE(0xFFFF,0);  // linkBcntrld - (LINK, BCNTRLD) //    hParamPong
    myParamSetup.srcDstCidx = CSL_EDMA3_CIDX_MAKE(0,1);     // srcDstCidx -  (SRCCIDX, DSTCIDX)
    myParamSetup.cCnt = 1;                                    // cCnt - CCNT

    // запис номера набору PaRAM  – отримуємо handle до PSET (e.g. #2)

    hParam = CSL_edma3GetParamHandle(hChannel, PsetNum, &status);
    // set  Options
    status = CSL_edma3ParamSetup(hParam, &myParamSetup);

    // з*єднуємо канал  (#4) з PSET (#2)
    CSL_edma3HwChannelSetupParam(hChannel, PsetNum);

    // map the channel (#4) to a queue
    CSL_edma3HwChannelSetupQue(hChannel, CSL_EDMA3_QUE_1);

    /* Enable channel */
    CSL_edma3HwChannelControl(hChannel,CSL_EDMA3_CMD_CHANNEL_ENABLE, NULL);

    /* Initialize data */
    for (i = 0; i < SIZE; i++) {
        srcBuff[i] = i;
    }

    /* Manually trigger the channel */
    CSL_edma3HwChannelControl(hChannel, CSL_EDMA3_CMD_CHANNEL_SET, NULL);
    //This is used to enable the channel or to start it manually

    /* Play forever */
    while(1) {

        i=0;
        ++i;
    }
}

/* OSAL functions for Platform Library */
uint8_t *Osal_platformMalloc (uint32_t num_bytes, uint32_t alignment)
{
    return malloc(num_bytes);
}

void Osal_platformFree (uint8_t *dataPtr, uint32_t num_bytes)
{
    /* Free up the memory */
    if (dataPtr)
    {
        free(dataPtr);
    }
}

void Osal_platformSpiCsEnter(void)
{
    /* Get the hardware semaphore.
     *
     * Acquire Multi core CPPI synchronization lock
     */
    while ((CSL_semAcquireDirect (PLATFORM_SPI_HW_SEM)) == 0);

    return;
}

void Osal_platformSpiCsExit (void)
{
    /* Release the hardware semaphore
     *
     * Release multi-core lock.
     */
    CSL_semReleaseSemaphore (PLATFORM_SPI_HW_SEM);

    return;
}


2.    Побудуйте програму, загрузіть її в процесор. Виконати на одному ядрі.

3.    Перевірте за допомогою Debug або графічним представленням правильність пересилки даних.

Завдання

1.    Згенерувати масив відліків синусоїди для передачі, відобразити на графіках сигнал та спектр прийнятого сигналу.
2.    Налаштуйте EDMA так, щоб дані пересилалися іншим способом, використовуючи інші значення індексів ACNT/BCNT/CCNT.
3.    Налаштуйте EDMA так, щоб дані з джерела пересилалися через один елемент (тобто 0, 2, 4, 6 ... ), а приймалися послідовно (0, 1, 2, 3, ...), використовуючи індекси (SRCBIDX, DSTBIDX) та (SRCCIDX, DSTCIDX).
4.    Налаштувати переривання по закінченню передачі даних. В функції обробки переривання засвітити світлодіод.

Домашнє завдання

Налаштувати EDMA так, щоб дані пересилалися за таймером. Таймер на N секунд, де N – номер варіанта.
Розрахувати коефіцієнти ФНЧ для подальшої реалізації КІХ-фільтра. Порядок фільтра – 100, частота зрізу 8 кГц.
Написати свою функцію згортки.

Література

TMS320C6000 DSPEnhancedDirectMemoryAccess(EDMA) ControllerReferenGuide(SPRU234)

http://processors.wiki.ti.com/index.php/EDMA3
http://processors.wiki.ti.com/index.php/EDMA_FAQ_for_KeystoneI/II_devices
http://processors.wiki.ti.com/index.php/Programming_the_EDMA3_using_the_Low-Level_Driver_(LLD)

Додаток

На C6678 є три контролера каналів зв’язку EDMA: EDMA3CC0, EDMA3CC1 і EDMA3CC2.

·    EDMA3CC0 має 2 контролера передачі: EDMA3TC1 і EDMA3TC2.
·    EDMA3CC1 має 4 контролера передачі: EDMA3TC0, EDMA3TC1, EDMA3TC2 і EDMA3TC3.
·    EDMA3CC2 має 4 контролера передачі: EDMA3TC0, EDMA3TC1, EDMA3TC2 і EDMA3TC3.

Кожен з контролерів передачі має пряме підключення до системи комутації з багатьма входами (рис.). В додатку приведено список периферійних пристроїв, які можуть бути доступні через контролери передачі.

EDMA3CC0 оптимізований для передачі до/від/між підсистемами MSMC і DDR-3. Решта використовуються для інших задач.

Новини

  • SDR в IoT

    iotSDR пропонує платформу розробок для IoT-радіо та мережевих доменів. На платі два передавачі Microchip AT86RF215, для вводу-виводу модему на Xilinx ZYNQ SoC, приймач GNSS MAX2769 для GPS, Galileo, BieDou та Glonass. Плата сумісна з ПЗ GNURadio SDR. Дозволяє розробити протоколи фізичного рівня LoRa, SigFox, WightLess, Bluetooth, BLE, 802.15.4, ZigBee тощо для IoT, або шлюз IoT через TheThingsNetwork, LPWAN або Google Thread. Пам'ять EEPROM: 1x AT24MAC602 , flash-пам'ять: 1x QSPI 128 Мб, RAM: 256 MБ DDR3,слот для Micro SD карти, входи/виходи: 2x 8-бітних інтерфейси PL, інтерфейс 8-бітного PS, Gigabit Ethernet, USB 2.0 (USB3310), USB 2.0 (CP2104), 2x SMA RF-роз'єми для приймача діапазонів IoT, 2x SMA RF-роз'єми для приймача 2,4 ГГц , RF-роз'єм приймач GNSS, FPGA-роз'єм JTAG для програмування. Розміри плати: 76,2 мм x 101,6 мм.

     

    in Новини

Записатися на курс