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 12:cd58d03b8559 5 // please make a constructor in main.cpp if you use below pc & led
kenjiArai 12:cd58d03b8559 6 #if DEBUG_TIMING == 1
kenjiArai 12:cd58d03b8559 7 extern Serial pc;
kenjiArai 12:cd58d03b8559 8 extern DigitalOut test_point;
kenjiArai 12:cd58d03b8559 9 # define TP_ON {test_point = 1;}
kenjiArai 12:cd58d03b8559 10 # define TP_OFF {test_point = 0;}
kenjiArai 12:cd58d03b8559 11 # define DBG_PRINTF(...) pc.printf(__VA_ARGS__)
kenjiArai 12:cd58d03b8559 12 #else
kenjiArai 12:cd58d03b8559 13 # define TP_ON {;}
kenjiArai 12:cd58d03b8559 14 # define TP_OFF {;}
kenjiArai 12:cd58d03b8559 15 # define DBG_PRINTF(...) {;}
kenjiArai 12:cd58d03b8559 16 #endif
kenjiArai 12:cd58d03b8559 17
Sissors 2:9e01a38606b4 18 int SoftSerial::_putc(int c)
Sissors 2:9e01a38606b4 19 {
kenjiArai 12:cd58d03b8559 20 while(!writeable()) {
kenjiArai 12:cd58d03b8559 21 YIELD;
kenjiArai 12:cd58d03b8559 22 }
Sissors 2:9e01a38606b4 23 prepare_tx(c);
Sissors 0:8edaa7abe724 24 tx_bit = 0;
kenjiArai 12:cd58d03b8559 25 tx->write(1);
kenjiArai 13:6399b30798a5 26 txticker.prime();
Sissors 0:8edaa7abe724 27 tx_handler();
Sissors 0:8edaa7abe724 28 return 0;
Sissors 2:9e01a38606b4 29 }
Sissors 0:8edaa7abe724 30
Sissors 7:7de3e1019e23 31 void SoftSerial::send_break(void) {
kenjiArai 12:cd58d03b8559 32 while(!writeable()) {
kenjiArai 12:cd58d03b8559 33 YIELD;
kenjiArai 12:cd58d03b8559 34 }
kenjiArai 12:cd58d03b8559 35 //Just to make sure it appears as non-writable to other threads/IRQs
kenjiArai 12:cd58d03b8559 36 tx_bit = 0;
Sissors 7:7de3e1019e23 37 tx->write(0);
Sissors 8:332b66de89d3 38 wait_us((bit_period * _total_bits * 3) / 2);
Sissors 7:7de3e1019e23 39 tx->write(1);
Sissors 7:7de3e1019e23 40 tx_bit = -1;
Sissors 7:7de3e1019e23 41 }
Sissors 7:7de3e1019e23 42
Sissors 2:9e01a38606b4 43 int SoftSerial::writeable(void)
Sissors 2:9e01a38606b4 44 {
kenjiArai 12:cd58d03b8559 45 if (!tx_en) {
Sissors 0:8edaa7abe724 46 return false;
kenjiArai 12:cd58d03b8559 47 }
kenjiArai 12:cd58d03b8559 48 if (tx_bit == -1) {
Sissors 0:8edaa7abe724 49 return true;
kenjiArai 12:cd58d03b8559 50 }
Sissors 0:8edaa7abe724 51 return false;
Sissors 0:8edaa7abe724 52 }
Sissors 0:8edaa7abe724 53
Sissors 2:9e01a38606b4 54 void SoftSerial::tx_handler(void)
Sissors 2:9e01a38606b4 55 {
kenjiArai 12:cd58d03b8559 56 TP_ON;
Sissors 2:9e01a38606b4 57 if (tx_bit == _total_bits) {
Sissors 0:8edaa7abe724 58 tx_bit = -1;
kenjiArai 12:cd58d03b8559 59 tx->write(1);
Sissors 4:c010265ed202 60 fpointer[TxIrq].call();
kenjiArai 12:cd58d03b8559 61 TP_OFF;
Sissors 0:8edaa7abe724 62 return;
Sissors 0:8edaa7abe724 63 }
kenjiArai 12:cd58d03b8559 64 if (tx_bit == 0){
kenjiArai 12:cd58d03b8559 65 tx->write(1);
kenjiArai 13:6399b30798a5 66 txticker.setNext(10);
kenjiArai 12:cd58d03b8559 67 } else {
kenjiArai 12:cd58d03b8559 68 int bitchk = _char >> tx_bit;
kenjiArai 13:6399b30798a5 69 if (bitchk & 1) {
kenjiArai 12:cd58d03b8559 70 tx->write(1);
kenjiArai 12:cd58d03b8559 71 } else {
kenjiArai 12:cd58d03b8559 72 tx->write(0);
kenjiArai 12:cd58d03b8559 73 }
kenjiArai 13:6399b30798a5 74 txticker.setNext(bit_period);
kenjiArai 12:cd58d03b8559 75 }
Sissors 0:8edaa7abe724 76 tx_bit++;
kenjiArai 12:cd58d03b8559 77 TP_OFF;
Sissors 0:8edaa7abe724 78 }
Sissors 0:8edaa7abe724 79
Sissors 2:9e01a38606b4 80 void SoftSerial::prepare_tx(int c)
Sissors 2:9e01a38606b4 81 {
kenjiArai 12:cd58d03b8559 82 _char = c << 2; // set start bit as bit1 and dummy as bit0
Sissors 2:9e01a38606b4 83
Sissors 2:9e01a38606b4 84 bool parity;
Sissors 2:9e01a38606b4 85 switch (_parity) {
Sissors 2:9e01a38606b4 86 case Forced1:
Sissors 2:9e01a38606b4 87 _char |= 1 << (_bits + 1);
kenjiArai 12:cd58d03b8559 88 break;
Sissors 2:9e01a38606b4 89 case Even:
Sissors 2:9e01a38606b4 90 parity = false;
Sissors 2:9e01a38606b4 91 for (int i = 0; i<_bits; i++) {
kenjiArai 12:cd58d03b8559 92 if (((_char >> i) & 0x01) == 1) {
Sissors 2:9e01a38606b4 93 parity = !parity;
kenjiArai 12:cd58d03b8559 94 }
Sissors 2:9e01a38606b4 95 }
Sissors 2:9e01a38606b4 96 _char |= parity << (_bits + 1);
kenjiArai 12:cd58d03b8559 97 break;
Sissors 2:9e01a38606b4 98 case Odd:
Sissors 2:9e01a38606b4 99 parity = true;
Sissors 2:9e01a38606b4 100 for (int i = 0; i<_bits; i++) {
kenjiArai 12:cd58d03b8559 101 if (((_char >> i) & 0x01) == 1) {
Sissors 2:9e01a38606b4 102 parity = !parity;
kenjiArai 12:cd58d03b8559 103 }
Sissors 2:9e01a38606b4 104 }
Sissors 2:9e01a38606b4 105 _char |= parity << (_bits + 1);
kenjiArai 12:cd58d03b8559 106 break;
kenjiArai 12:cd58d03b8559 107 case Forced0:
kenjiArai 12:cd58d03b8559 108 case None:
kenjiArai 12:cd58d03b8559 109 default:
kenjiArai 12:cd58d03b8559 110 ;
Sissors 0:8edaa7abe724 111 }
kenjiArai 12:cd58d03b8559 112 // added one dummy at LSB bit
kenjiArai 12:cd58d03b8559 113 int num = 1 + _bits + (bool)_parity + 1;
kenjiArai 12:cd58d03b8559 114 _char |= 0xffffffff << num;
kenjiArai 12:cd58d03b8559 115 _char |= 1UL;
kenjiArai 12:cd58d03b8559 116 _char &= ~(1 << _total_bits);
Sissors 2:9e01a38606b4 117 }