diff options
| author | tmk <nobody@nowhere> | 2013-02-25 01:02:14 +0900 | 
|---|---|---|
| committer | tmk <nobody@nowhere> | 2013-02-25 01:02:14 +0900 | 
| commit | 90e6ff92f44511c7ef75f62ceaa186458be3dba2 (patch) | |
| tree | df6d163e7b5c9c9729c3cd93b9852348a851f52c | |
| parent | 504a9f42ff7cfecb94eb954124e48ff65d345008 (diff) | |
| download | firmware-90e6ff92f44511c7ef75f62ceaa186458be3dba2.tar.gz firmware-90e6ff92f44511c7ef75f62ceaa186458be3dba2.tar.bz2 firmware-90e6ff92f44511c7ef75f62ceaa186458be3dba2.zip | |
Add parity option in serial_soft.c
| -rw-r--r-- | protocol/serial_soft.c | 39 | 
1 files changed, 32 insertions, 7 deletions
| diff --git a/protocol/serial_soft.c b/protocol/serial_soft.c index 3c9c914ed..c906c6647 100644 --- a/protocol/serial_soft.c +++ b/protocol/serial_soft.c @@ -46,7 +46,7 @@ POSSIBILITY OF SUCH DAMAGE.   *  is still useful for negative logic signal like Sun protocol not supported by hardware USART.   */ -#define WAIT_US     (1000000/SERIAL_BAUD) +#define WAIT_US     (1000000L/SERIAL_BAUD)  /* debug for signal timing, see debug pin with oscilloscope */  #ifdef SERIAL_SOFT_DEBUG @@ -100,18 +100,33 @@ int16_t serial_recv2(void)  void serial_send(uint8_t data)  {      /* signal state: IDLE: ON, START: OFF, STOP: ON, DATA0: OFF, DATA1: ON */ -    /* start bit */ -    SERIAL_TXD_OFF(); -    _delay_us(WAIT_US);  #ifdef SERIAL_BIT_ORDER_MSB      uint8_t mask = 0x80;  #else      uint8_t mask = 0x01;  #endif + +#ifdef SERIAL_PARITY_ODD +    uint8_t parity = 1; +#elif defined(SERIAL_PARITY_EVEN) +    uint8_t parity = 0; +#endif + +    /* start bit */ +    SERIAL_TXD_OFF(); +    _delay_us(WAIT_US-2); +      while (mask) { -        if (data&mask) { SERIAL_TXD_ON(); } else { SERIAL_TXD_OFF(); } -        _delay_us(WAIT_US); +        if (data&mask) { +            SERIAL_TXD_ON(); +#if defined(SERIAL_PARITY_EVEN) || defined(SERIAL_PARITY_ODD) +            parity ^= 1; +#endif +        } else { +            SERIAL_TXD_OFF(); +        } +        _delay_us(WAIT_US-2);  #ifdef SERIAL_BIT_ORDER_MSB          mask >>= 1; @@ -120,9 +135,19 @@ void serial_send(uint8_t data)  #endif      } +#if defined(SERIAL_PARITY_EVEN) || defined(SERIAL_PARITY_ODD) +    /* to center of parity bit */ +    if (parity) { +        SERIAL_TXD_ON(); +    } else { +        SERIAL_TXD_OFF(); +    } +    _delay_us(WAIT_US-2); +#endif +      /* stop bit */      SERIAL_TXD_ON(); -    _delay_us(WAIT_US); +    _delay_us(WAIT_US-2);  }  /* detect edge of start bit */ | 
