Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Erik Strand
lufa
Commits
036a156f
Commit
036a156f
authored
Jun 12, 2010
by
Dean Camera
Browse files
Slight improvements to the reliability of the software UART in the XPLAINBridge project.
parent
931ca42a
Changes
3
Hide whitespace changes
Inline
Side-by-side
LUFA/Drivers/USB/Class/Device/CDC.c
View file @
036a156f
...
...
@@ -154,7 +154,7 @@ uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
Endpoint_SelectEndpoint
(
CDCInterfaceInfo
->
Config
.
DataINEndpointNumber
);
if
(
!
(
Endpoint_IsReadWriteAllowed
()))
{
{
Endpoint_ClearIN
();
uint8_t
ErrorCode
;
...
...
Projects/XPLAINBridge/Lib/SoftUART.c
View file @
036a156f
...
...
@@ -63,41 +63,38 @@ void SoftUART_Init(void)
EICRA
=
(
1
<<
ISC01
);
EIMSK
=
(
1
<<
INT0
);
/* Ensure that when the timer is enabled the transmission ISR runs immediately */
OCR1B
=
TCNT1
+
1
;
/* Start timer 1 with transmission channel force-enabled so that it will immediatly fire */
TCCR1C
=
(
1
<<
FOC1B
);
TIMSK1
=
(
1
<<
OCIE1B
);
/* Start software UART transmission and reception timers */
TIMSK3
=
(
1
<<
OCIE3A
);
TCCR3B
=
(
1
<<
CS30
);
TCCR1B
=
(
1
<<
CS10
);
}
/** ISR to detect the start of a bit being sent to the software UART. */
ISR
(
INT0_vect
)
ISR
(
INT0_vect
,
ISR_BLOCK
)
{
/* Set reception channel to fire 1.5 bits past the beginning of the start bit */
OCR1A
=
TCNT1
+
(
(
BIT_TIME
*
3
)
/
2
);
OCR1A
=
TCNT1
+
(
BIT_TIME
+
(
BIT_TIME
/
2
)
)
;
/* Clear the received data temporary variable, reset the current received bit position mask */
RX_Data
=
0
;
RX_BitMask
=
(
1
<<
0
);
/* Clear reception channel ISR flag in case it is pending */
TIFR1
=
(
1
<<
OCF1A
);
/* Check that the start bit is still low to prevent noise from triggering a reception */
if
(
!
(
SRXPIN
&
(
1
<<
SRX
)))
{
/* Still low, enable both send and receive channels */
TIMSK1
=
(
1
<<
OCIE1A
)
|
(
1
<<
OCIE1B
);
/* Clear the start bit detection ISR flag if it is pending */
{
/* Clear reception channel ISR flag in case it is pending */
TIFR1
=
(
1
<<
OCF1A
);
/* Still low, enable bit receive ISR */
TIMSK1
=
(
1
<<
OCIE1A
);
/* Clear the start bit detection ISR flag */
EIMSK
&=
~
(
1
<<
INT0
);
}
}
/** ISR to manage the reception of bits to the software UART. */
ISR
(
TIMER1_COMPA_vect
)
ISR
(
TIMER1_COMPA_vect
,
ISR_BLOCK
)
{
/* Move the reception ISR compare position one bit ahead */
OCR1A
+=
BIT_TIME
;
...
...
@@ -118,17 +115,17 @@ ISR(TIMER1_COMPA_vect)
RingBuffer_Insert
(
&
UARTtoUSB_Buffer
,
RX_Data
);
/* Disable the reception ISR as all data has now been received, re-enable start bit detection ISR */
TIMSK1
=
(
1
<<
OCIE1B
)
;
EI
MSK
|
=
(
1
<<
INT0
);
EI
FR
=
(
1
<<
INT
F
0
);
TIMSK1
=
0
;
EI
FR
=
(
1
<<
INT
F
0
);
EI
MSK
=
(
1
<<
INT0
);
}
}
/** ISR to manage the transmission of bits via the software UART. */
ISR
(
TIMER
1
_COMP
B
_vect
)
ISR
(
TIMER
3
_COMP
A
_vect
,
ISR_NOBLOCK
)
{
/* Move the transmission ISR compare position one bit ahead */
OCR
1B
+=
BIT_TIME
;
OCR
3A
+=
BIT_TIME
;
/* Check if transmission has finished */
if
(
TX_BitsRemaining
)
...
...
Projects/XPLAINBridge/XPLAINBridge.c
View file @
036a156f
...
...
@@ -151,7 +151,7 @@ void SetupHardware(void)
LEDs_Init
();
USB_Init
();
V2Protocol_Init
();
/* Disable JTAG debugging */
MCUCR
|=
(
1
<<
JTD
);
MCUCR
|=
(
1
<<
JTD
);
...
...
@@ -166,6 +166,8 @@ void SetupHardware(void)
/* Re-enable JTAG debugging */
MCUCR
&=
~
(
1
<<
JTD
);
MCUCR
&=
~
(
1
<<
JTD
);
CurrentFirmwareMode
=
MODE_USART_BRIDGE
;
// TEMP
}
/** Event handler for the library USB Configuration Changed event. */
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment