MAX3100, an external serial device to add additional serial ports via SPI
Diff: MAX3100.cpp
- Revision:
- 1:46c8c60e744a
- Parent:
- 0:055897ab699b
- Child:
- 2:2a49171453d5
--- a/MAX3100.cpp Sun Jan 16 18:27:44 2011 +0000 +++ b/MAX3100.cpp Mon Jan 17 01:14:16 2011 +0000 @@ -52,7 +52,8 @@ _spi->frequency(MAX3100_SPI_FREQ); } - if (irq != NC) { + if (irq != NC) { + irqMask(irq); _irq = new InterruptIn(irq); _irq->mode(PullUp); topic_1498(irq); @@ -100,49 +101,49 @@ void MAX3100::baud(int baudrate) { - __disable_irq(); + irqDisable(); config &= ~(0xf); config |= (baudrate & 0xf); config_write(config); - __enable_irq(); + irqEnable(); } void MAX3100::enableRxIrq(void) { - __disable_irq(); + irqDisable(); config &= ~MAX3100_RM(1); config |= MAX3100_RM(1); config_write(config); - __enable_irq(); + irqEnable(); } void MAX3100::disableRxIrq(void) { - __disable_irq(); + irqDisable(); config &= ~MAX3100_RM(1); config_write(config); - __enable_irq(); + irqEnable(); } void MAX3100::enableTxIrq(void) { - __disable_irq(); + irqDisable(); config &= ~MAX3100_TM(1); config |= MAX3100_TM(1); config_write(config); - __enable_irq(); + irqEnable(); } void MAX3100::disableTxIrq(void) { - __disable_irq(); + irqDisable(); config &= ~MAX3100_TM(1); config_write(config); - __enable_irq(); + irqEnable(); } int @@ -163,7 +164,7 @@ // Function is non-interruptable by the MAX3100 class // to avoid SPI bus contention between writing a byte // in user context (here) and IRQ context. - __disable_irq(); + irqDisable(); conf = config_read(); @@ -184,7 +185,7 @@ if (tx_buffer_in == tx_buffer_out) tx_buffer_full = true; } - __enable_irq(); + irqEnable(); return 1; } @@ -261,16 +262,16 @@ { switch(i) { case 1: - __disable_irq(); + irqDisable(); config &= ~(1 << 6); config_write(config); - __enable_irq(); + irqEnable(); break; case 2: - __disable_irq(); + irqDisable(); config |= (1 << 6); config_write(config); - __enable_irq(); + irqEnable(); break; } } @@ -284,6 +285,53 @@ } return count & 1; } + +void +MAX3100::irqDisable(void) +{ + if (_irqMask0) LPC_GPIOINT->IO0IntEnF &= ~_irqMask0; + if (_irqMask2) LPC_GPIOINT->IO2IntEnF &= ~_irqMask2; +} + +void +MAX3100::irqEnable(void) +{ + if (_irqMask0) LPC_GPIOINT->IO0IntEnF |= _irqMask0; + if (_irqMask2) LPC_GPIOINT->IO2IntEnF |= _irqMask2; +} + +void +MAX3100::irqMask(PinName p) +{ + _irqMask0 = _irqMask2 = 0; + + switch( p ) { + case p5: _irqMask0 = (1UL << 9); break; + case p6: _irqMask0 = (1UL << 8); break; + case p7: _irqMask0 = (1UL << 7); break; + case p8: _irqMask0 = (1UL << 6); break; + case p9: _irqMask0 = (1UL << 0); break; + case p10: _irqMask0 = (1UL << 1); break; + case p11: _irqMask0 = (1UL << 18); break; + case p12: _irqMask0 = (1UL << 17); break; + case p13: _irqMask0 = (1UL << 15); break; + case p14: _irqMask0 = (1UL << 16); break; + case p15: _irqMask0 = (1UL << 23); break; + case p16: _irqMask0 = (1UL << 24); break; + case p17: _irqMask0 = (1UL << 25); break; + case p18: _irqMask0 = (1UL << 26); break; + case p21: _irqMask2 = (1UL << 5); break; + case p22: _irqMask2 = (1UL << 4); break; + case p23: _irqMask2 = (1UL << 3); break; + case p24: _irqMask2 = (1UL << 2); break; + case p25: _irqMask2 = (1UL << 1); break; + case p26: _irqMask2 = (1UL << 0); break; + case p27: _irqMask0 = (1UL << 11); break; + case p28: _irqMask0 = (1UL << 10); break; + case p29: _irqMask0 = (1UL << 5); break; + case p30: _irqMask0 = (1UL << 4); break; + } +} void MAX3100::topic_1498(PinName p) {