@@ -56,20 +56,12 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
56
56
obj -> uart = (NRF_UART_Type * )uart ;
57
57
58
58
//pin configurations --
59
- //outputs
60
59
NRF_GPIO -> DIR |= (1 << tx ); //TX_PIN_NUMBER);
61
60
NRF_GPIO -> DIR |= (1 << RTS_PIN_NUMBER );
62
61
63
62
NRF_GPIO -> DIR &= ~(1 << rx ); //RX_PIN_NUMBER);
64
63
NRF_GPIO -> DIR &= ~(1 << CTS_PIN_NUMBER );
65
64
66
- obj -> uart -> PSELRTS = RTS_PIN_NUMBER ;
67
- obj -> uart -> PSELTXD = tx ; //TX_PIN_NUMBER;
68
-
69
- //inputs
70
- obj -> uart -> PSELCTS = CTS_PIN_NUMBER ;
71
- obj -> uart -> PSELRXD = rx ; //RX_PIN_NUMBER;
72
-
73
65
74
66
// set default baud rate and format
75
67
serial_baud (obj , 9600 );
@@ -79,8 +71,16 @@ void serial_init(serial_t *obj, PinName tx, PinName rx) {
79
71
obj -> uart -> TASKS_STARTTX = 1 ;
80
72
obj -> uart -> TASKS_STARTRX = 1 ;
81
73
obj -> uart -> EVENTS_RXDRDY = 0 ;
74
+ // dummy write needed or TXDRDY trails write rather than leads write.
75
+ // pins are disconnected so nothing is physically transmitted on the wire
76
+ obj -> uart -> TXD = 0 ;
82
77
83
78
obj -> index = 0 ;
79
+
80
+ obj -> uart -> PSELRTS = RTS_PIN_NUMBER ;
81
+ obj -> uart -> PSELTXD = tx ; //TX_PIN_NUMBER;
82
+ obj -> uart -> PSELCTS = CTS_PIN_NUMBER ;
83
+ obj -> uart -> PSELRXD = rx ; //RX_PIN_NUMBER;
84
84
85
85
// set rx/tx pins in PullUp mode
86
86
if (tx != NC ) {
@@ -194,24 +194,27 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
194
194
if (enable ) {
195
195
switch (irq ) {
196
196
case RxIrq :
197
- obj -> uart -> INTENSET |= (UART_INTENSET_RXDRDY_Msk );
197
+ obj -> uart -> INTEN |= (UART_INTENSET_RXDRDY_Msk );
198
198
break ;
199
199
case TxIrq :
200
- obj -> uart -> INTENSET |= (UART_INTENSET_TXDRDY_Msk );
200
+ obj -> uart -> INTEN |= (UART_INTENSET_TXDRDY_Msk );
201
201
break ;
202
202
}
203
203
NVIC_SetPriority (irq_n , 3 );
204
204
NVIC_EnableIRQ (irq_n );
205
205
} else { // disable
206
+ // maseked writes to INTENSET dont disable and masked writes to
207
+ // INTENCLR seemed to clear the entire register, not bits.
208
+ // Added INTEN to memory map and seems to allow set and clearing of specific bits as desired
206
209
int all_disabled = 0 ;
207
210
switch (irq ) {
208
211
case RxIrq :
209
- obj -> uart -> INTENSET &= ~(UART_INTENSET_RXDRDY_Msk );
210
- all_disabled = (obj -> uart -> INTENSET & (UART_INTENSET_TXDRDY_Msk )) == 0 ;
212
+ obj -> uart -> INTEN &= ~(UART_INTENCLR_RXDRDY_Msk );
213
+ all_disabled = (obj -> uart -> INTENCLR & (UART_INTENCLR_TXDRDY_Msk )) == 0 ;
211
214
break ;
212
215
case TxIrq :
213
- obj -> uart -> INTENSET &= ~(UART_INTENSET_TXDRDY_Msk );
214
- all_disabled = (obj -> uart -> INTENSET & (UART_INTENSET_RXDRDY_Msk )) == 0 ;
216
+ obj -> uart -> INTEN &= ~(UART_INTENCLR_TXDRDY_Msk );
217
+ all_disabled = (obj -> uart -> INTENCLR & (UART_INTENCLR_RXDRDY_Msk )) == 0 ;
215
218
break ;
216
219
}
217
220
@@ -236,12 +239,11 @@ int serial_getc(serial_t *obj)
236
239
237
240
void serial_putc (serial_t * obj , int c )
238
241
{
239
- obj -> uart -> TXD = (uint8_t )c ;
240
-
241
242
while (!serial_writable (obj )) {
242
243
}
243
244
244
245
obj -> uart -> EVENTS_TXDRDY = 0 ;
246
+ obj -> uart -> TXD = (uint8_t )c ;
245
247
}
246
248
247
249
int serial_readable (serial_t * obj )
@@ -251,7 +253,7 @@ int serial_readable(serial_t *obj)
251
253
252
254
int serial_writable (serial_t * obj )
253
255
{
254
- return (obj -> uart -> EVENTS_TXDRDY == 1 );
256
+ return (obj -> uart -> EVENTS_TXDRDY == 1 );
255
257
}
256
258
257
259
void serial_break_set (serial_t * obj )
0 commit comments