dipdip 0 11 января, 2016 Опубликовано 11 января, 2016 · Жалоба Не выходит запустить 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_ 24 11 января, 2016 Опубликовано 11 января, 2016 · Жалоба Я порт вообще вроде не трогал - работало на 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 0 11 января, 2016 Опубликовано 11 января, 2016 · Жалоба Я порт вообще вроде не трогал - работало на 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_ 24 11 января, 2016 Опубликовано 11 января, 2016 · Жалоба Неужели не нужно настраивать MUX, FER, направление пина PORTFIO_DIR, PORTFIO_INEN - разрешение пина на вход? Нет, поскольку в таблице 14-1 на 561 сказано, что PF26|PF27 работают только при неактивном UART. Обычно, в сложных случаях - я баловался с регистрами напрямую через VDSP - это быстрее, чем компилить новый вариант. Или можно остановить рабочий пример - и посмотреть настройки регистров.. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dipdip 0 11 января, 2016 Опубликовано 11 января, 2016 · Жалоба Нет, поскольку в таблице 14-1 на 561 сказано, что PF26|PF27 работают только при неактивном UART. Обычно, в сложных случаях - я баловался с регистрами напрямую через VDSP - это быстрее, чем компилить новый вариант. Или можно остановить рабочий пример - и посмотреть настройки регистров.. Регистры uart смотрел на vdsp - показывает, все как нужно. Регистры порта F для 592-го не отображает - показывает серым. Поэтому и спрашиваю за порт. В таблице mux написано, что значение бита для порта IO и FUNCtion отличается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 24 11 января, 2016 Опубликовано 11 января, 2016 · Жалоба мне кажется последовательность: *pPORTF_MUX &= ~0x1800; *pPORTF_MUX |= 0x0000; *pPORTF_FER |= (PF12|PF11); отключает, а не включает порты. Вы пробовали курить EE347v03 ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dipdip 0 11 января, 2016 Опубликовано 11 января, 2016 (изменено) · Жалоба мне кажется последовательность: *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 байта передать. Спасибо за консультации. Изменено 11 января, 2016 пользователем dipdip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться