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

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?

UserRevisionLine numberNew 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 }