Not work original Lib on F446RE & L432KC . Change usage prime() & setNext() for both TX and RX function due to unexpected behavior (maybe os TimerEvent function problem)
Dependents: BufferedSoftSerial
SoftSerial_rx.cpp@13:6399b30798a5, 2020-05-12 (annotated)
- Committer:
- kenjiArai
- Date:
- Tue May 12 05:27:07 2020 +0000
- Revision:
- 13:6399b30798a5
- Parent:
- 12:cd58d03b8559
expand for several CPU's.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kenjiArai | 13:6399b30798a5 | 1 | // Modified by K.Arai / JH1PJL May 12th, 2020 |
kenjiArai | 12:cd58d03b8559 | 2 | |
Sissors | 0:8edaa7abe724 | 3 | #include "SoftSerial.h" |
Sissors | 0:8edaa7abe724 | 4 | |
kenjiArai | 13:6399b30798a5 | 5 | //------------------------------------------------------------------------------ |
kenjiArai | 13:6399b30798a5 | 6 | #if defined(TARGET_NUCLEO_L152RE) |
kenjiArai | 13:6399b30798a5 | 7 | # define MAGIC_NUM (-560) |
kenjiArai | 13:6399b30798a5 | 8 | #elif defined(TARGET_NUCLEO_F401RE) |
kenjiArai | 13:6399b30798a5 | 9 | # define MAGIC_NUM (-205) |
kenjiArai | 13:6399b30798a5 | 10 | #elif defined(TARGET_NUCLEO_F411RE) |
kenjiArai | 13:6399b30798a5 | 11 | # define MAGIC_NUM (-180) |
kenjiArai | 13:6399b30798a5 | 12 | #elif defined(TARGET_NUCLEO_F446RE) |
kenjiArai | 13:6399b30798a5 | 13 | # define MAGIC_NUM (-115) |
kenjiArai | 13:6399b30798a5 | 14 | #elif defined(TARGET_NUCLEO_L432KC) |
kenjiArai | 13:6399b30798a5 | 15 | # define MAGIC_NUM (-50) |
kenjiArai | 13:6399b30798a5 | 16 | #elif defined(TARGET_NUCLEO_L476RG) |
kenjiArai | 13:6399b30798a5 | 17 | # define MAGIC_NUM (-50) |
kenjiArai | 13:6399b30798a5 | 18 | #elif defined(TARGET_K64F) |
kenjiArai | 13:6399b30798a5 | 19 | # define MAGIC_NUM (0) |
kenjiArai | 13:6399b30798a5 | 20 | #else |
kenjiArai | 13:6399b30798a5 | 21 | # warning "you need to tune MAGIC_NUM! in SoftSerial_rx.cpp" |
kenjiArai | 13:6399b30798a5 | 22 | # define MAGIC_NUM (0) |
kenjiArai | 13:6399b30798a5 | 23 | #endif |
kenjiArai | 13:6399b30798a5 | 24 | //------------------------------------------------------------------------------ |
kenjiArai | 13:6399b30798a5 | 25 | |
kenjiArai | 13:6399b30798a5 | 26 | |
kenjiArai | 12:cd58d03b8559 | 27 | // please make a constructor in main.cpp if you use below pc & led |
kenjiArai | 12:cd58d03b8559 | 28 | #if DEBUG_TIMING == 2 |
kenjiArai | 12:cd58d03b8559 | 29 | extern Serial pc; |
kenjiArai | 12:cd58d03b8559 | 30 | extern DigitalOut test_point; |
kenjiArai | 12:cd58d03b8559 | 31 | # define TP_ON {test_point = 1;} |
kenjiArai | 12:cd58d03b8559 | 32 | # define TP_OFF {test_point = 0;} |
kenjiArai | 12:cd58d03b8559 | 33 | # define DBG_PRINTF(...) pc.printf(__VA_ARGS__) |
kenjiArai | 12:cd58d03b8559 | 34 | #else |
kenjiArai | 12:cd58d03b8559 | 35 | # define TP_ON {;} |
kenjiArai | 12:cd58d03b8559 | 36 | # define TP_OFF {;} |
kenjiArai | 12:cd58d03b8559 | 37 | # define DBG_PRINTF(...) {;} |
kenjiArai | 12:cd58d03b8559 | 38 | #endif |
Sissors | 10:236fce2e5b8c | 39 | |
kenjiArai | 12:cd58d03b8559 | 40 | |
kenjiArai | 12:cd58d03b8559 | 41 | int SoftSerial::_getc( void ) |
kenjiArai | 12:cd58d03b8559 | 42 | { |
kenjiArai | 12:cd58d03b8559 | 43 | while(!readable()) { |
kenjiArai | 12:cd58d03b8559 | 44 | YIELD; |
kenjiArai | 12:cd58d03b8559 | 45 | } |
Sissors | 1:f8b4b764ace7 | 46 | out_valid = false; |
Sissors | 1:f8b4b764ace7 | 47 | return out_buffer; |
Sissors | 1:f8b4b764ace7 | 48 | } |
Sissors | 0:8edaa7abe724 | 49 | |
kenjiArai | 12:cd58d03b8559 | 50 | int SoftSerial::readable(void) |
kenjiArai | 12:cd58d03b8559 | 51 | { |
Sissors | 1:f8b4b764ace7 | 52 | return out_valid; |
Sissors | 1:f8b4b764ace7 | 53 | } |
Sissors | 1:f8b4b764ace7 | 54 | |
Sissors | 1:f8b4b764ace7 | 55 | //Start receiving byte |
kenjiArai | 12:cd58d03b8559 | 56 | void SoftSerial::rx_gpio_irq_handler(void) |
kenjiArai | 12:cd58d03b8559 | 57 | { |
kenjiArai | 12:cd58d03b8559 | 58 | TP_ON; |
kenjiArai | 13:6399b30798a5 | 59 | rxticker.prime(MAGIC_NUM); |
Sissors | 1:f8b4b764ace7 | 60 | rx->fall(NULL); |
Sissors | 1:f8b4b764ace7 | 61 | rx_bit = 0; |
Sissors | 1:f8b4b764ace7 | 62 | rx_error = false; |
kenjiArai | 12:cd58d03b8559 | 63 | // dummy setting for 1st timer interrupt |
kenjiArai | 12:cd58d03b8559 | 64 | rx_1st = true; |
kenjiArai | 12:cd58d03b8559 | 65 | rx_st_time = us_ticker_read(); |
kenjiArai | 13:6399b30798a5 | 66 | rxticker.setNext(10); |
kenjiArai | 12:cd58d03b8559 | 67 | TP_OFF; |
kenjiArai | 12:cd58d03b8559 | 68 | }; |
Sissors | 1:f8b4b764ace7 | 69 | |
kenjiArai | 12:cd58d03b8559 | 70 | void SoftSerial::rx_handler(void) |
kenjiArai | 12:cd58d03b8559 | 71 | { |
kenjiArai | 12:cd58d03b8559 | 72 | TP_ON; |
kenjiArai | 12:cd58d03b8559 | 73 | // dummy IRQ for 1st shot |
kenjiArai | 12:cd58d03b8559 | 74 | if (rx_1st) { |
kenjiArai | 12:cd58d03b8559 | 75 | rx_1st = false; |
kenjiArai | 12:cd58d03b8559 | 76 | int next_preiod = us_ticker_read() - rx_st_time; |
kenjiArai | 12:cd58d03b8559 | 77 | next_preiod = bit_period + (bit_period >> 1) - next_preiod; |
kenjiArai | 12:cd58d03b8559 | 78 | if (next_preiod > 0) { |
kenjiArai | 12:cd58d03b8559 | 79 | rxticker.setNext(next_preiod); |
kenjiArai | 12:cd58d03b8559 | 80 | } else { |
kenjiArai | 13:6399b30798a5 | 81 | rxticker.setNext(5); |
kenjiArai | 12:cd58d03b8559 | 82 | } |
kenjiArai | 12:cd58d03b8559 | 83 | TP_OFF; |
kenjiArai | 12:cd58d03b8559 | 84 | return; |
kenjiArai | 12:cd58d03b8559 | 85 | } |
Sissors | 10:236fce2e5b8c | 86 | //Receive data |
Sissors | 10:236fce2e5b8c | 87 | int val = rx->read(); |
kenjiArai | 12:cd58d03b8559 | 88 | |
Sissors | 6:517082212c00 | 89 | rxticker.setNext(bit_period); |
Sissors | 1:f8b4b764ace7 | 90 | rx_bit++; |
kenjiArai | 12:cd58d03b8559 | 91 | |
Sissors | 1:f8b4b764ace7 | 92 | if (rx_bit <= _bits) { |
Sissors | 1:f8b4b764ace7 | 93 | read_buffer |= val << (rx_bit - 1); |
kenjiArai | 12:cd58d03b8559 | 94 | TP_OFF; |
Sissors | 1:f8b4b764ace7 | 95 | return; |
Sissors | 1:f8b4b764ace7 | 96 | } |
kenjiArai | 12:cd58d03b8559 | 97 | |
Sissors | 1:f8b4b764ace7 | 98 | //Receive parity |
Sissors | 1:f8b4b764ace7 | 99 | bool parity_count; |
Sissors | 1:f8b4b764ace7 | 100 | if (rx_bit == _bits + 1) { |
Sissors | 1:f8b4b764ace7 | 101 | switch (_parity) { |
Sissors | 1:f8b4b764ace7 | 102 | case Forced1: |
Sissors | 1:f8b4b764ace7 | 103 | if (val == 0) |
Sissors | 1:f8b4b764ace7 | 104 | rx_error = true; |
Sissors | 1:f8b4b764ace7 | 105 | return; |
Sissors | 1:f8b4b764ace7 | 106 | case Forced0: |
Sissors | 1:f8b4b764ace7 | 107 | if (val == 1) |
Sissors | 1:f8b4b764ace7 | 108 | rx_error = true; |
Sissors | 1:f8b4b764ace7 | 109 | return; |
Sissors | 1:f8b4b764ace7 | 110 | case Even: |
Sissors | 1:f8b4b764ace7 | 111 | case Odd: |
Sissors | 1:f8b4b764ace7 | 112 | parity_count = val; |
Sissors | 1:f8b4b764ace7 | 113 | for (int i = 0; i<_bits; i++) { |
Sissors | 1:f8b4b764ace7 | 114 | if (((read_buffer >> i) & 0x01) == 1) |
Sissors | 1:f8b4b764ace7 | 115 | parity_count = !parity_count; |
Sissors | 1:f8b4b764ace7 | 116 | } |
Sissors | 1:f8b4b764ace7 | 117 | if ((parity_count) && (_parity == Even)) |
Sissors | 1:f8b4b764ace7 | 118 | rx_error = true; |
Sissors | 1:f8b4b764ace7 | 119 | if ((!parity_count) && (_parity == Odd)) |
Sissors | 1:f8b4b764ace7 | 120 | rx_error = true; |
Sissors | 1:f8b4b764ace7 | 121 | return; |
kenjiArai | 12:cd58d03b8559 | 122 | case None: |
kenjiArai | 12:cd58d03b8559 | 123 | default: |
kenjiArai | 12:cd58d03b8559 | 124 | ; |
Sissors | 1:f8b4b764ace7 | 125 | } |
Sissors | 1:f8b4b764ace7 | 126 | } |
kenjiArai | 12:cd58d03b8559 | 127 | |
Sissors | 1:f8b4b764ace7 | 128 | //Receive stop |
Sissors | 1:f8b4b764ace7 | 129 | if (rx_bit < _bits + (bool)_parity + _stop_bits) { |
Sissors | 1:f8b4b764ace7 | 130 | if (!val) |
Sissors | 1:f8b4b764ace7 | 131 | rx_error = true; |
kenjiArai | 12:cd58d03b8559 | 132 | TP_OFF; |
Sissors | 1:f8b4b764ace7 | 133 | return; |
kenjiArai | 12:cd58d03b8559 | 134 | } |
kenjiArai | 12:cd58d03b8559 | 135 | |
Sissors | 1:f8b4b764ace7 | 136 | //The last stop bit |
Sissors | 1:f8b4b764ace7 | 137 | if (!val) |
Sissors | 1:f8b4b764ace7 | 138 | rx_error = true; |
kenjiArai | 12:cd58d03b8559 | 139 | |
Sissors | 1:f8b4b764ace7 | 140 | if (!rx_error) { |
Sissors | 1:f8b4b764ace7 | 141 | out_valid = true; |
Sissors | 1:f8b4b764ace7 | 142 | out_buffer = read_buffer; |
Sissors | 4:c010265ed202 | 143 | fpointer[RxIrq].call(); |
Sissors | 1:f8b4b764ace7 | 144 | } |
Sissors | 1:f8b4b764ace7 | 145 | read_buffer = 0; |
kenjiArai | 12:cd58d03b8559 | 146 | rxticker.detach(); |
kenjiArai | 12:cd58d03b8559 | 147 | rx->fall(callback(this, &SoftSerial::rx_gpio_irq_handler)); |
kenjiArai | 12:cd58d03b8559 | 148 | TP_OFF; |
Sissors | 1:f8b4b764ace7 | 149 | } |