@@ -37,19 +37,22 @@ impl Serial<UART0> {
37
37
rxpin : PIN < Input < Floating > > ,
38
38
speed : BAUDRATEW ,
39
39
) -> Self {
40
- /* Tell UART which pins to use for sending and receiving */
40
+ // Fill register with dummy data to trigger txd event
41
+ uart. txd . write ( |w| unsafe { w. bits ( 0 ) } ) ;
42
+
43
+ // Set output TXD and RXD pins
41
44
uart. pseltxd
42
45
. write ( |w| unsafe { w. bits ( txpin. get_id ( ) . into ( ) ) } ) ;
43
46
uart. pselrxd
44
47
. write ( |w| unsafe { w. bits ( rxpin. get_id ( ) . into ( ) ) } ) ;
45
48
46
- /* Set baud rate */
49
+ // Set baud rate
47
50
uart. baudrate . write ( |w| w. baudrate ( ) . variant ( speed) ) ;
48
51
49
- /* Enable UART function */
52
+ // Enable UART function
50
53
uart. enable . write ( |w| w. enable ( ) . enabled ( ) ) ;
51
54
52
- /* Fire up transmitting and receiving task */
55
+ // Fire up transmitting and receiving task
53
56
uart. tasks_starttx . write ( |w| unsafe { w. bits ( 1 ) } ) ;
54
57
uart. tasks_startrx . write ( |w| unsafe { w. bits ( 1 ) } ) ;
55
58
@@ -68,16 +71,18 @@ impl Serial<UART0> {
68
71
impl hal:: serial:: Read < u8 > for Rx < UART0 > {
69
72
type Error = Error ;
70
73
71
- fn read ( & mut self ) -> nb:: Result < u8 , Error > {
72
- match unsafe { ( * UART0 :: ptr ( ) ) . events_rxdrdy . read ( ) . bits ( ) } {
74
+ fn read ( & mut self ) -> nb:: Result < u8 , Self :: Error > {
75
+ let uart = unsafe { & * UART0 :: ptr ( ) } ;
76
+ match uart. events_rxdrdy . read ( ) . bits ( ) {
73
77
0 => Err ( nb:: Error :: WouldBlock ) ,
74
78
_ => {
75
- /* We're going to pick up the data soon, let's signal the buffer is already waiting for
76
- * more data */
77
- unsafe { ( * UART0 :: ptr ( ) ) . events_rxdrdy . write ( |w| w. bits ( 0 ) ) } ;
79
+ // Read one 8bit value
80
+ let byte = uart. rxd . read ( ) . bits ( ) as u8 ;
81
+
82
+ // Reset ready for receive event
83
+ unsafe { uart. events_rxdrdy . write ( |w| w. bits ( 0 ) ) } ;
78
84
79
- /* Read one 8bit value */
80
- Ok ( unsafe { ( * UART0 :: ptr ( ) ) . rxd . read ( ) . bits ( ) } as u8 )
85
+ Ok ( byte)
81
86
}
82
87
}
83
88
}
@@ -86,19 +91,24 @@ impl hal::serial::Read<u8> for Rx<UART0> {
86
91
impl hal:: serial:: Write < u8 > for Tx < UART0 > {
87
92
type Error = !;
88
93
89
- fn flush ( & mut self ) -> nb:: Result < ( ) , ! > {
94
+ fn flush ( & mut self ) -> nb:: Result < ( ) , Self :: Error > {
90
95
Ok ( ( ) )
91
96
}
92
97
93
- fn write ( & mut self , byte : u8 ) -> nb:: Result < ( ) , !> {
94
- /* Write one 8bit value */
95
- unsafe { ( * UART0 :: ptr ( ) ) . txd . write ( |w| w. bits ( u32:: from ( byte) ) ) }
98
+ fn write ( & mut self , byte : u8 ) -> nb:: Result < ( ) , Self :: Error > {
99
+ let uart = unsafe { & * UART0 :: ptr ( ) } ;
100
+ // Are we ready for sending out next byte?
101
+ if uart. events_txdrdy . read ( ) . bits ( ) == 1 {
102
+ // Send byte
103
+ uart. txd . write ( |w| unsafe { w. bits ( u32:: from ( byte) ) } ) ;
96
104
97
- /* Wait until written ... */
98
- while unsafe { ( * UART0 :: ptr ( ) ) . events_txdrdy . read ( ) . bits ( ) } == 0 { }
105
+ // Reset ready for transmit event
106
+ uart . events_txdrdy . reset ( ) ;
99
107
100
- /* ... and clear read bit, there's no other way this will work */
101
- unsafe { ( * UART0 :: ptr ( ) ) . events_txdrdy . write ( |w| w. bits ( 0 ) ) } ;
102
- Ok ( ( ) )
108
+ Ok ( ( ) )
109
+ } else {
110
+ // We're not ready, tell application to try again
111
+ Err ( nb:: Error :: WouldBlock )
112
+ }
103
113
}
104
114
}
0 commit comments