Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не запускается uart blackfin
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Сигнальные процессоры и их программирование - DSP
dipdip
Не выходит запустить uart blackfin.

Использую такой инит

void uart_init (unsigned int divisor)
{

/*
// UART0 Controller (0xFFC00400 - 0xFFC004FF)
#define pUART0_THR ((volatile uint16_t *)UART0_THR)
#define pUART0_RBR ((volatile uint16_t *)UART0_RBR)
#define pUART0_DLL ((volatile uint16_t *)UART0_DLL)
#define pUART0_IER ((volatile uint16_t *)UART0_IER)
#define pUART0_DLH ((volatile uint16_t *)UART0_DLH)
#define pUART0_IIR ((volatile uint16_t *)UART0_IIR)
#define pUART0_LCR ((volatile uint16_t *)UART0_LCR)
#define pUART0_MCR ((volatile uint16_t *)UART0_MCR)
#define pUART0_LSR ((volatile uint16_t *)UART0_LSR)
#define pUART0_SCR ((volatile uint16_t *)UART0_SCR)
#define pUART0_GCTL ((volatile uint16_t *)UART0_GCTL)

*/

// enable UART clock.
*pUART0_GCTL = UCEN;//enable uart clock
// Read period value and apply formula: divisor = period/16*8
// Write result to the two 8-bit DL registers (DLH:DLL).
*pUART0_LCR = DLAB;//#define DLAB 0x80 Divisor Latch Access-ðàçðåøåíèå äîñòóïà â ðåãèñòð DLL,DLH
*pUART0_DLL = divisor;
*pUART0_DLH = divisor>>8;
// Clear DLAB again and set UART frame to 8 bits, no parity, 1 stop bit.
*pUART0_LCR = WLS(8);//#define WLS(x) (((x)-5) & 0x03) /* Word Length Select
//*pUART0_MCR = *pUART0_MCR | (1<<4);//âêëþ÷èòü ïèíû rx tx (bit4=1)

*pPORTFIO_DIR =*pPORTFIO_DIR | (1<<11);// F11 - out - bit11=1),
*pPORTF_FER = *pPORTF_FER & ~(1<<11);//tx bit11=0 - uart tx, =1 - F11. pin13
//*pPORTF_FER = *pPORTF_FER |(1<<11);
*pPORTF_FER = *pPORTF_FER & ~(1<<12);//rx bit12=0 - uart rx, =1 - F12. pin15
//*pPORTFIO_INEN=*pPORTFIO_INEN | (1<<11) | (1<<12);//enable pin f11,f12
*pPORTF_MUX = *pPORTF_MUX & ~(1<<11) & ~(1<<12);

Что подправить в настройке порта F.11?

Пробовал разные комбинации - не помогает.
_4afc_
Я порт вообще вроде не трогал - работало на 561:

Код
void Init_UART(void)
{
    volatile int temp;
*pUART_GCTL = UCEN;
*pUART_LCR = DLAB;
*pUART_DLL = BAUD_RATE_115200;
*pUART_DLH = (BAUD_RATE_115200 >> 8);
*pUART_LCR = 0x03;

temp = *pUART_RBR;
temp = *pUART_LSR;
temp = *pUART_IIR;

*pUART_IER = ETBEI;

PutChar('\r');PutChar('\n');
}
int PutChar(const char cVal)
{
int nStatus = 0;
u32 T;

T=GetTimeMS()+100;
    
do    {
    if( 0x20==(*pUART_LSR & 0x20) )
        {
        *pUART_THR = cVal;
        nStatus = 1;
        break;
        }
     ssync();
    }while( T>GetTimeMS() );

return nStatus;
}
dipdip
Цитата(_4afc_ @ Jan 11 2016, 21:22) *
Я порт вообще вроде не трогал - работало на 561:

Код
void Init_UART(void)
{
    volatile int temp;
*pUART_GCTL = UCEN;
*pUART_LCR = DLAB;
*pUART_DLL = BAUD_RATE_115200;
*pUART_DLH = (BAUD_RATE_115200 >> 8);
*pUART_LCR = 0x03;

temp = *pUART_RBR;
temp = *pUART_LSR;
temp = *pUART_IIR;

*pUART_IER = ETBEI;

PutChar('\r');PutChar('\n');
}
int PutChar(const char cVal)
{
int nStatus = 0;
u32 T;

T=GetTimeMS()+100;
    
do    {
    if( 0x20==(*pUART_LSR & 0x20) )
        {
        *pUART_THR = cVal;
        nStatus = 1;
        break;
        }
     ssync();
    }while( T>GetTimeMS() );

return nStatus;
}


Спасибо за пример, это то же, что я пробовал,но,
не наблюдаю настройки разрядов порта, в которые выведены пины rx, tx uart.

Неужели не нужно настраивать MUX, FER, направление пина PORTFIO_DIR,
PORTFIO_INEN - разрешение пина на вход?

Может для 561-го где-то раньше в программе были прописаны настройки пинов?

У меня ADSP-bf592.
Смотрел пример для 561 из доки на adsp-5-examples - там тоже ничего нет по пинам порта.

Какое значение должно быть в регистре UART_MCR (разряд4), который отключает
tx от выходного пина и подключает rx tx внутри для лупбек?

Из пдф-а не понятно - не прописано - пропуск в хардваре реф для - 592-го.
_4afc_
Цитата(dipdip @ Jan 11 2016, 22:01) *
Неужели не нужно настраивать MUX, FER, направление пина PORTFIO_DIR, PORTFIO_INEN - разрешение пина на вход?


Нет, поскольку в таблице 14-1 на 561 сказано, что PF26|PF27 работают только при неактивном UART.

Обычно, в сложных случаях - я баловался с регистрами напрямую через VDSP - это быстрее, чем компилить новый вариант.
Или можно остановить рабочий пример - и посмотреть настройки регистров..
dipdip
Цитата(_4afc_ @ Jan 11 2016, 22:31) *
Нет, поскольку в таблице 14-1 на 561 сказано, что PF26|PF27 работают только при неактивном UART.

Обычно, в сложных случаях - я баловался с регистрами напрямую через VDSP - это быстрее, чем компилить новый вариант.
Или можно остановить рабочий пример - и посмотреть настройки регистров..



Регистры uart смотрел на vdsp - показывает, все как нужно.

Регистры порта F для 592-го не отображает - показывает серым.

Поэтому и спрашиваю за порт.

В таблице mux написано, что значение бита для порта IO и FUNCtion отличается.





_4afc_
мне кажется последовательность:
*pPORTF_MUX &= ~0x1800;
*pPORTF_MUX |= 0x0000;
*pPORTF_FER |= (PF12|PF11);
отключает, а не включает порты.

Вы пробовали курить EE347v03 ?
dipdip
Цитата(_4afc_ @ Jan 11 2016, 23:54) *
мне кажется последовательность:
*pPORTF_MUX &= ~0x1800;
*pPORTF_MUX |= 0x0000;
*pPORTF_FER |= (PF12|PF11);
отключает, а не включает порты.

Вы пробовали курить EE347v03 ?


Заработало.

Нужно было поставить

*pPORTF_FER = *pPORTF_FER | (1<<11) | (1<<12); - 1-цы вместо 0 для функции rx tx pin.
0 - для пина.

Было наоборот.

Не понятно зачем вторая строка в
*pPORTF_MUX &= ~0x1800;
*pPORTF_MUX |= 0x0000;

EE347v03 - слишком громоздко (фундаментально) для 2 байта передать.

Спасибо за консультации.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2024 Invision Power Services, Inc.