avr: more work on hardware based uart module.
This commit is contained in:
@@ -20,8 +20,7 @@
|
||||
|
||||
UART_HW_Uart1_StartRx:
|
||||
lds r16, UCSR1B
|
||||
sbr r16, (1<<RXCIE1) ; enable RX complete interrupt
|
||||
sbr r16, (1<<RXEN1) ; enable receive
|
||||
sbr r16, (1<<RXCIE1) | (1<<RXEN1) ; enable RX complete interrupt, enable receive
|
||||
sts UCSR1B, r16
|
||||
ret
|
||||
; @end
|
||||
@@ -35,8 +34,7 @@ UART_HW_Uart1_StartRx:
|
||||
|
||||
UART_HW_Uart1_StopRx:
|
||||
lds r16, UCSR1B
|
||||
cbr r16, (1<<RXCIE1) ; disable RX complete interrupt
|
||||
cbr r16, (1<<RXEN1) ; disable receive
|
||||
cbr r16, (1<<RXCIE1 | (1<<RXEN1)) ; disable RX complete interrupt, disable receive
|
||||
sts UCSR1B, r16
|
||||
ret
|
||||
; @end
|
||||
@@ -51,8 +49,7 @@ UART_HW_Uart1_StopRx:
|
||||
|
||||
UART_HW_Uart1_StartTx:
|
||||
lds r16, UCSR1B
|
||||
sbr r16, (1<<UDRIE1) ; enable TX data register empty interrupt
|
||||
sbr r16, (1<<TXEN1) ; enable transceive
|
||||
sbr r16, (1<<UDRIE1) | (1<<TXEN1) ; enable TX data register empty interrupt, enable transceive
|
||||
sts UCSR1B, r16
|
||||
ret
|
||||
; @end
|
||||
@@ -67,8 +64,7 @@ UART_HW_Uart1_StartTx:
|
||||
|
||||
UART_HW_Uart1_StopTx:
|
||||
lds r16, UCSR1B
|
||||
cbr r16, (1<<UDRIE1) ; disable TX data register empty interrupt
|
||||
cbr r16, (1<<TXEN1) ; disable transceive
|
||||
cbr r16, (1<<UDRIE1) | (1<<TXEN1) ; disable TX data register empty interrupt, disable transceive
|
||||
sts UCSR1B, r16
|
||||
ret
|
||||
; @end
|
||||
@@ -82,22 +78,22 @@ UART_HW_Uart1_StopTx:
|
||||
; @clobbers R16 (R17, R18, X)
|
||||
|
||||
UART_HW_Uart1_RxCharIsr:
|
||||
in r16, UCSR1A ; check for errors
|
||||
lds r16, UCSR1A ; check for errors
|
||||
andi r16, (1<<FE1) | (1<<DOR1) | (1<<UPE1)
|
||||
breq UART_HW_Uart1_RxCharIsr_recv
|
||||
ldd r16, Y+UART_HW_IFACE_OFFS_STATUS
|
||||
ori r16, UART_HW_STATUS_HWERR
|
||||
std Y+UART_HW_IFACE_OFFS_STATUS, r16
|
||||
rjmp UART_HW_Uart1_RxCharIsr_end
|
||||
breq UART_HW_Uart1_RxCharIsr_recv ; no error, receive next char
|
||||
ldd r16, Y+UART_HW_IFACE_OFFS_STATUS ; set error status
|
||||
ori r16, UART_HW_STATUS_HWERR ; -> HWERR
|
||||
rjmp UART_HW_Uart1_RxCharIsr_setStatusAndEnd
|
||||
UART_HW_Uart1_RxCharIsr_recv:
|
||||
lds r16, UCSR1A
|
||||
sbrs r16, RXC1
|
||||
rjmp UART_HW_Uart1_RxCharIsr_end ; no data
|
||||
rjmp UART_HW_Uart1_RxCharIsr_end ; no data
|
||||
lds r16, UDR1
|
||||
rcall UART_HW_InterfaceWriteToReadBuffer ; (R17, R18, X)
|
||||
rcall UART_HW_InterfaceWriteToReadBuffer ; (R17, R18, X)
|
||||
brcs UART_HW_Uart1_RxCharIsr_end
|
||||
ldd r16, Y+UART_HW_IFACE_OFFS_STATUS ; set overrun error
|
||||
ori r16, UART_HW_STATUS_OVERRUN
|
||||
ldd r16, Y+UART_HW_IFACE_OFFS_STATUS ; set overrun error
|
||||
ori r16, UART_HW_STATUS_OVERRUN ; -> OVERRUN
|
||||
UART_HW_Uart1_RxCharIsr_setStatusAndEnd:
|
||||
std Y+UART_HW_IFACE_OFFS_STATUS, r16
|
||||
UART_HW_Uart1_RxCharIsr_end:
|
||||
ret
|
||||
|
||||
Reference in New Issue
Block a user