|
| Programmering af UART 16550 Fra : Preben Holm |
Dato : 09-12-04 21:26 |
|
Hej gruppe,
jeg forstår ikke helt funktionsmodellen af transmit FIFO'en i 16550
UART'en. Jeg har prøvet flere forskellige metoder, men ingen af dem
fungerer.
Jeg ønsker at anvende UART'en i polled mode, men desværre giver dette
nogle problemer når jeg samtidig ønsker at anvende FIFO'en for
transmittering?
Kan det passe at man kun kan tjekke om FIFO'en faktisk er tom eller at
der er overflow?
Det jeg ønsker er, at tjekke om der er plads i FIFO'en inden jeg skriver
- altså, at undgå et overflow (for hvilke data slettes så?), men stadig
anvende UART'en uden at skulle anvende interrupts!
Indtil videre har jeg prøvet med bit 5 og 6 i LSR (Line Status
Registeret), men intet virker!
På forhånd tak for hjælpen!
Med venlig hilsen
Preben Holm
| |
Bertel Brander (09-12-2004)
| Kommentar Fra : Bertel Brander |
Dato : 09-12-04 23:07 |
|
Preben Holm wrote:
> Indtil videre har jeg prøvet med bit 5 og 6 i LSR (Line Status
> Registeret), men intet virker!
>
På: http://byterunner.com/16550.html står der netop:
LSR BIT 5:
0 = transmit holding register is full. 16550 will not accept any
data for transmission.
1 = transmitter hold register (or FIFO) is empty. CPU can load the
next character.
Så du burde blot kunne bruge bit 5 til at checke om du kan skrive
den næste karakter til FIFO'en
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Preben Holm (10-12-2004)
| Kommentar Fra : Preben Holm |
Dato : 10-12-04 22:10 |
|
>> Indtil videre har jeg prøvet med bit 5 og 6 i LSR (Line Status
>> Registeret), men intet virker!
>>
>
> På: http://byterunner.com/16550.html står der netop:
>
> LSR BIT 5:
> 0 = transmit holding register is full. 16550 will not accept any
> data for transmission.
> 1 = transmitter hold register (or FIFO) is empty. CPU can load the
> next character.
Synes ikke rigtig det virker! Nå, jeg vil prøve igen!
Mvh / Preben Holm
| |
Preben Holm (11-12-2004)
| Kommentar Fra : Preben Holm |
Dato : 11-12-04 11:51 |
|
Preben Holm wrote:
>>> Indtil videre har jeg prøvet med bit 5 og 6 i LSR (Line Status
>>> Registeret), men intet virker!
>>>
>>
>> På: http://byterunner.com/16550.html står der netop:
>>
>> LSR BIT 5:
>> 0 = transmit holding register is full. 16550 will not accept any
>> data for transmission.
>> 1 = transmitter hold register (or FIFO) is empty. CPU can load the
>> next character.
>
>
> Synes ikke rigtig det virker! Nå, jeg vil prøve igen!
Problemet er, at bare der er en byte overført til UART'en vil registeret
ændre sig og overflow bitten er den eneste ændring der sker, når man
overfylder FIFO'en. Det virker som om, at "transmitter hold register" er
fuldt så snart der ligger noget i FIFO'en. Test viser, at vi sagtens kan
overføre de der 16byte til FIFO'en uden problemer, men vi kan bare ikke
teste på om der faktisk ligger 'X' eller 16 byte i FIFO'en.
| |
Bertel Brander (11-12-2004)
| Kommentar Fra : Bertel Brander |
Dato : 11-12-04 20:58 |
|
Preben Holm wrote:
> Problemet er, at bare der er en byte overført til UART'en vil registeret
> ændre sig og overflow bitten er den eneste ændring der sker, når man
> overfylder FIFO'en. Det virker som om, at "transmitter hold register" er
> fuldt så snart der ligger noget i FIFO'en. Test viser, at vi sagtens kan
> overføre de der 16byte til FIFO'en uden problemer, men vi kan bare ikke
> teste på om der faktisk ligger 'X' eller 16 byte i FIFO'en.
Jeg er ikke sikker på at jeg forstår ovenstående.
Jeg tror ikke at man kan teste hvor mange bytes der
ligger i FIFO bufferen, man burde kunne fylde på
så længe transmit holding register er sat.
--
"We learned more from a three minute record, baby
than we ever learned in school"
- Bruce Springsteen
| |
Preben Holm (12-12-2004)
| Kommentar Fra : Preben Holm |
Dato : 12-12-04 00:25 |
|
> Jeg er ikke sikker på at jeg forstår ovenstående.
>
> Jeg tror ikke at man kan teste hvor mange bytes der
> ligger i FIFO bufferen, man burde kunne fylde på
> så længe transmit holding register er sat.
Ja, jeg er enig i, at man _burde_ kunne.
| |
Preben Holm (12-12-2004)
| Kommentar Fra : Preben Holm |
Dato : 12-12-04 00:36 |
|
> Jeg tror ikke at man kan teste hvor mange bytes der
> ligger i FIFO bufferen, man burde kunne fylde på
> så længe transmit holding register er sat.
void write_uart(char val)
{
char i;
while (!(inportb(UART_LSR) & 0x10)) {
syscall(S_OUT, NULL, NULL); // vent på plads i fifo
}
outportb(UART_DATA, val);
}
hvis ovenstående kode anvendes går det galt.
de data der skrives til UART foregår enkeltvis - afsendelse foregår
meget langsommere når der scheduleres væk (syscall(S_OUT, NULL, NULL))
mellem afsendelse.
Der burde komme pulser af data, hvis det skyldtes, at der var for mange
processer, som optager for meget CPU-tid indtil de næste data kunne
sendes. Desværre viser det sig, at data sendes meget langsommere i
forhold til koden:
void write_uart(char val)
{
char i;
while (!(inportb(UART_LSR) & 0x10));
outportb(UART_DATA, val);
}
Første kode sender hver byte langsomt, mens anden kode sender alle byte
utrolig hurtigt. Der kommer ingen pulser pga. FIFO-størrelse i nogen af
tilfældende.
Desuden har vi læst LSR registeret - det ændrer sig ikke efter 1 byte
skrevet til 14 byte skrevet. Først når der kommer overflow ved den
17'ende byte.
Desuden angiver bit 5 kun når FIFO er helt tom - alternativt kunne man
jo skrive i pulser, men det er ikke så praktisk!
Mvh / Preben Holm
| |
|
|