Проблема с COM-портом на Octagonе |
Ответить |
Автор | |
Новичок Присоединился: 28 Март 2006 Категория: Belarus Online Status: Offline Публикации: 8 |
Опубликовано: 28 Март 2006 18:35 |
Есть проблемка с о связью через СОМ-порт на плате Octagon 5070. Может кто знает, какие там нюансы. На Fastwel CPU686E работает
|
|
Участник Присоединился: 18 Ноябрь 2005 Категория: Russian Federation Online Status: Offline Публикации: 54 |
|
Какого рода проблема? Какое ПО: на C++, SCADA или еще
на чем нибудь? В некоторых BIOSах (мы сталкивались) по умолчанию не инициализируется буфер FIFO контроллера UART (задизаблен). Нужно включить. Но это если вы мучаетесь на C++ и под DOS (свои исходники для работы с COM-портом). |
|
Новичок Присоединился: 28 Март 2006 Категория: Belarus Online Status: Offline Публикации: 8 |
|
Н...да. Именно на С++ и именно под DOS. А как этот буфер включить?
|
|
Участник Присоединился: 18 Ноябрь 2005 Категория: Russian Federation Online Status: Offline Публикации: 54 |
|
Вот пример инициализации COM-порта:
#define PORT1 0x3F8 #define INTVECT1 0xC #define PORT2 0x2F8 #define INTVECT2 0xB void InstallCom1(long baud,int nbit,int parity,int stopbit) { outp(PORT1+1,0); //запрещаем прерывания от UART oldvectCom1 = _dos_getvect(INTVECT1); //получаем старый вектор прерывания _dos_setvect(INTVECT1,SerialISR1); //устанавливаем новый вектор прерывания outp(PORT1+3,0x80); //устанавливаем режим загрузки делителя //скорость передачи switch( baud ) { case 110L: baud = BR_110; break; case 150L: baud = BR_150; break; case 300L: baud = BR_300; break; case 600L: baud = BR_600; break; case 1200L: baud = BR_1200; break; case 2400L: baud = BR_2400; break; case 4800L: baud = BR_4800; break; case 9600L: baud = BR_9600; break; case 19200L: baud = BR_19200; break; case 38400L: baud = BR_38400; break; case 57600L: baud = BR_57600; break; case 115200L: baud = BR_115200; break; default: baud = BR_9600; } outp(PORT1+0, baud & 0xFF ); //загружаем младший байт делителя outp(PORT1+1,baud>>8); //загружаем старший байт делителя //кол-во бит switch( nbit ) { case 5: nbit = bit_5; break; case 6: nbit = bit_6; break; case 7: nbit = bit_7; break; case 8: nbit = bit_8; break; default: nbit = bit_8; }; //четность switch( parity ) { case 0: parity = NoParity; break; case 1: parity = Odd; break; case 2: parity = Even; break; default: parity = NoParity; }; //стоп-биты switch( stopbit ) { case 1: stopbit = OneStopBit; break; case 2: stopbit = TwoStopBit; break; default: stopbit = OneStopBit; }; outp(PORT1+3,nbit|parity|stopbit); //настраиваем формат передачи: кол-во бит/паритет/стоп-бит outp(PORT1+2,0x07); //буфер FIFO - 1 байт, включаем буфер outp(PORT1+4,0x0B); //устанавливаем линии RTS, DTR, OUT1 outp(0x21,inp(0x21)&0xEF); //настраиваем регистр маски прерываний контроллера прер-й outp(PORT1+1,0x01); //разрешаем контроллеру UART прерывание по приему байта }; Или второй вариант (не моё, идет на компашке вместе с I-7188): #define Txbuf 0x00 /* tx buffer */ #define Rxbuf 0x00 /* rx buffer */ #define Dll 0x00 /* baud lsb */ #define Dlh 0x01 /* baud msb */ #define Ier 0x01 /* int enable reg */ #define Fcr 0x02 /* FIFO control register */ #define Iir 0x02 /* Interrupt Identification Register */ #define Lcr 0x03 /* line control reg */ #define Dfr 0x03 /* Data format reg */ #define Mcr 0x04 /* modem control reg */ #define Lsr 0x05 /* line status reg */ int InstallCom(int iPort,unsigned long lBaudRate,int iData,int iParity,int iStop) { int uart,i; char ratehi,ratelo; int cc; int far *ComBase=(int far *)0x00400000L; switch(iPort) { case 1 : if(OldIntVect1) RestoreCom(1); iBase1=ComBase[0]; return InstallCom1(lBaudRate,iData,iParity,iStop); case 2 : if(OldIntVect2) RestoreCom(2); iBase2=ComBase[1]; return InstallCom2(lBaudRate,iData,iParity,iStop); default: printf("Error:PortError,(iPort=%d)",iPort); getch(); return PortError; /* port must 1/2 */ } } int InstallCom1(unsigned long baud, int data, int parity, int stop) { int cc; err1=0; cc=GetBaudData(baud,data,parity,stop); if(cc) return cc; /* _asm cli */ disable(); save232[0][2]=inp(iBase1+Lcr); /* format */ outp(iBase1+Lcr,0x80); /* 1 set DLAB (baud rate) */ save232[0][0]=inp(iBase1+Dll); /* baud rate */ save232[0][1]=inp(iBase1+Dlh); outp(iBase1+Dll,ratelo); outp(iBase1+Dlh,ratehi); outp(iBase1+Lcr,format); /* 2. data format */ save232[0][3]=inp(iBase1+Ier); /* interrupt status*/ outp(iBase1+Fcr, 0x87); /* 3. enable & clear FIFO */ outp(iBase1+Ier, 0x01); /* 4. enable COM1 interrupt */ outp(iBase1+Mcr,0x0b); /* set DTR line active */ In_InIdx1=In_OutIdx1=Out_InIdx1=Out_OutIdx1=0; /* 5. init QUEUE */ OldIntVect1=IntVect[12]; /* save old ISR */ IntVect[12]=(unsigned long)Serial1_Isr; /* install new ISR */ outp(0x21,inp(0x21) & 0xef); /* enable IRQ 4 for COM1 */ /*_asm sti */ enable(); return(NoError); } Если нужно, могу скинуть полные исходники по e-mail. |
|
Новичок Присоединился: 28 Март 2006 Категория: Belarus Online Status: Offline Публикации: 8 |
|
скинь пожалуйста, заранее очень благодарен.
Nick.Klubnikov@tut.by |
|
Ответить |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |