реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> omap-l138 uPP, underrun?
Атмег
сообщение Jul 28 2016, 15:07
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 17-05-07
Пользователь №: 27 787



Всем доброго дня! К 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.
Go to the top of the page
 
+Quote Post
ozone
сообщение Jul 31 2016, 06:18
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 47
Регистрация: 11-08-15
Пользователь №: 87 951



Заранее прошу прощение у автора, но чтоб не плодить новую тему спрошу здесь.

Есть OMAP-L137 и OMAP-L138. У 137-го отсутствует UPP (универсальный параллельный порт), но он привлекает более "снисходительным" корпусом BGA. Без UPP можно как то нормально подключить к данному камню параллельное ADC, где то так на 10-20MSPS? Или же всё таки лучше на 138-м остановиться с UPP.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jul 31 2016, 08:02
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 275
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Атмег @ 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.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Jul 31 2016, 09:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 789
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

Без проблем. У L-137 есть два PRU-ядра как раз и предназначенные для эмуляции недостающей периферии. Логичней всего задействовать одно из них. Я думаю - написать такой простой код для PRU не составит труда.
Go to the top of the page
 
+Quote Post
Атмег
сообщение Aug 1 2016, 08:38
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 17-05-07
Пользователь №: 27 787



Цитата(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, тут все нормально?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 1 2016, 09:13
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 10 275
Регистрация: 11-12-04
Пользователь №: 1 448



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

Да, можно без Start и Wait.
Go to the top of the page
 
+Quote Post
thermit
сообщение Aug 22 2016, 18:56
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 735
Регистрация: 3-08-09
Пользователь №: 51 730



Код
// 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;


Модуль здесь не ресетится, кстате...
Go to the top of the page
 
+Quote Post
Атмег
сообщение Aug 29 2016, 08:38
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 17-05-07
Пользователь №: 27 787



Код
    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;

так норм или еще что-то? платы нет все еще, не проверить
Go to the top of the page
 
+Quote Post
thermit
сообщение Aug 29 2016, 08:58
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 735
Регистрация: 3-08-09
Пользователь №: 51 730



Цитата(Атмег @ 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;
Go to the top of the page
 
+Quote Post
Атмег
сообщение Aug 29 2016, 11:04
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 17-05-07
Пользователь №: 27 787



ой точно, спасибо)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd November 2017 - 20:22
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016