avr: new uart_hw2 module comonuart1 works now.
This commit is contained in:
@@ -31,13 +31,20 @@ ComOnUart1_Init:
|
||||
ldi yh, HIGH(comOnUart1_iface)
|
||||
rcall NET_Interface_Init ; (R16, R17, X)
|
||||
ldi r16, 0xff
|
||||
std Y+UART_HW_IFACE_OFFS_WRITEBUFNUM, r16
|
||||
std Y+UART_HW2_IFACE_OFFS_WRITEBUFNUM, r16
|
||||
ldi r16, UART_HW2_MODE_IDLE
|
||||
std Y+UART_HW2_IFACE_OFFS_MODE, r16
|
||||
clr r16
|
||||
std Y+NET_IFACE_OFFS_IFACENUM, r16
|
||||
rcall comOnUart1SetAttnInput
|
||||
|
||||
sbi COM_IRQ_ADDR_ATTN1, COM_IRQ_BIT_ATTN1 ; enable pin change irq for ATTN line
|
||||
inr r16, GIMSK ; enable pin change irq PCIE0 or PCIE1
|
||||
sbr r16, (1<<COM_IRQ_GIMSK_ATTN1)
|
||||
outr GIMSK, r16
|
||||
ldi r16, (1<<COM_IRQ_GIFR_ATTN1) ; clear pending irq by writing 1 to ATTN bit
|
||||
outr GIFR, r16
|
||||
|
||||
; set baudrate
|
||||
.if clock == 8000000
|
||||
ldi r16, 25 ; (19.2Kb/s at 8MHz)
|
||||
@@ -49,12 +56,12 @@ ComOnUart1_Init:
|
||||
ldi r17, 0
|
||||
.endif
|
||||
|
||||
sts UBRR1H, r17
|
||||
sts UBRR1L, r16
|
||||
outr UBRR1H, r17
|
||||
outr UBRR1L, r16
|
||||
|
||||
; set character format
|
||||
ldi r16, (1<<USBS1)|(3<<UCSZ10)
|
||||
sts UCSR1C, r16
|
||||
outr UCSR1C, r16
|
||||
sec
|
||||
ret
|
||||
; @end
|
||||
@@ -138,15 +145,11 @@ comOnUart1StartReading:
|
||||
; @param Y pointer to interface data in SRAM
|
||||
; @param R16 buffer number
|
||||
; @return CFLAG set if writing started, cleared otherwise
|
||||
; @clobbers R16, R17, X, Z (R24, R25)
|
||||
; @clobbers R16, R17, X, Z (R22, R24, R25)
|
||||
|
||||
comOnUart1StartWriting:
|
||||
rcall comOnUart1IsAttnLow ; (none)
|
||||
brcs comOnUart1StartWriting_ebusy
|
||||
; set ATTN low
|
||||
rcall comOnUart1SetAttnLow ; (none)
|
||||
Utils_WaitNanoSecs COM_BIT_LENGTH, 0, r22 ; wait for one bit duration
|
||||
Utils_WaitNanoSecs COM_BIT_LENGTH, 0, r22 ; wait for one bit duration
|
||||
rcall comOnUart1AcquireAttn ; (R22)
|
||||
brcc comOnUart1StartWriting_ebusy
|
||||
; copy buffer
|
||||
rcall NET_Buffer_Locate ; (R17)
|
||||
std Y+UART_HW2_IFACE_OFFS_WRITEBUFNUM, r16
|
||||
@@ -256,7 +259,7 @@ comOnUart1RunIdle:
|
||||
; look for outbound message
|
||||
rcall NET_Interface_PeekNextOutgoingMsgNum ; r16=msgNum
|
||||
brcc comOnUart1RunIdle_end ; no outmsg in queue
|
||||
rcall comOnUart1StartWriting ; (R16, R17, R24, R25, X, Z)
|
||||
rcall comOnUart1StartWriting ; (R16, R17, R22, R24, R25, X, Z)
|
||||
brcc comOnUart1RunIdle_end
|
||||
rcall NET_Interface_GetNextOutgoingMsgNum ; take current msg off the queue
|
||||
comOnUart1RunIdle_end:
|
||||
@@ -298,52 +301,48 @@ comOnUart1RunSkipping_end:
|
||||
; @routine comOnUart1RunMsgReceived
|
||||
;
|
||||
; @param Y pointer to interface data in SRAM
|
||||
; @clobbers R16, R17, R18, X (R19, R20, R24, R25)
|
||||
; @clobbers R16, R17, R18, X, Z (R19, R20, R24, R25)
|
||||
|
||||
comOnUart1RunMsgReceived:
|
||||
push zl
|
||||
push zh
|
||||
mov xl, yl
|
||||
mov xh, yh
|
||||
adiw xh:xl, UART_HW2_IFACE_OFFS_BUFFER
|
||||
mov zl, xl ; Z=buffer in IFACE
|
||||
mov zh, xh
|
||||
rcall NETMSG_CheckMessageInBuffer ; (R16, R17, R18, R19, R20, X)
|
||||
brne comOnUart1RunMsgReceived_econtent
|
||||
; msg valid, alloc buffer
|
||||
rcall NET_Buffer_Alloc ; X=buffer, R16=bufnum (R16, R17, X)
|
||||
brcc comOnUart1RunMsgReceived_enobuf
|
||||
mov r18, r16 ; buffer num
|
||||
rcall NET_Interface_SetIfaceNumInBuffer ; (R16, R17)
|
||||
adiw xh:xl, 1
|
||||
ldd r17, Y+UART_HW2_IFACE_OFFS_BUFUSED ; always is at least 2 here
|
||||
mov xl, yl
|
||||
mov xh, yh
|
||||
adiw xh:xl, UART_HW2_IFACE_OFFS_BUFFER
|
||||
mov zl, xl ; Z=buffer in IFACE
|
||||
mov zh, xh
|
||||
rcall NETMSG_CheckMessageInBuffer ; (R16, R17, R18, R19, R20, X)
|
||||
brcc comOnUart1RunMsgReceived_econtent
|
||||
; msg valid, alloc buffer
|
||||
rcall NET_Buffer_Alloc ; X=buffer, R16=bufnum (R16, R17, X)
|
||||
brcc comOnUart1RunMsgReceived_enobuf
|
||||
mov r18, r16 ; buffer num
|
||||
rcall NET_Interface_SetIfaceNumInBuffer ; (R16, R17)
|
||||
adiw xh:xl, 1
|
||||
ldd r17, Y+UART_HW2_IFACE_OFFS_BUFUSED ; always is at least 2 here
|
||||
comOnUart1RunMsgReceived_copyLoop:
|
||||
ld r16, Z+
|
||||
st X+, r16
|
||||
dec r17
|
||||
brne comOnUart1RunMsgReceived_copyLoop
|
||||
mov r16, r18 ; buffer num
|
||||
rcall NET_AddIncomingMsgNum ; (R17, R18, X)
|
||||
brcc comOnUart1RunMsgReceived_enoadd
|
||||
ldi r16, NET_IFACE_OFFS_PACKETSIN_LOW
|
||||
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
||||
rjmp comOnUart1RunMsgReceived_setIdleAndEnd
|
||||
ld r16, Z+
|
||||
st X+, r16
|
||||
dec r17
|
||||
brne comOnUart1RunMsgReceived_copyLoop
|
||||
mov r16, r18 ; buffer num
|
||||
rcall NET_AddIncomingMsgNum ; (R17, R18, X)
|
||||
brcc comOnUart1RunMsgReceived_enoadd
|
||||
ldi r16, NET_IFACE_OFFS_PACKETSIN_LOW
|
||||
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
||||
rjmp comOnUart1RunMsgReceived_setIdleAndEnd
|
||||
comOnUart1RunMsgReceived_enoadd:
|
||||
rcall NET_Buffer_ReleaseByNum
|
||||
rjmp comOnUart1RunMsgReceived_enobuf
|
||||
rcall NET_Buffer_ReleaseByNum
|
||||
rjmp comOnUart1RunMsgReceived_enobuf
|
||||
comOnUart1RunMsgReceived_enobuf:
|
||||
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
|
||||
rjmp comOnUart1RunMsgReceived_err
|
||||
ldi r16, NET_IFACE_OFFS_ERR_NOBUF_LOW
|
||||
rjmp comOnUart1RunMsgReceived_err
|
||||
comOnUart1RunMsgReceived_econtent:
|
||||
ldi r16, NET_IFACE_OFFS_ERR_CONTENT_LOW
|
||||
ldi r16, NET_IFACE_OFFS_ERR_CONTENT_LOW
|
||||
comOnUart1RunMsgReceived_err:
|
||||
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
||||
rcall NET_Interface_IncCounter16 ; (R24, R25)
|
||||
comOnUart1RunMsgReceived_setIdleAndEnd:
|
||||
ldi r16, UART_HW2_MODE_IDLE
|
||||
rcall comOnUart1SetMode ; (R17)
|
||||
ldi r16, UART_HW2_MODE_IDLE
|
||||
rcall comOnUart1SetMode ; (R17)
|
||||
comOnUart1RunMsgReceived_end:
|
||||
pop zl
|
||||
pop zh
|
||||
ret
|
||||
; @end
|
||||
|
||||
@@ -398,6 +397,30 @@ comOnUart1RunMsgSent:
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine comOnUart1AcquireAttn
|
||||
;
|
||||
; Set ATTN low only if it is high.
|
||||
; @return CFLAG set if ATTN acquired (including waiting time), cleared otherwise
|
||||
;
|
||||
; @clobbers R22
|
||||
|
||||
comOnUart1AcquireAttn:
|
||||
rcall comOnUart1IsAttnLow ; (none)
|
||||
brcc comOnUart1AcquireAttn_isHigh
|
||||
clc
|
||||
rjmp comOnUart1AcquireAttn_end
|
||||
comOnUart1AcquireAttn_isHigh:
|
||||
; set ATTN low
|
||||
rcall comOnUart1SetAttnLow ; (none)
|
||||
Utils_WaitNanoSecs COM_BIT_LENGTH, 0, r22 ; wait for one bit duration
|
||||
Utils_WaitNanoSecs COM_BIT_LENGTH, 0, r22 ; wait for one bit duration
|
||||
sec
|
||||
comOnUart1AcquireAttn_end:
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine comOnUart1StartRx
|
||||
@@ -435,10 +458,10 @@ comOnUart1StopRx:
|
||||
comOnUart1StartTx:
|
||||
lds r16, UCSR1A
|
||||
cbr r16, (1<<TXC1) ; clear TXCn interrupt
|
||||
sts UCSR1A, r16
|
||||
lds r16, UCSR1B
|
||||
outr UCSR1A, r16
|
||||
inr r16, UCSR1B
|
||||
sbr r16, (1<<UDRIE1) | (1<<TXC1) | (1<<TXEN1) ; enable TX UDRE and TXC1 interrupt, enable transceive
|
||||
sts UCSR1B, r16
|
||||
outr UCSR1B, r16
|
||||
ret
|
||||
; @end
|
||||
|
||||
@@ -708,13 +731,11 @@ comOnUart1RxCharIsr:
|
||||
cpi r18, 2
|
||||
brne comOnUart1RxCharIsr_end
|
||||
; determine msg size
|
||||
sbiw xh:xl, 1 ; determine message length (msgLen at previous pos)
|
||||
ld r16, X+ ; read payload length byte
|
||||
subi r16, -4 ; add 4 (buffer header, dest addr, length, crc byte)
|
||||
cpi r16, UART_HW2_BUFFER_SIZE ; total msg length ok?
|
||||
inc r16 ; last byte was payload length, add byte for crc
|
||||
cp r16, r17 ; compare remaining length against remaining space
|
||||
brcc comOnUart1RxCharIsr_emsgsize ; msg too long
|
||||
subi r16, 2 ; subtract bytes already received
|
||||
std Y+UART_HW2_IFACE_OFFS_BUFLEFT, r16 ; set new number of bytes left
|
||||
tst r16
|
||||
brne comOnUart1RxCharIsr_end ; jmp if still bytes left to receive
|
||||
comOnUart1RxCharIsr_complete:
|
||||
rcall comOnUart1StopRx
|
||||
@@ -750,7 +771,7 @@ comOnUart1RxCharIsr_end:
|
||||
|
||||
comOnUart1TxUdreIsr:
|
||||
inr r16, UCSR1A
|
||||
sbrs r16,UDRE1
|
||||
sbrs r16, UDRE1
|
||||
rjmp comOnUart1TxUdreIsr_disable_irq ; not ready
|
||||
; check bytes left
|
||||
ldd r17, Y+UART_HW2_IFACE_OFFS_BUFLEFT
|
||||
@@ -763,7 +784,7 @@ comOnUart1TxUdreIsr:
|
||||
std Y+UART_HW2_IFACE_OFFS_BUFPOS_LOW, xl
|
||||
std Y+UART_HW2_IFACE_OFFS_BUFPOS_HIGH, xh
|
||||
; send byte
|
||||
sts UDR1, r16 ; send byte
|
||||
outr UDR1, r16 ; send byte
|
||||
; decreased counter
|
||||
dec r17
|
||||
std Y+UART_HW2_IFACE_OFFS_BUFLEFT, r17
|
||||
|
||||
Reference in New Issue
Block a user