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

 
 
 
Reply to this topicStart new topic
> ADSP Blackfin BF 533, Работа с UART
bychkov_vladimir
сообщение Jul 23 2007, 07:19
Сообщение #1


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

Группа: Участник
Сообщений: 106
Регистрация: 1-06-05
Из: Подольск
Пользователь №: 5 629



Добрый день всем !
Существует необходимость работы процессора BF533 с последовательным портом RS232.
На данном этапе работаю в оценочном режиме и использую
аппаратную платформу для этого применения - KIT ADDS - BF533 - EZLite.
создал простейший проект для работы в зеркальном режиме с HYP Terminal Windows. и вот уже который день бьюсь с тем, чтобы хоть как то запустить проект в работу.

хочу привести пример своего описания (все сделано в main). Если не затруднит опытных разработчиков - сделайте пожалуйста замечания по инициализации и работе с портом.
в HYP Terminal настраиваюсь на работу со скоростью 19200.

#include <cdefBF533.h>
#include <ccblkfn.h>
#include <sysreg.h>
#include <sys\exception.h>
#define N 128
// ---------------------------------------------------------------------------------
void initUART(void) ; //function for initializing the UART
void initIRQ(void) ; //initialization Interrupt
void init_UART_Irq(void) ;
void initIRQ(void) ; //function for receive interrupt
void initPLL(void) ; //Initialize PLL to 594MHz and set up SCLK 118MHz.
EX_INTERRUPT_HANDLER(UARTRx_ISR);
void UART_putRECData(void) ; // back Receve Data to terminal
// ---------------------------------------------------------------------------------

char welcomemessage[] = {"\fHello! \n\r"
"Initialization UART comlete ! \n\r"} ;

char REC_Data[N] ;


main()
{

initPLL();
initUART();
// после инициализации порта появилось гостевое приглашение.
// далее следует обработка прерывания по приему данных.
init_UART_Irq() ;
initIRQ() ;
while(1)
{
};
}

void initUART()
{
int i ;


*pUART_LCR = 0x00B3 ;
// 0000|0000
// 1011
// DLAB = 1 разрешен доступ к регистру делителя (исспользование общего адресного простр.),
// SB = 0 соединение не разрывается,
// бит четности передается м проверяется как 0.
// проверка на четность
// 0011
// PEN = 0 бит проверки не передается и не проверяется
// STB = 0 1 стоповый бит
// WLS[1:0] - 11 - 8 разрядное слово

*pUART_MCR = 0x0000 ;
*pUART_GCTL = 0x0031;
// 0000|0000
// 00
// FFE = 1 нормальный режим работы.
// FPE = 1 нормальный режим работы.
// IREN = 0 работа IRDA запрешена.
// UCEN = 1 разрешение подачи сигнала тактовой синхронизации
*pUART_DLL = 0x0083 ; // 10000011 ;
*pUART_DLH = 0x0001 ; // 00000001 ; // Divizor = 387 (19200)

// разрешить доступ к регистру передачи и приема
*pUART_LCR = 0x0033 ;
// передача приветствия в терминальную программу
int Size ;
Size = sizeof(welcomemessage) ;
for ( i=0 ; i<Size ; i++)
{
// ждать готовность передатчика
do {;}
while (TEMT == 0) ; // пока сдвиговый и буферн. регистры заполнены.
*pUART_THR = welcomemessage[i] ;
}

}

void init_UART_Irq(void)
{
*pUART_IER = 0x0001 ;
}

void initIRQ(void)
{
*pSIC_IAR0 = 0xffffffff ;
*pSIC_IAR1 = 0xf3ffffff ; // назначение ID 3 для приема данных по UART
*pSIC_IAR2 = 0xffffffff ;
register_handler(ik_ivg10, UARTRx_ISR); // UART RX -> IVG 10

*pSIC_IMASK = 0x00004000;

}

void initPLL(void)
{

sysreg_write(reg_SYSCFG, 0x32); // Инициализация системного конф.регистра

*pSIC_IWR = 0x1;
*pPLL_CTL = 0x2C00; // множитель 22, а делитель 5 (27МГц.* 22 = 594 МГц / 5 = 118 МГц.)
ssync();
idle();


}
// -------------------------------------------------------------------------------------
EX_INTERRUPT_HANDLER(UARTRx_ISR)
{

static int ii ;
++ii ;
//char temp = 0xA ;
REC_Data[ii] = *pUART_RBR ; // -- чтение должно отпустить прерывание.
//REC_Data[ii] = temp ;
if (ii == N)
{
UART_putRECData();
}


}
// -------------------------------------------------------------------------------------
void UART_putRECData(void)
{
int i ;
int Size_REC ;
Size_REC = sizeof(REC_Data) ;
for (i = 0;i < Size_REC; i++)
{
while (THRE == 0) ; // пока не пуст.
{;}
*pUART_THR = REC_Data[i] ;
}
}



Заранее благодарен.
Go to the top of the page
 
+Quote Post
uriy
сообщение Jul 23 2007, 09:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Вы забыли вот это
*pUART_IER |= ERBFI; // enable UART RX interrupt
разрешение прерываний по приему RX.
Добавьте эту строку в void initIRQ(void)
Go to the top of the page
 
+Quote Post
bychkov_vladimir
сообщение Jul 23 2007, 10:45
Сообщение #3


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

Группа: Участник
Сообщений: 106
Регистрация: 1-06-05
Из: Подольск
Пользователь №: 5 629



Цитата(urasinov @ Jul 23 2007, 13:04) *
Вы забыли вот это
*pUART_IER |= ERBFI; // enable UART RX interrupt
разрешение прерываний по приему RX.
Добавьте эту строку в void initIRQ(void)



Эту процедуру я делаю - она вынесена в функцию :
void init_UART_Irq(void)
{
*pUART_IER = 0x0001 ;
}
.
проблема в том, что терминальное приложение молчит во всех проявлениях.
Я "мечтал" увидеть осуществление инициализации, которое заканчивается словами
char welcomemessage[] = {"\fHello! \n\r"
"Initialization UART comlete ! \n\r"} ;
но упорно ничего не получается.
Самое интерестное, что не работает тестовое приложение для этой платы (приложение шло с диском к плате) которое осушествляет похожую процедуру, но написано на АСМ.
Кабель нуль модемный.
2RX - 3TX
3TX - 2RX
5 - 5

может кто нибудь использовал подобные платы и практиковал написание подобного приложения ?
Go to the top of the page
 
+Quote Post
fontp
сообщение Jul 23 2007, 10:58
Сообщение #4


Эксперт
*****

Группа: Свой
Сообщений: 1 467
Регистрация: 25-06-04
Пользователь №: 183



А примеры из дистрибутива? Они работающие. Тот, что на ассемблере не пользует никаких сервисов

Вот здесь есть UART по полной программе с DMA
http://www.blackfin.org/phorum/read.php?10,5976
Go to the top of the page
 
+Quote Post
uriy
сообщение Jul 23 2007, 12:05
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Кабель нужен не нуль-модемный!!!
Я тоже долго ругался на ADI. Судя по разъемам должен быть нуль-модемный, на самом деле нет. Надо соединять pin-to-pin.
2-2
3-3
5-5
Можете убедиться, взглянув на электрическую схему платы.
Go to the top of the page
 
+Quote Post
bychkov_vladimir
сообщение Jul 24 2007, 06:56
Сообщение #6


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

Группа: Участник
Сообщений: 106
Регистрация: 1-06-05
Из: Подольск
Пользователь №: 5 629



Цитата(urasinov @ Jul 23 2007, 16:05) *
Кабель нужен не нуль-модемный!!!
Я тоже долго ругался на ADI. Судя по разъемам должен быть нуль-модемный, на самом деле нет. Надо соединять pin-to-pin.
2-2
3-3
5-5
Можете убедиться, взглянув на электрическую схему платы.



Спасибо огромное ! посмотреть на схему не догадался - поверил описаниям и требованиям к кабелю для соединения.

Перепаял кабель - уже начало работать !!!!!

Спасибо еще раз !
И спасибо всем за помощь !
Go to the top of the page
 
+Quote Post
bychkov_vladimir
сообщение Jul 24 2007, 08:06
Сообщение #7


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

Группа: Участник
Сообщений: 106
Регистрация: 1-06-05
Из: Подольск
Пользователь №: 5 629



Хочу задать вопрос еще такого плана.
Достаточно ли для работы в режиме приема без DMA (в режиме обслуживания прерываний)
сбрасывать бит фиксации прерывания при чтении, путем вычитывания регистра RBR ?
Go to the top of the page
 
+Quote Post
uriy
сообщение Jul 24 2007, 12:30
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Цитата
Достаточно ли для работы в режиме приема без DMA (в режиме обслуживания прерываний)сбрасывать бит фиксации прерывания при чтении, путем вычитывания регистра RBR ?

Может быть имели ввиду "ПУТЕМ ЧТЕНИЯ" регистра RBR?
Собсно я так и делаю.
Go to the top of the page
 
+Quote Post
bychkov_vladimir
сообщение Jul 26 2007, 09:51
Сообщение #9


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

Группа: Участник
Сообщений: 106
Регистрация: 1-06-05
Из: Подольск
Пользователь №: 5 629



Добрый день !
Хочу вернуться снова к ранее поставленной теме.
Не могу побороть такую проблему.

пишу шаблон для работы с KIT платой BF533 и терминального приложения.
система ориентирована на работу по выводу данных с платы.
не могу добиться обработки прерывания по заполнению буфера приема.
все вроде просто и лаконично, но полный ступор.
если Вам не сложно, посмотрите пожалуйста исходник и может Вы найдете в чем проблема ?
(работа без единой службы DMA)

// --------------------------------------------------------------------------------------------------------------
void Init_Uart()
{
unsigned long divisor ; // --- DIVIsOR ---
unsigned char msel ; // --- MSEL[5:0]
// --- PLL_CTL[14:9] ---
unsigned char ssel ; // --- SSEL[3:0]
// --- of PLL_DIV register[3:0]

/* Line Control Setup */
*pUART_LCR = 0x0083;

/* PLL_CTL */
msel = (*pPLL_CTL)>>9 ; // Read MSEL[5:0] from PLL_CTL
msel &= 0x3F ; // Clear all bits except msel[5:0]
// --- msel 10 DEC -------------------------

/* Read SSEL from PLL_DIV register */
ssel = *pPLL_DIV ; // ---
ssel &= 0x0F ; // ---
// --- Clear all bits except ssel[3:0]
// --- ssel 5 DEC ----------------------------
divisor = ((msel * CLKIN)/(ssel * 16 * BAUD_RATE)); // --- 29 ----

/* Baud Rate Setup: 115.2 Kbps */
// --- UART_DLL è UART_DLH ----
*pUART_LCR |= DLAB; // Enable Divisor Latch Access
*pUART_DLL = divisor;
ssync();
*pUART_DLH = (divisor>>8);
ssync();
*pUART_LCR &= ~DLAB;// Disable Divisor Latch Access
ssync();
*pUART_GCTL = UCEN; /*UART Clock enable*/
ssync();


char temp ;
int Size ;
int i ;
Size = sizeof(welcomemessage) ;
for ( i=0 ; i<Size ; i++)
{
do {;}
while (!(*pUART_LSR & TEMT)) ;
*pUART_THR = welcomemessage[i] ;
}
ssync();
ssync();
// ------------------------------------------------------------
*pUART_IER =0x5;//Enable interrupts for receive and error
// ------------------------------------------------------------
*pSIC_IAR0 = 0xf0ffffff ;
*pSIC_IAR1 = 0xf3ffffff ; // íàçíà÷åíèå ID 3 äëÿ ïðèåìà äàííûõ ïî UART
*pSIC_IAR2 = 0xffffffff ;
ssync();
register_handler(ik_ivg10, UARTRx_ISR); // UART RX -> IVG 10
register_handler(ik_ivg7, UART_error) ;

*pSIC_IMASK = 0x00004040;
ssync();

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


ssync();
ssync();

}


// ------------------------------------------------------------------------------------
и следующие несколько строк - обработчики прерываний
// ------------------------------------------------------------------------------------
void main()
{


Init_Uart();


while(1)
{
asm("nop;");
}

}


EX_INTERRUPT_HANDLER(UARTRx_ISR)
{

REC_Data = *pUART_RBR;
ssync();
UART_putRECData();



}
// -------------------------------------------------------------------------------------
void UART_putRECData(void)
{
do {;}
while (!(*pUART_LSR & TEMT)) ;
*pUART_THR = REC_Data; ;
// ssync();
}
// -------------------------------------------------------------------------------------
// ----------------------------------------

EX_INTERRUPT_HANDLER(UART_error)
{
REC_Data = *pUART_LSR;
ssync();
do {;}
while (!(*pUART_LSR & TEMT)) ;
*pUART_THR = '255' ;
}


Заранее благодарен.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 25th June 2025 - 22:15
Рейтинг@Mail.ru


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