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

omap-l138 uPP

Всем доброго дня! К 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.

 

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


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

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

 

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

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


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

1) Несколько транзакций проходит нормально, вижу на выходе модуляцию, потом все стопорится на while (CSL_FEXT(uppRegs->UPIS2, UPP_UPIS2_PEND));

Поднимается флажок UORI в UPISR. Не оч понял из ДШ, при каких условиях это может происходить, понял только, что на это влияет клок, но он в моем случае с большим запасом по сравнению с максимальными 75.

Вообще, загнать uPP в underrun/overflow не так уж и просто. Как настроен приоритет в SYSCONF.MSTPRI0?

Попробуйте переключить TXSIZE на 128 байт в регистре UPTCR.

 

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

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

 

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

Лучше L138.

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


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

Без UPP можно как то нормально подключить к данному камню параллельное ADC, где то так на 10-20MSPS? Или же всё таки лучше на 138-м остановиться с UPP.

Без проблем. У L-137 есть два PRU-ядра как раз и предназначенные для эмуляции недостающей периферии. Логичней всего задействовать одно из них. Я думаю - написать такой простой код для PRU не составит труда.

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


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

Как настроен приоритет в SYSCONF.MSTPRI0?

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

 

Попробуйте переключить TXSIZE на 128 байт в регистре UPTCR.

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

 

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

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

 

Вопрос по аппаратной части: можно ли работать только с Enable, без Start и Wait, тут все нормально?

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


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

Вопрос по аппаратной части: можно ли работать только с Enable, без Start и Wait, тут все нормально?

Да, можно без Start и Wait.

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


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

// 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;

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

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


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

    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;

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


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

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

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

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

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

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

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

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

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

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