Pokouším se zprovoznit NXP SC16C550 u ZX Spectra a nedaří se mi. Zdá se, že ten čip nastavuju špatně. (neplést se SIFem, v SIFu je 16C650, ne 16C550 jak jsem párkrát mylně psal)
Resp. funguje mi nastavení baudrate, stop bitů, parity... čip vysílá jak má. Dokonce se mi daří přijímat data pokud na vysílací straně nenastavím řízení toku dat pomocí RTS CTS. Jakmile to nastavím, tak 16C550 nepřijímá, resp. drží trvale RTS v log. 1 (záporné napětí na RS232 straně) a tím brání vysílači (PC) vysílat.
Koukám do dvou různých datasheetů (od NXP i k Exar ST16C550) a nenacházím, co dělám špatně. Z nějakého důvodu se mi v 16C550 neuplatní interní FIFO a nefunguje automatické řízení toku dat.
Nějaký nápad?
Zkouším to takto:
Kód:
cpu z80undoc
org 32768
BASEADR equ 131
RHR equ BASEADR ; IN - Receive Holding Register
THR equ BASEADR ; OUT - Transmit Holding Register
IER equ BASEADR+4 ; IO - Interrupt Enable Register
ISR equ BASEADR+8 ; IN - Interrupt Status Register
FCR equ BASEADR+8 ; OUT - FIFO Control Register
LCR equ BASEADR+12 ; IO - Line Control Register
MCR equ BASEADR+16 ; IO - Modem Control Register
LSR equ BASEADR+20 ; IN - Line Status Register
MSR equ BASEADR+24 ; IN - Modem Status Register
SPR equ BASEADR+24 ; IO - Scratch Pad Register
DLL equ BASEADR ; OUT - lower byte of Divisor Latch
DLM equ BASEADR+4 ; OUT - higher byte of Divisor Latch
ld a,10000000b ; [7] divisor latch enabled
out (LCR),a
ld a,4 ; 460800/115200bps = 4
out (DLL),a
ld a,0
out (DLM),a
ld a,00000011b ; no divisor latch, no parity, 1 stop bit, 8bit word
out (LCR),a
ld a,11000000b ; [7:6] FIFOs enabled, [3:0] no interrupts
out (ISR),a
ld a,00000111 ; [3] no DMA, [2:1] FIFO reset, [0] FIFO enable = polled mode?
out (FCR),a
LOOP xor a
in a,(LSR) ; read Line Status Register
and 01000000b
jr z,BUFFULL ; Z = cannot send, buffer is full
ld a,'a'
out (THR),a ; write to Transmit Holding Register
BUFFULL xor a
in a,(LSR) ; read Line Status Register
and 00000001b ; check Receive data ready bit, 1 = data received
jr z,NO_DATA
in a,(RHR) ; read Receive Holding Register
ld hl,16384
ld (hl),a
and 00000111b
out (254),a
ei ; limit 50 chars/s
halt
NO_DATA call 8020 ; break?
jr c,LOOP ; C = break is not pressed
ret
_________________
https://cygnus.speccy.cz ZX Spectrum 128k, Betadisk, DivIDE, ESXDOS