Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: omap-l138 uPP
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Сигнальные процессоры и их программирование - DSP
Атмег
Всем доброго дня! К omap по uPP подключаю трансивер ad9361, один канал на передачу, второй на прием, rx_clk и tx_clk по 31 МГц, на UPP_2xTXCLK заведен клок 62 МГц.
Для начала хочу запустить такой код:

Код
    // Reset the module
    reg = uppRegs->UPPCR;
    CSL_FINST(reg, UPP_UPPCR_SWRST, RESET);
    i = 2000; while (--i);
    CSL_FINST(reg, UPP_UPPCR_SWRST, RUNNING);
    uppRegs->UPPCR = reg;

    // Full duplex, A - TX, B - RX
    reg = uppRegs->UPCTL;
    CSL_FINST(reg, UPP_UPCTL_MODE, DUPLEX1);
    CSL_FINST(reg, UPP_UPCTL_CHN, TWO);

    // DDR, 12 bit data width
    CSL_FINST(reg, UPP_UPCTL_DRA, DOUBLE);
    CSL_FINST(reg, UPP_UPCTL_IWA, 16BIT);
    CSL_FINST(reg, UPP_UPCTL_DPWA, 12BIT);
    CSL_FINST(reg, UPP_UPCTL_DRB, DOUBLE);
    CSL_FINST(reg, UPP_UPCTL_IWB, 16BIT);
    CSL_FINST(reg, UPP_UPCTL_DPWB, 12BIT);
    uppRegs->UPCTL = reg;

    // Start/enable pins settings
    reg = uppRegs->UPICR;
    CSL_FINST(reg, UPP_UPICR_STARTA, DISABLE);
    CSL_FINST(reg, UPP_UPICR_ENAA, ENABLE);
    CSL_FINST(reg, UPP_UPICR_STARTB, DISABLE);
    CSL_FINST(reg, UPP_UPICR_ENAB, ENABLE);
    uppRegs->UPICR = reg;

    // Idle value
    reg = uppRegs->UPIVR;
    CSL_FINS(reg, UPP_UPIVR_VALA, 0xFFFF);    // TODO
    CSL_FINS(reg, UPP_UPIVR_VALB, 0xFFFFu);
    uppRegs->UPIVR = reg;

    // Enable uPP
    reg = uppRegs->UPPCR;
    CSL_FINST(reg, UPP_UPPCR_EN, ENABLE);
    CSL_FINST(reg, UPP_UPPCR_RTEMU, ENABLE);
    CSL_FINST(reg, UPP_UPPCR_SOFT, ENABLE);
    uppRegs->UPPCR = reg;

    for (i = 0; i < 64; i++)
        recv_buffer[i] = -1;

    while (1) {
        //
        System_printf(" --- Generating sine wave ---\n");
        for (i = 1; i < 1464843; i++) {

            uppRegs->UPID0 = (Uint32)&xmit_buffer;
            uppRegs->UPID1 = (1 << 16)|128;        // 1 lines 128 bytes per line
            uppRegs->UPID2 = 128;                                        // no offset between lines

            while (CSL_FEXT(uppRegs->UPIS2, UPP_UPIS2_PEND));
        }

        System_printf(" --- Collecting 64 samples from ADC --- \n");

        uppRegs->UPQD0 = (Uint32)&recv_buffer;
        uppRegs->UPQD1 = (1 << 16)|128;        // 1 lines 128 bytes per line
        uppRegs->UPQD2 = 128;                                        // no offset between lines

        while (CSL_FEXT(uppRegs->UPQS2, UPP_UPQS2_PEND));

        for (i = 0; i < 64; i += 2)
            System_printf("%d %d\n", recv_buffer[i], recv_buffer[i+1]);

    }


1) Несколько транзакций проходит нормально, вижу на выходе модуляцию, потом все стопорится на while (CSL_FEXT(uppRegs->UPIS2, UPP_UPIS2_PEND));
Поднимается флажок UORI в UPISR. Не оч понял из ДШ, при каких условиях это может происходить, понял только, что на это влияет клок, но он в моем случае с большим запасом по сравнению с максимальными 75.

2) По адресу recv_buffer память не меняется.

Физически заведены кроме клока и данных только линии enable. Остальные не используются и я их отключаю в UPICR.
ozone
Заранее прошу прощение у автора, но чтоб не плодить новую тему спрошу здесь.

Есть OMAP-L137 и OMAP-L138. У 137-го отсутствует UPP (универсальный параллельный порт), но он привлекает более "снисходительным" корпусом BGA. Без UPP можно как то нормально подключить к данному камню параллельное ADC, где то так на 10-20MSPS? Или же всё таки лучше на 138-м остановиться с UPP.
aaarrr
Цитата(Атмег @ Jul 28 2016, 18:07) *
1) Несколько транзакций проходит нормально, вижу на выходе модуляцию, потом все стопорится на while (CSL_FEXT(uppRegs->UPIS2, UPP_UPIS2_PEND));
Поднимается флажок UORI в UPISR. Не оч понял из ДШ, при каких условиях это может происходить, понял только, что на это влияет клок, но он в моем случае с большим запасом по сравнению с максимальными 75.

Вообще, загнать uPP в underrun/overflow не так уж и просто. Как настроен приоритет в SYSCONF.MSTPRI0?
Попробуйте переключить TXSIZE на 128 байт в регистре UPTCR.

Цитата(Атмег @ Jul 28 2016, 18:07) *
2) По адресу recv_buffer память не меняется.

И не должно: uPP к этому моменту уже отвалился с ошибкой.

Цитата(ozone @ Jul 31 2016, 09:18) *
Есть OMAP-L137 и OMAP-L138. У 137-го отсутствует UPP (универсальный параллельный порт), но он привлекает более "снисходительным" корпусом BGA. Без UPP можно как то нормально подключить к данному камню параллельное ADC, где то так на 10-20MSPS? Или же всё таки лучше на 138-м остановиться с UPP.

Лучше L138.
jcxz
Цитата(ozone @ Jul 31 2016, 12:18) *
Без UPP можно как то нормально подключить к данному камню параллельное ADC, где то так на 10-20MSPS? Или же всё таки лучше на 138-м остановиться с UPP.

Без проблем. У L-137 есть два PRU-ядра как раз и предназначенные для эмуляции недостающей периферии. Логичней всего задействовать одно из них. Я думаю - написать такой простой код для PRU не составит труда.
Атмег
Цитата(aaarrr @ Jul 31 2016, 11:02) *
Как настроен приоритет в SYSCONF.MSTPRI0?

Там должно быть дефолтное знчение 4, я его не менял. На АРМе при этом у меня крутится linux, висит консоль по ssh. Но никаких тяжелых задач под linux не запущено.

Цитата(aaarrr @ Jul 31 2016, 11:02) *
Попробуйте переключить TXSIZE на 128 байт в регистре UPTCR.

Попробую, пока что не могу проверить - временно нет доступа к плате.

Цитата(aaarrr @ Jul 31 2016, 11:02) *
И не должно: uPP к этому моменту уже отвалился с ошибкой.

Я имел в виду до того момента, как отвалится. Несколько (~3) итераций у меня успевает пройти, я даже вижу модуляцию на выходе трансивера. Если убираю кусок кода на передачу, прием крутится бесконечно, не отваливается. Но в память ничего не пишется.

Вопрос по аппаратной части: можно ли работать только с Enable, без Start и Wait, тут все нормально?
aaarrr
Цитата(Атмег @ Aug 1 2016, 11:38) *
Вопрос по аппаратной части: можно ли работать только с Enable, без Start и Wait, тут все нормально?

Да, можно без Start и Wait.
thermit
Код
// Reset the module
    reg = uppRegs->UPPCR;
    CSL_FINST(reg, UPP_UPPCR_SWRST, RESET);
    i = 2000; while (--i);
    CSL_FINST(reg, UPP_UPPCR_SWRST, RUNNING);
    uppRegs->UPPCR = reg;


Модуль здесь не ресетится, кстате...
Атмег
Код
    reg = uppRegs->UPPCR;
    CSL_FINST(reg, UPP_UPPCR_SWRST, RESET);
    i = 2000; while (--i);
    reg = uppRegs->UPPCR;
    CSL_FINST(reg, UPP_UPPCR_SWRST, RUNNING);
    uppRegs->UPPCR = reg;

так норм или еще что-то? платы нет все еще, не проверить
thermit
Цитата(Атмег @ Aug 29 2016, 11:38) *
Код
    reg = uppRegs->UPPCR;
    CSL_FINST(reg, UPP_UPPCR_SWRST, RESET);
    i = 2000; while (--i);
    reg = uppRegs->UPPCR;
    CSL_FINST(reg, UPP_UPPCR_SWRST, RUNNING);
    uppRegs->UPPCR = reg;

так норм или еще что-то? платы нет все еще, не проверить


Код
    reg = uppRegs->UPPCR;
    CSL_FINST(reg, UPP_UPPCR_SWRST, RESET);
        uppRegs->UPPCR = reg;
    i = 2000; while (--i);
    reg = uppRegs->UPPCR;
    CSL_FINST(reg, UPP_UPPCR_SWRST, RUNNING);
    uppRegs->UPPCR = reg;
Атмег
ой точно, спасибо)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.