Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: работа UART процессора BF533
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
badik
Начинаю осваивать BF-533 по примерам, программы на С, использую ADSP-BF533 EZ-Kits (27MHz).
Попробывал с простым примером из программ EZ-Kits - LED индикаторы, что то работает.
Далее пытаюсь сделать работу процессора BF533 с последовательным портом RS232.
Мне очень нужное дело. На входе GPS - раз в секунду выдаёт строку данных (GPS точно работает, со скоростью 9600).
Пока просто пытаюсь убедиться, что работает UART, идут его прерывания. Для этого
в прерывание UART изменение индикации LED индикаторов EZ-Kits (*pFlashA_PortB_Data), ноль имоций.
Возможно неправильная инц-я UART и т.д.
Навставлял где надо и ненадо (по другим примерам):
ssync();
idle();
Собственно их значение мне почти не понятно

Мой пример далее - если есть возможность у опытных разработчиков?

#ifndef __Talkthrough_DEFINED
#define __Talkthrough_DEFINED
#include <sys\exception.h>
#include <cdefBF533.h>
#include <ccblkfn.h>
#include <sysreg.h>
void Init_Config(void);
void Init_Interrupts(void);
void Init_Flags(void);
void Init_Flash(void);

// CLKIN frequency is 27MHz on the ADSP-BF533 EZ-Kits.
#define CLKIN 27

#define BAUDRATE 9600
#define NEWLIGHT 200

// Neiaieuiua eiinoaiou //
// Aa?ana aey Port B a Flash A
#define pFlashA_PortB_Dir (volatile unsigned char *)0x20270007
#define pFlashA_PortB_Data (volatile unsigned char *)0x20270005

extern char aByte;
extern short FlagLight;
extern long int IntrId;

EX_INTERRUPT_HANDLER(UART_RX_ISR);
#endif

//--------------------------------------------------------------------------//

#include "Talkthrough.h"
#include "sysreg.h"
#include "ccblkfn.h"
#include <defBF533.h>
#include <string.h>
char aByte;
short FlagLight=0;
long int IntrId=0;

///////////////////////////////////////////////////////////////
//CLKIN is the input clock.The ADSP-BF533 EZ-Kit's CLKIN is 27MHz
//This function will check what the system clock is based
//on the MSEL, DF, and SSEL values in the PLL_CTL and PLL_DIV registers.
///////////////////////////////////////////////////////////////
int GetSCLK()
{
unsigned short tempPLLCTL, tempPLLDIV;
unsigned short MSEL, SSEL, DF, VCO, SCLK;
unsigned short clkin = CLKIN;

tempPLLCTL = *pPLL_CTL;
tempPLLDIV = *pPLL_DIV;
//get MSEL, SSEL, DF
MSEL = ((tempPLLCTL & 0x7E00) >> 9);
SSEL = tempPLLDIV & 0x000f;
DF = tempPLLCTL & 0x0001;
if(DF == 1) clkin = clkin/2;
VCO = MSEL * clkin;
return ( VCO * 1000000 ) / SSEL;
}

void main(void)
{
sysreg_write(reg_SYSCFG, 0x32);
Init_Config();
Init_Flash();
Init_Interrupts();
while(1) {};
}

//--------------------------------------------------------------------------//

#include "Talkthrough.h"

void Init_Config(void)
{
unsigned long divisor=0;

*pPLL_CTL = 0x0200; // VCO = 27MHz
ssync();
idle();

*pUART_LCR = 0x83;
ssync();
divisor = GetSCLK() / ( 16 * BAUDRATE );
*pUART_DLL = divisor;
ssync();
*pUART_DLH = divisor>>8;
ssync();
*pUART_LCR = 0x03;
ssync();
*pUART_GCTL = 0x01;
ssync();
}

void Init_Interrupts(void)
{
*pUART_IER = 0x0007;
*pUART_IIR = 0x0005;
ssync();
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xf3ffffff;
*pSIC_IAR2 = 0xffff5fff;
ssync();
register_handler(ik_ivg10, UART_RX_ISR);
*pSIC_IMASK = 0x00084000;
ssync();
}

void Init_Flash(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0x7bb07bb0;
*pEBIU_AMGCTL = 0x000f;
*pFlashA_PortB_Dir = 0x3f;
*pFlashA_PortB_Data = 0x31;
}
//--------------------------------------------------------------------------//

#include "Talkthrough.h"
EX_INTERRUPT_HANDLER(UART_RX_ISR)
{
aByte = *pUART_RBR;
ssync();
if(FlagLight)
{
FlagLight = 0;
if(IntrId > NEWLIGHT)
{
IntrId = 0;
*pFlashA_PortB_Data = 0x10;
}
else IntrId++;
}
else
{
FlagLight = 1;
if(IntrId > NEWLIGHT)
{
IntrId = 0;
*pFlashA_PortB_Data = 0x21;
}
else IntrId++;
}
}
bychkov_vladimir
Цитата(badik @ Aug 6 2007, 07:36) *
Начинаю осваивать BF-533 по примерам, программы на С, использую ADSP-BF533 EZ-Kits (27MHz).
Попробывал с простым примером из программ EZ-Kits - LED индикаторы, что то работает.
Далее пытаюсь сделать работу процессора BF533 с последовательным портом RS232.
Мне очень нужное дело. На входе GPS - раз в секунду выдаёт строку данных (GPS точно работает, со скоростью 9600).
Пока просто пытаюсь убедиться, что работает UART, идут его прерывания. Для этого
в прерывание UART изменение индикации LED индикаторов EZ-Kits (*pFlashA_PortB_Data), ноль имоций.
Возможно неправильная инц-я UART и т.д.
Навставлял где надо и ненадо (по другим примерам):
ssync();
idle();
Собственно их значение мне почти не понятно

Мой пример далее - если есть возможность у опытных разработчиков?

#ifndef __Talkthrough_DEFINED
#define __Talkthrough_DEFINED
#include <sys\exception.h>
#include <cdefBF533.h>
#include <ccblkfn.h>
#include <sysreg.h>
void Init_Config(void);
void Init_Interrupts(void);
void Init_Flags(void);
void Init_Flash(void);

// CLKIN frequency is 27MHz on the ADSP-BF533 EZ-Kits.
#define CLKIN 27

#define BAUDRATE 9600
#define NEWLIGHT 200

// Neiaieuiua eiinoaiou //
// Aa?ana aey Port B a Flash A
#define pFlashA_PortB_Dir (volatile unsigned char *)0x20270007
#define pFlashA_PortB_Data (volatile unsigned char *)0x20270005

extern char aByte;
extern short FlagLight;
extern long int IntrId;

EX_INTERRUPT_HANDLER(UART_RX_ISR);
#endif

//--------------------------------------------------------------------------//

#include "Talkthrough.h"
#include "sysreg.h"
#include "ccblkfn.h"
#include <defBF533.h>
#include <string.h>
char aByte;
short FlagLight=0;
long int IntrId=0;

///////////////////////////////////////////////////////////////
//CLKIN is the input clock.The ADSP-BF533 EZ-Kit's CLKIN is 27MHz
//This function will check what the system clock is based
//on the MSEL, DF, and SSEL values in the PLL_CTL and PLL_DIV registers.
///////////////////////////////////////////////////////////////
int GetSCLK()
{
unsigned short tempPLLCTL, tempPLLDIV;
unsigned short MSEL, SSEL, DF, VCO, SCLK;
unsigned short clkin = CLKIN;

tempPLLCTL = *pPLL_CTL;
tempPLLDIV = *pPLL_DIV;
//get MSEL, SSEL, DF
MSEL = ((tempPLLCTL & 0x7E00) >> 9);
SSEL = tempPLLDIV & 0x000f;
DF = tempPLLCTL & 0x0001;
if(DF == 1) clkin = clkin/2;
VCO = MSEL * clkin;
return ( VCO * 1000000 ) / SSEL;
}

void main(void)
{
sysreg_write(reg_SYSCFG, 0x32);
Init_Config();
Init_Flash();
Init_Interrupts();
while(1) {};
}

//--------------------------------------------------------------------------//

#include "Talkthrough.h"

void Init_Config(void)
{
unsigned long divisor=0;

*pPLL_CTL = 0x0200; // VCO = 27MHz
ssync();
idle();

*pUART_LCR = 0x83;
ssync();
divisor = GetSCLK() / ( 16 * BAUDRATE );
*pUART_DLL = divisor;
ssync();
*pUART_DLH = divisor>>8;
ssync();
*pUART_LCR = 0x03;
ssync();
*pUART_GCTL = 0x01;
ssync();
}

void Init_Interrupts(void)
{
*pUART_IER = 0x0007;
*pUART_IIR = 0x0005;
ssync();
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xf3ffffff;
*pSIC_IAR2 = 0xffff5fff;
ssync();
register_handler(ik_ivg10, UART_RX_ISR);
*pSIC_IMASK = 0x00084000;
ssync();
}

void Init_Flash(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0x7bb07bb0;
*pEBIU_AMGCTL = 0x000f;
*pFlashA_PortB_Dir = 0x3f;
*pFlashA_PortB_Data = 0x31;
}
//--------------------------------------------------------------------------//

#include "Talkthrough.h"
EX_INTERRUPT_HANDLER(UART_RX_ISR)
{
aByte = *pUART_RBR;
ssync();
if(FlagLight)
{
FlagLight = 0;
if(IntrId > NEWLIGHT)
{
IntrId = 0;
*pFlashA_PortB_Data = 0x10;
}
else IntrId++;
}
else
{
FlagLight = 1;
if(IntrId > NEWLIGHT)
{
IntrId = 0;
*pFlashA_PortB_Data = 0x21;
}
else IntrId++;
}
}


Назначение двух операций следующее:
idle - переводит процессора в режим ожидания
выход их которого может осушествяться как угодно...
ssync - функция синхронизации системы

можно еще раз по подробнее что Вы хотите сделать.
по программе более прозрачно, но зачем Вам еще прерывание по одному из флагов ?
что то не могу понять
badik
Цитата(bychkov_vladimir @ Aug 6 2007, 12:25) *
Назначение двух операций следующее:
idle - переводит процессора в режим ожидания
выход их которого может осушествяться как угодно...
ssync - функция синхронизации системы

можно еще раз по подробнее что Вы хотите сделать.
по программе более прозрачно, но зачем Вам еще прерывание по одному из флагов ?
что то не могу понять

По ssync(); idle(); их функции я в черне так и представлял, но мне неясно когда их нужно применять. Отсутствие их фатально?
По флагам прерывания не использую. Возможно что-то я лишнего по ним оставил, но функции флагов только включение LED индикаторов EZ-Kits.
В программе пытаюсь освоить работу UART ADSP-BF533 (главное одновременно ADSP-BF533 вообще).
Использую готовую фирменную плату ADSP-BF533 EZ-Kits (27MHz).
Так как пока всё глухо, пытался проверить UART на уровне прерываний - чтение. Всё по минимуму. В прерывание чтение UART вставил изменение индикации LED индикаторов EZ-Kits (*pFlashA_PortB_Data). Чтобы они мигнули примерно раз в секунду (это порядка нескольких сотен чтений/прерываний).
Но индикация не изменяется - повидимому нет прерываний UART. Манипулирую настройками и т.д., но без изменений. Видно что-то я не так как нужно задал.
С проектом для LED индикаторов ADSP-BF533 EZ-Kits - фирменный пример ADI попробывал ранее.

С уважением
badik
bychkov_vladimir
предлагаю попробывать Вам работу с прерыванием и чтением данных по UART
c помощью стандартной ВиН.програмы HypTerminal. Это довольно наглядно и просто, чем ждать пока мигнет светодиод и думать правильно ли процессор обработал прерывание. Работу с ним Вы сможите добавить в любое время.

что просто и как проше с чего начать. Я смотрю Вы сначала пытаетесь задать частоту ядра и периферии.
Давайте пока это опустим. После сброса процессора частота периферии станет в 118 МГц. (с Вашим кварцем на борту).
я приведу пример - пока свежо в памяти недавно сам с этим работал.
1.) инициализация порта.
#include <cdefbf533.h>
#include <signal.h>
#include <stdio.h>
#include <sys/exception.h>
#include <sys/excause.h>
char welcomemessage[] = {"\fHello! \n\r"
"Initialization UART comlete ! BlackFIN module UART work\n\r"} ;
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; // --- при разрыве соединения TX переводится в 0
// --- 8-ми битные данные, 1 стоповый бит,
// --- бит проверки не передается и не проверяется.


/* Чтение значения множителя MSEL в регистре 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 calculation:
* SCLK = (msel * CLKIN)/ssel if DF = 0 // --- формула по расчету частоты периферии
* SCLK = (msel * CLKIN/2)/ssel if DF = 1
* divisor = SCLK/(16 * BAUD_RATE)
*/
divisor = ((msel * CLKIN)/(ssel * 16 * BAUD_RATE)); // --- 29 ----

if(*pPLL_CTL & 0x1) // If DF = 1, CLKIN/2 is going to PLL
{
divisor /= 2; // Divide by 2
}

/* 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();
// --- Доступ к буферным регистрам приема и передачи ----------
// --- изменение 1 на 0 ---------------------------------------
*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] ;
input_temp = *pUART_RBR ;
}
ssync();
ssync();
// -- установка прерываний ------
// ------------------------------------------------------------
*pSIC_IAR0 = 0xffffffff ;
*pSIC_IAR1 = 0xf3ffffff ; // назначение ID 3 для приема данных по UART
*pSIC_IAR2 = 0xffffffff ;
ssync();
register_handler(ik_ivg10, UARTRx_ISR); // UART RX -> IVG 10


*pSIC_IMASK = 0x00004000;
ssync();


// --- разрешение прерывания по заполнению буфера приема ------
*pUART_IER =0x1;//Enable interrupts for receive


}

т.е. вот Вам инициализация UART и демаскирование прерывания приема .
НО ДЛЯ 9600 пересчитайте еще значение делителя.
потом в майн можно описать так

void main()
{

sysreg_write(reg_SYSCFG, 0x32); //Initialize System Configuration Register
Init_Uart();


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

}

и обработчик прерывания
EX_INTERRUPT_HANDLER(UARTRx_ISR)
{

// тут можно разместить функцию по побайтовому приему данных и обратной отсылки их в
// терминальную программу. Паралельно можно моргать своим диодом на плате, только для вывода
//сделате задержку, что бы это подмигивание можно было увидеть

}
в общем пробуте и спрашивайте.
andrews
Цитата(bychkov_vladimir @ Aug 6 2007, 16:20) *
предлагаю попробывать Вам работу с прерыванием и чтением данных по UART
c помощью стандартной ВиН.програмы HypTerminal. Это довольно наглядно и просто, чем ждать пока мигнет светодиод и думать правильно ли процессор обработал прерывание. Работу с ним Вы сможите добавить в любое время.

что просто и как проше с чего начать. Я смотрю Вы сначала пытаетесь задать частоту ядра и периферии.
Давайте пока это опустим. После сброса процессора частота периферии станет в 118 МГц. (с Вашим кварцем на борту).
я приведу пример - пока свежо в памяти недавно сам с этим работал.
1.) инициализация порта.
#include <cdefbf533.h>
#include <signal.h>
#include <stdio.h>
#include <sys/exception.h>
#include <sys/excause.h>
char welcomemessage[] = {"\fHello! \n\r"
"Initialization UART comlete ! BlackFIN module UART work\n\r"} ;
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; // --- при разрыве соединения TX переводится в 0
// --- 8-ми битные данные, 1 стоповый бит,
// --- бит проверки не передается и не проверяется.
/* Чтение значения множителя MSEL в регистре 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 calculation:
* SCLK = (msel * CLKIN)/ssel if DF = 0 // --- формула по расчету частоты периферии
* SCLK = (msel * CLKIN/2)/ssel if DF = 1
* divisor = SCLK/(16 * BAUD_RATE)
*/
divisor = ((msel * CLKIN)/(ssel * 16 * BAUD_RATE)); // --- 29 ----

if(*pPLL_CTL & 0x1) // If DF = 1, CLKIN/2 is going to PLL
{
divisor /= 2; // Divide by 2
}

/* 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();
// --- Доступ к буферным регистрам приема и передачи ----------
// --- изменение 1 на 0 ---------------------------------------
*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] ;
input_temp = *pUART_RBR ;
}
ssync();
ssync();
// -- установка прерываний ------
// ------------------------------------------------------------
*pSIC_IAR0 = 0xffffffff ;
*pSIC_IAR1 = 0xf3ffffff ; // назначение ID 3 для приема данных по UART
*pSIC_IAR2 = 0xffffffff ;
ssync();
register_handler(ik_ivg10, UARTRx_ISR); // UART RX -> IVG 10


*pSIC_IMASK = 0x00004000;
ssync();


// --- разрешение прерывания по заполнению буфера приема ------
*pUART_IER =0x1;//Enable interrupts for receive


}

т.е. вот Вам инициализация UART и демаскирование прерывания приема .
НО ДЛЯ 9600 пересчитайте еще значение делителя.
потом в майн можно описать так

void main()
{

sysreg_write(reg_SYSCFG, 0x32); //Initialize System Configuration Register
Init_Uart();
while(1)
{
asm("nop;");
}

}

и обработчик прерывания
EX_INTERRUPT_HANDLER(UARTRx_ISR)
{

// тут можно разместить функцию по побайтовому приему данных и обратной отсылки их в
// терминальную программу. Паралельно можно моргать своим диодом на плате, только для вывода
//сделате задержку, что бы это подмигивание можно было увидеть

}
в общем пробуте и спрашивайте.

Есть статья в КиТ "Быстрое погружение с черными плавниками", в ней описывается проект по работе с COM-портом по прерыванию. Циклические буфера и все такое. Работает с терминальной программой на хосте. Сам проект вот здесь
http://avisv.narod.ru/BlackFin/project1.htm
выложен, и вопросы можно там задать. Работает на плате BF533-EZLITE
Саму статью можно поискать на сайте "Элтех", поскольку она и в "Альманахе Элтех" тоже была опубликована.
http://www.eltech.spb.ru/pdf/A_D/adi_254.pdf (ч.1)
Ч.2 и 3 и прочие будут выложены чуть позже.
badik
Благодарю за помощь.
Я видел Ваши сообщения по RS232 на форуме, их анализировал.
Ваш пример я запустил, но есть проблема. Как я понимаю нужно плату
ADSP-BF533 EZ-Kits подцепить к COM-порту PC. Разьёмы COM EZ-Kits и PC одни и теже - "папа".
Стандартный кабель не подходит.
Программа HyperTerminal - c ней пока не общался, как то нужно задать конкретный COM-порт?
Я пока это в ней не увидел (подключение - для удалённого доступа, в свойствах есть COM1 и параметры - сама включится?).
В Ваших сообщениях видел про Кабель нуль-модемный/не нуль-модемный (2-й работал) - это как то касается меня?
С уважением
badik
bychkov_vladimir
Давайте по порядку
кабель нужен не нуль модемный (как это пишут в реад ми демо приложения), а 1:1
самый простой способ - возмите две розетки 9 пиновые и соедините проводниками 2 со 2м
3й с 3м и 5й с 5м. Ваш кабель готов.
потом подсоедините кабель к плате и системному блоку Вашего компьютера. (если у Ваш два кома на материнке) включите к примеру в первый.
потом настройте подключение в HypTerm. для COM1 (если Вы включились в 1й COM)
После этого в параметрах порта задайте:
1. Скорость - (проверте чтобы скорости работы Вашей платы и компьютера совпадали)
2. Биты данных - 8
3. четность - нет
4. стоповые биты - 1 шт.
5. управление потоком - аппаратное или нет

Запускаете терминалку, жмете RUN в VisualDSP и на экране в терминалки отобразиться гостевое приглашение.
а дальше, если Вы работаете в эхо режиме, - соответственно Ваши введенные и возвращенные обратно символы.
badik
Ещё раз Благодарю за помощь.
Ценой усилий целого дня, собрал кабель ...
Первая маленькая победа - HyperTerminal выдал Ваше сообщение.
В прерывание вствил LED индикаторы ADSP-BF533 EZ-Kits и он раз мигнул (наверное много?).
Из HyperTerminal послал на ADSP-BF533 текстовый файл, он наверное махом проскочил и возможно поэтому индикацию невидно. Почему хотел использовать GPS - постоянно передаёт.
Сейчас надо думать как это сделать с HyperTerminal.
С уважением
badik


Ещё забыл спросить про Кабель нуль-модемный - это особенность программы HyperTerminal или у платы ADSP-BF533 EZ-Kits нужно RS232 так подключать?
С уважением
badik
bychkov_vladimir
это особенность платы .
просто там так распаяна вилка DB9
на самом деле модемный кабель перекрестный. 2-3 ; 3-2 ; 5-5.
andrews
Я при отладке моего проекта спаял кабель самостоятельно. Для его проверки можно использовать программу из примеров Visual DSP++. Вообще весь процесс отладки очень подробно описан в моей статье "Погружение с "черными плавниками" часть 2. Привожу нужный фрагмент текста.
---
"Для отладки нашего драйвера мы, конечно же, должны использовать дополнительный компьютер с установленной на нем терминальной программой. Ситуация весьма распространенная, когда требуется точка опоры, чтобы повернуть Землю. Ни на одну программу нельзя полагаться априори, какими бы гениальными программистами она не была создана. Убедиться в работоспособности выбранной терминальной программы можно с помощью “петли”, то есть, соединения выхода последовательного COM порта с его входом. Как это сделать физически не суть важно. В простейшем случае достаточно в 9-контактном разъеме DB9M соединить между собой 2 и 3 контакты. Результат тестирования использованной нами программы Terminal v1.9b вы видите на рис.1

Поясним, что изображено на рисунке в нескольких словах, поскольку и далее мы будем пользоваться для иллюстрации именно этой программой. Серое окно в средней части с четырьмя скроллбарами является консолью приемника, нижнее – передатчика последовательного порта. Однострочное окно с белым фоном отображает, набираемые на клавиатуре данные для передачи. Чтобы осуществить ввод и редактирование в этой строке, необходимо позиционировать курсор в нужное место. Подробное описание возможностей данной программы можно получить при нажатии на виртуальную клавишу “Help”, скачать ее можно с сайта http://bray.velenje.cx/avr/terminal
Вспомогательный компьютер, на котором запущена терминальная программа далее по тексту будем называть терминальным. На основном же компьютере, к которому присоединена плата ADSP-BF533 EZ-KIT Lite, в это время выполняется программа VisualDSP++. На следующем шаге нам понадобится соединительный кабель между терминальным компьютером и ADSP-BF533 EZ-KIT Lite. В комплект поставки он обычно не входит, и его придется изготовить самостоятельно.
Посмотрите, пожалуйста, в Приложении B Schematics Sheet 9 [1] в правой нижней части под надписью UART изображено соединение цепей платы ADSP-BF533 EZ-KIT Lite со стандартным 9-pin разъемом DB9M. Только будьте внимательны: не следует соединять выводы “перекрестно” как в схеме “нуль-модема”! Из-за этого может произойти путаница, и собранный кабель окажется непригодным для работы. К счастью, изготовители нашей “мини-субмарины” и здесь предусмотрели “аварийный выход”. В поставке программного обеспечения имеются заведомо рабочие примеры для работы с COM- портом, с помощью которых можно протестировать собранный кабель. Авторы обнаружили два демонстрационных проекта пригодных для этой цели. Первый реализован на ассемблере Blackfin. Он как раз работает по прерываниям и содержит много ценных подсказок. Но чтобы ими воспользоваться, нужно прежде овладеть ассемблером. Так как предмет наших статей быстрое введение в проблематику, этот путь, очевидно, не для нас. Хотя, если возникнут непреодолимые препятствия, держим этот вариант в уме “про запас”.
Располагается этот проект в директории
<Путь установки>\Blackfin\EZ-KITs\ADSP-BF533\Examples\UART RS-232 HyperTerminal session.
Вы еще помните, как открывать проекты в IDE Visual DSP++? Об этом подробно рассказывалось в части 1 нашей статьи. На всякий случай, напомним - в меню File -> Open -> Project выбираем нужный проект (файл с расширением .dpj)
К счастью для нас, имеется и проект, пригодный для тестирования собранного кабеля, на языке С. Только он, в полном согласии с законами Мерфи, не работает по прерываниям. С другой стороны именно это обстоятельство дает нам возможность внести свою скромную лепту в копилку кода Examples.
Проект STDIO UART можно найти в директории
<Путь установки>\Blackfin\EZ-KITs\ADSP-BF533\Examples\STDIO UART. Первое, что мы обнаруживаем в комментариях к main.c
//Special Connections:
// - EIA-232 Serial Cable (1:1)
// - Terminal Program (i.e. Hyperterminal for Windows)
// - 2400 bits per second (default)
// - 8-bit, no parity, 1 stop bit
// - no handshake
// - echo off
Отсюда понятно, из-за чего не следует применять “нуль-модемный” перекрестный кабель. Видны также необходимые параметры соединения для терминальной программы. Впрочем, вы можете изменять их по своему усмотрению, но только одновременно и в данном проекте, и в вашей терминальной программе. Код этого примера ( в отличие от рассмотренных нами прежде в части 1 статьи), выполнен в хорошем стиле.
Если ваш кабель работоспособен хотя бы на вывод из ADSP-BF533 EZ-KIT Lite, на экране монитора появится:

“Type in something, press <Enter>, and I'll repeat it backwards!”
И программа действительно делает это! Конечно при условии, что вы правильно спаяли кабель и еще не успели вывести из строя свои com-порты. Словом, наступает момент истины, и мы пожелаем вам удачи! Надеемся, что у вас, как и у нас, испытание прошло благополучно."

Поскольку ссылка на сайт автора программы перестала работать выложил эту терминальную программу на свой сайт.
http://avisv.narod.ru/Terminal.exe
или, если у вас заблокирована загрузка exe-шников как в нашей фирме
http://avisv.narod.ru/Terminal.rar
badik
Огромное Вам спасибо!
Пообщался успешно с Terminal v1.9b - всё работает, теперь что-то получается с ADSP-BF533.
Вопрос где найти Вашу статью "Погружение с "черными плавниками" часть 2, в ЭЛТЕХ не нашёл.
Вообще у меня как пользователя к Вам (как я понял Вы представляете ЭЛТЕХ) просьба по ADSP-BF533 - эти бы части по всей переферии как можно скорее выпустить. Раз литературы нет. На форуме одни и теже вопросы на 70% как начать .., как работает COM и т.д. Все идут в слепую и через одни и те же грабли, причём из года в год. Курсы так же проблема, с России группу 5 человек собрать проблема. Сейчас уже так изучать - жалко время. Меня очень интересует ADSP-BF533 <-> символьныe ЖКИ.
По теме порт RS232 остался вопрос подключить GPS к UART ADSP-BF533 EZ-Kits.
GPS со всеми прогаммами работает: HypTerminal Windows, Terminal v1.9b, мои на Delphi и т.д. Выдаёт коорднаты раз в секунду. Как подключаю к ADSP-BF533 EZ-Kits с ним какойто ступор. Я уж на осцилографе всё просмотрел не раз. С GPS импульсы не идут ни какие (поэтому нет прерываний). На других прогаммамах 2 нога DB9M есть GPS импульсы, но заметил для Terminal делаю отключение COM - GPS сразу замолкает не выдаёт импульсы. Возможно с EZ-Kits такая ситуация? У EZ-Kits 3 нога DB9M вход, я уж пробывал перебрасывать 2 и 3 - ничего не помогает - GPS молчит.
Для примера с Terminal v1.9b передача на ADSP-BF533 EZ-Kits - делаю останов прогаммы на ADSP-BF533 - Terminal как ни в чем не бывало посылает импульсы/данные с COM порта.
Не знаю что уже думать. GPS для меня крайне важен.
Еще раз спасибо.
andrews
Что касается статей цикла, то в КиТ уже опубликована ч.3.1 про RTC и таймеры и скоро выйдут ч3.2 и 3.3 к ним будет прилагаться готовый законченный проект в исходниках на С, представляющий из себя простейшую самодельную RTS, в фоне обрабатывающую поток команд и данных по COM-порту. Затем сверху будет водружена часть собственно обработки сигналов в реальном времени ( здесь пока не принято окончательного решения, что это будет: CCD+LCD c клавиатурой и возможностью проигрывания медийных файлов, или просто цифровой осциллограф/генератор шума). То же, что уже опубликовано в КиТ, непременно перепечатывается сперва в "Альманахе Элтеха", раздаваемом бесплатно клиентам, и вскоре вслед за этим на сайте
http://www.eltech.spb.ru/techinfo.html?gid=8
Поскольку часть 2 "Пишем драйвер последовательного порта" в Альманахе уже напечатана, то скоро должна появиться в свободном доступе. А мне в праве распространять верстки статей цикла пока что, к сожалению, отказано. Могу лишь информировать о "фазах луны" wink.gif
В перспективе я хотел издать все в виде отдельной брошюры с диском, если это кому-то будет интересно и найдется издатель. По поводу курсов Blackfin-ов, они есть в Таганроге и Дагестане, если найдется n-ое количество желающих в Питере, а самое главное кто-то из питерских вузов проявит интерес, то Элтех может этот проект осуществить. А пока можно договориться со мной в частном порядке. Но сразу оговорюсь, что сперва вы обрисовываете круг вопросов, которые хотите изучить специалистами вашей компании ( 2-7 человек), потом я их прорабатываю, довожу имеющиеся презентации, и после этого уже стартуем. Если интересуют только практические занятия на платах EZLITE, оговаривается на каких именно, если у меня их нет, то они должны быть у вас smile.gif аналогично и по поводу эмулятора. Есть много стартовых наборов и эмуляторов, но я пока готов демонстрировать все только на отладочниках ADI.
По поводу проблем с Вашим проектом, если Вы клиент Элтеха никаких проблем, обращайтесь в техподдержку. Просто звоните на многоканальный, и зовете нужного человека из раздела "Элтех в лицах" .
badik
По поводу курсов Blackfin-ов: в Питере университет не может собрать группу, там поодержка Элтех есть. Где можно узнать про Таганрог и Дагестан?
Я сотрудник Института геофизики УрО РАН, г. Екатеринбург. Хочу изучить ADSP-BF533 только я один, нужна информация о "частном порядке". Просьба ответить на два адреса:
vadikural@mail.ru
badik@mizarpro.com
Еще раз спасибо.
bychkov_vladimir
давайте теперь попробую помочь Вам в Вашей работе с Gps.
Вы можете немного подробнее расписать что за приемник (кратко спецификацию, можно ссылку), и в чем заключается в общих чертах Ваша работа с ним.
badik
Gps приемник встраиваемый (это просто чип).
Мой Gps (как мне писали, покупал года 4 назад) TIM-LP Macro-Component
http://www.u-blox.com/products/tim_lp.html

Вскрывал корпус (бокс) на чипе написано:
u-blox
TIMA-C0001-0 (по этому названию данных не нашёл).

С PC GPS работает прекрасно, выдает 1 раз в секунду текущее положение по станд. протоколу NMEA.
Cимвольная строка X,Y, время и т.д. - около сотни символов.
НО почему не работает с ADSP-BF533 EZ-Kits (убивать за такие разработки мало) - та контора, делали бокс и для экономии запитали часть Gps из цепи RS232 - DB9 нога 6, а ADSP-BF533 EZ-Kits она весит в воздухе. Сколько времени потеряли пока нашли. Они сами уже давно забыли.
Моя работа GPS - принимать строку X,Y, ... и сохранять (накапливать), решил пока в SDRAM (32Mb) ADSP-BF533 EZ-Kits. Сейчас разбираюсь с SDRAM, EBIU.
Пока наворачивал SDRAM, сломался UART. Сейчас GPS импульсы посылает - прерывания есть, всё нормально.
Но если в прерывании читаю *pUART_RBR всё замирает.
Опять собрал тест Terminal v1.9b <-> ADSP-BF533 EZ-Kits. EZ-Kits принимает от Terminal символы и тут же посылае ему обратно. Когда делал первый раз (вы дали мне Terminal) всё быстро работало. В приёмной части Terminal моментом появлялсь теже символы. Сейчас дикое запаздывание, один символ появляется через секунду или больше. Как бы старался UART не задивать, что случилось - не знаю.
С уважением
badik
bychkov_vladimir
Цитата(badik @ Aug 28 2007, 15:46) *
Gps приемник встраиваемый (это просто чип).
Мой Gps (как мне писали, покупал года 4 назад) TIM-LP Macro-Component
http://www.u-blox.com/products/tim_lp.html

Вскрывал корпус (бокс) на чипе написано:
u-blox
TIMA-C0001-0 (по этому названию данных не нашёл).

С PC GPS работает прекрасно, выдает 1 раз в секунду текущее положение по станд. протоколу NMEA.
Cимвольная строка X,Y, время и т.д. - около сотни символов.
НО почему не работает с ADSP-BF533 EZ-Kits (убивать за такие разработки мало) - та контора, делали бокс и для экономии запитали часть Gps из цепи RS232 - DB9 нога 6, а ADSP-BF533 EZ-Kits она весит в воздухе. Сколько времени потеряли пока нашли. Они сами уже давно забыли.
Моя работа GPS - принимать строку X,Y, ... и сохранять (накапливать), решил пока в SDRAM (32Mb) ADSP-BF533 EZ-Kits. Сейчас разбираюсь с SDRAM, EBIU.
Пока наворачивал SDRAM, сломался UART. Сейчас GPS импульсы посылает - прерывания есть, всё нормально.
Но если в прерывании читаю *pUART_RBR всё замирает.
Опять собрал тест Terminal v1.9b <-> ADSP-BF533 EZ-Kits. EZ-Kits принимает от Terminal символы и тут же посылае ему обратно. Когда делал первый раз (вы дали мне Terminal) всё быстро работало. В приёмной части Terminal моментом появлялсь теже символы. Сейчас дикое запаздывание, один символ появляется через секунду или больше. Как бы старался UART не задивать, что случилось - не знаю.
С уважением
badik



простите за столь поздний ответ. - забегался.
не реагирует на прерывание по RBR - проверяйте флаг наличия данных во входном регистре. просто "покачайтесь" в while на проверку этого флага. - у меня была та же проблема.
тоесть - проверте установку флага DR - если он установлен - читайте данные из регистра приема.
будут проблемы - пишите вышлю свои исходники.
по поводу запаздывания - скорости работы проверяли , они совпадают ?
badik
Благодарю за помощь.
Всётаки мой UART ADSP-BF533 EZ-Kits работает. Как то сам устранился эффект задержки данных от EZ-Kits к Terminal. В плане скоростей всё тоже. Чудеса.
Наложились различные особенности:
1. Terminal v1.9b - символ "$" служебный
Для GPS все данные вида $GPRMC,082519.998,V,5646.9429,N,06033.3812,E,0.00,,050907,,*07
(в конце CR+LF {\n\r}). В ADSP-BF533 EZ-Kits при вводе искал строку "$GPRMC".
Долго разбирался. Terminal использовал как модель GPS, через него можно отправить данные EZ-Kits и получить-увидеть ответ на экране.
2. GPS имеет свои...
Нехватает здорово графического ЖКИ (LCD), всё выводить на экран в самом EZ-Kits - резко упростит отладку. А так в слепую.
У меня есть PG320240D-P5 (Powertip), как я понял LCD можно подключить к EZ-Kits через плату расширения (Blackfin EZ-Extender, разъём P8), она у меня есть. С графическими ЖКИ я не работал.

Думал - выручит ли пока память SDRAM в EZ-Kits, нужно выключать питание? В память сохрнять всё с GPS.
Ну а проблема LCD в прнципе важна, я занимаюсь автономной аппаратурой.
Большая просьба помочь с LCD.
С уважением
badik
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.