Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of SC16IS752 by
SC16IS752.cpp@0:ad254d5f94b1, 2016-08-10 (annotated)
- Committer:
- irsanjul
- Date:
- Wed Aug 10 03:40:03 2016 +0000
- Revision:
- 0:ad254d5f94b1
- Child:
- 1:85070c9144a6
sc16is752
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
irsanjul | 0:ad254d5f94b1 | 1 | #include "mbed.h" |
irsanjul | 0:ad254d5f94b1 | 2 | #include "SC16IS752.h" |
irsanjul | 0:ad254d5f94b1 | 3 | #include <vector> |
irsanjul | 0:ad254d5f94b1 | 4 | |
irsanjul | 0:ad254d5f94b1 | 5 | #define ENABLE_BULK_TRANSFERS 1 |
irsanjul | 0:ad254d5f94b1 | 6 | #define BULK_BLOCK_LEN 16 |
irsanjul | 0:ad254d5f94b1 | 7 | #define MAX_BUFF 64 |
irsanjul | 0:ad254d5f94b1 | 8 | |
irsanjul | 0:ad254d5f94b1 | 9 | extern Serial dbg; |
irsanjul | 0:ad254d5f94b1 | 10 | |
irsanjul | 0:ad254d5f94b1 | 11 | SC16IS752::SC16IS752(PinName sda, PinName scl, uint8_t deviceAddress, PinName rst, ChannelName channel) : _i2c(sda, scl), _slaveAddress(deviceAddress & 0xFE), _channel(channel) |
irsanjul | 0:ad254d5f94b1 | 12 | { |
irsanjul | 0:ad254d5f94b1 | 13 | _i2c.frequency(400000); |
irsanjul | 0:ad254d5f94b1 | 14 | _i2c.start(); |
irsanjul | 0:ad254d5f94b1 | 15 | _i2c.stop(); |
irsanjul | 0:ad254d5f94b1 | 16 | |
irsanjul | 0:ad254d5f94b1 | 17 | if (_i2c.read(deviceAddress, &data[0], 1) != 0) |
irsanjul | 0:ad254d5f94b1 | 18 | { |
irsanjul | 0:ad254d5f94b1 | 19 | dbg.printf(RED "I2C device is not detected\r\n" DEF); |
irsanjul | 0:ad254d5f94b1 | 20 | } |
irsanjul | 0:ad254d5f94b1 | 21 | else |
irsanjul | 0:ad254d5f94b1 | 22 | { |
irsanjul | 0:ad254d5f94b1 | 23 | dbg.printf(GRE "I2C device is detected\r\n" DEF); |
irsanjul | 0:ad254d5f94b1 | 24 | } |
irsanjul | 0:ad254d5f94b1 | 25 | |
irsanjul | 0:ad254d5f94b1 | 26 | data[0]=0; |
irsanjul | 0:ad254d5f94b1 | 27 | _i2c.start(); |
irsanjul | 0:ad254d5f94b1 | 28 | _i2c.stop(); |
irsanjul | 0:ad254d5f94b1 | 29 | |
irsanjul | 0:ad254d5f94b1 | 30 | if (rst != NC) |
irsanjul | 0:ad254d5f94b1 | 31 | { |
irsanjul | 0:ad254d5f94b1 | 32 | _reset = new DigitalOut(rst); //Construct new pin |
irsanjul | 0:ad254d5f94b1 | 33 | _reset->write(1); //Deactivate |
irsanjul | 0:ad254d5f94b1 | 34 | } |
irsanjul | 0:ad254d5f94b1 | 35 | else |
irsanjul | 0:ad254d5f94b1 | 36 | { |
irsanjul | 0:ad254d5f94b1 | 37 | _reset = NULL; //Construct dummy pin |
irsanjul | 0:ad254d5f94b1 | 38 | } |
irsanjul | 0:ad254d5f94b1 | 39 | } |
irsanjul | 0:ad254d5f94b1 | 40 | |
irsanjul | 0:ad254d5f94b1 | 41 | SC16IS752::~SC16IS752() |
irsanjul | 0:ad254d5f94b1 | 42 | { |
irsanjul | 0:ad254d5f94b1 | 43 | if (_reset != NULL) {delete _reset;} // Reset pin |
irsanjul | 0:ad254d5f94b1 | 44 | } |
irsanjul | 0:ad254d5f94b1 | 45 | |
irsanjul | 0:ad254d5f94b1 | 46 | bool SC16IS752::wr(char adr, char data) |
irsanjul | 0:ad254d5f94b1 | 47 | { |
irsanjul | 0:ad254d5f94b1 | 48 | w[0] = adr | _channel; |
irsanjul | 0:ad254d5f94b1 | 49 | w[1] = data; |
irsanjul | 0:ad254d5f94b1 | 50 | if (_i2c.write(_slaveAddress, w, 2) != 0) return 0; |
irsanjul | 0:ad254d5f94b1 | 51 | |
irsanjul | 0:ad254d5f94b1 | 52 | return true; |
irsanjul | 0:ad254d5f94b1 | 53 | } |
irsanjul | 0:ad254d5f94b1 | 54 | |
irsanjul | 0:ad254d5f94b1 | 55 | void SC16IS752::wrblock(const char *data, int len ) |
irsanjul | 0:ad254d5f94b1 | 56 | { |
irsanjul | 0:ad254d5f94b1 | 57 | int i; |
irsanjul | 0:ad254d5f94b1 | 58 | |
irsanjul | 0:ad254d5f94b1 | 59 | _i2c.start(); |
irsanjul | 0:ad254d5f94b1 | 60 | _i2c.write(_slaveAddress); |
irsanjul | 0:ad254d5f94b1 | 61 | _i2c.write(THR | _channel); |
irsanjul | 0:ad254d5f94b1 | 62 | |
irsanjul | 0:ad254d5f94b1 | 63 | for (i=0; i<len; i++) |
irsanjul | 0:ad254d5f94b1 | 64 | { |
irsanjul | 0:ad254d5f94b1 | 65 | _i2c.write(data[i]); |
irsanjul | 0:ad254d5f94b1 | 66 | wait_ms(1); |
irsanjul | 0:ad254d5f94b1 | 67 | } |
irsanjul | 0:ad254d5f94b1 | 68 | |
irsanjul | 0:ad254d5f94b1 | 69 | _i2c.stop(); |
irsanjul | 0:ad254d5f94b1 | 70 | } |
irsanjul | 0:ad254d5f94b1 | 71 | |
irsanjul | 0:ad254d5f94b1 | 72 | char SC16IS752::rd(char adr) |
irsanjul | 0:ad254d5f94b1 | 73 | { |
irsanjul | 0:ad254d5f94b1 | 74 | char start = adr | _channel;; |
irsanjul | 0:ad254d5f94b1 | 75 | if (_i2c.write(_slaveAddress, &start, 1, true) != 0) dbg.printf(RED "SPR No Ack!\r\n" DEF); |
irsanjul | 0:ad254d5f94b1 | 76 | if (_i2c.read(_slaveAddress, r, 1) != 0) dbg.printf(RED "SPR No Ack!\r\n" DEF); |
irsanjul | 0:ad254d5f94b1 | 77 | |
irsanjul | 0:ad254d5f94b1 | 78 | return r[0]; |
irsanjul | 0:ad254d5f94b1 | 79 | } |
irsanjul | 0:ad254d5f94b1 | 80 | |
irsanjul | 0:ad254d5f94b1 | 81 | bool SC16IS752::swReset() |
irsanjul | 0:ad254d5f94b1 | 82 | { |
irsanjul | 0:ad254d5f94b1 | 83 | if(wr(IOCTRL, IOC_SW_RST)) |
irsanjul | 0:ad254d5f94b1 | 84 | return true; |
irsanjul | 0:ad254d5f94b1 | 85 | else return 0; |
irsanjul | 0:ad254d5f94b1 | 86 | } |
irsanjul | 0:ad254d5f94b1 | 87 | |
irsanjul | 0:ad254d5f94b1 | 88 | bool SC16IS752::baud(int baudrate) |
irsanjul | 0:ad254d5f94b1 | 89 | { |
irsanjul | 0:ad254d5f94b1 | 90 | unsigned long divisor = SC16IS752_BAUDRATE_DIVISOR(baudrate); |
irsanjul | 0:ad254d5f94b1 | 91 | char lcr_tmp; |
irsanjul | 0:ad254d5f94b1 | 92 | |
irsanjul | 0:ad254d5f94b1 | 93 | _config.baudrate = baudrate; |
irsanjul | 0:ad254d5f94b1 | 94 | |
irsanjul | 0:ad254d5f94b1 | 95 | lcr_tmp = rd(LCR); |
irsanjul | 0:ad254d5f94b1 | 96 | if(!wr(LCR, lcr_tmp | LCR_ENABLE_DIV)) return 0; |
irsanjul | 0:ad254d5f94b1 | 97 | if(!wr(DLL, ( divisor & 0xFF))) return 0; |
irsanjul | 0:ad254d5f94b1 | 98 | if(!wr(DLH, ((divisor >> 8) & 0xFF))) return 0; |
irsanjul | 0:ad254d5f94b1 | 99 | if(!wr(LCR, lcr_tmp)) return 0; |
irsanjul | 0:ad254d5f94b1 | 100 | |
irsanjul | 0:ad254d5f94b1 | 101 | return true; |
irsanjul | 0:ad254d5f94b1 | 102 | } |
irsanjul | 0:ad254d5f94b1 | 103 | |
irsanjul | 0:ad254d5f94b1 | 104 | bool SC16IS752::format(int bits, Serial::Parity parity, int stop_bits) |
irsanjul | 0:ad254d5f94b1 | 105 | { |
irsanjul | 0:ad254d5f94b1 | 106 | char lcr_tmp = 0x00; |
irsanjul | 0:ad254d5f94b1 | 107 | |
irsanjul | 0:ad254d5f94b1 | 108 | switch (bits) |
irsanjul | 0:ad254d5f94b1 | 109 | { |
irsanjul | 0:ad254d5f94b1 | 110 | case 5: lcr_tmp |= LCR_BITS5; |
irsanjul | 0:ad254d5f94b1 | 111 | break; |
irsanjul | 0:ad254d5f94b1 | 112 | case 6: lcr_tmp |= LCR_BITS6; |
irsanjul | 0:ad254d5f94b1 | 113 | break; |
irsanjul | 0:ad254d5f94b1 | 114 | case 7: lcr_tmp |= LCR_BITS7; |
irsanjul | 0:ad254d5f94b1 | 115 | break; |
irsanjul | 0:ad254d5f94b1 | 116 | case 8: lcr_tmp |= LCR_BITS8; |
irsanjul | 0:ad254d5f94b1 | 117 | break; |
irsanjul | 0:ad254d5f94b1 | 118 | default: lcr_tmp |= LCR_BITS8; |
irsanjul | 0:ad254d5f94b1 | 119 | } |
irsanjul | 0:ad254d5f94b1 | 120 | |
irsanjul | 0:ad254d5f94b1 | 121 | switch (parity) |
irsanjul | 0:ad254d5f94b1 | 122 | { |
irsanjul | 0:ad254d5f94b1 | 123 | case Serial::None: lcr_tmp |= LCR_NONE; |
irsanjul | 0:ad254d5f94b1 | 124 | break; |
irsanjul | 0:ad254d5f94b1 | 125 | case Serial::Odd: lcr_tmp |= LCR_ODD; |
irsanjul | 0:ad254d5f94b1 | 126 | break; |
irsanjul | 0:ad254d5f94b1 | 127 | case Serial::Even: lcr_tmp |= LCR_EVEN; |
irsanjul | 0:ad254d5f94b1 | 128 | break; |
irsanjul | 0:ad254d5f94b1 | 129 | case Serial::Forced1: lcr_tmp |= LCR_FORCED1; |
irsanjul | 0:ad254d5f94b1 | 130 | break; |
irsanjul | 0:ad254d5f94b1 | 131 | case Serial::Forced0: lcr_tmp |= LCR_FORCED0; |
irsanjul | 0:ad254d5f94b1 | 132 | break; |
irsanjul | 0:ad254d5f94b1 | 133 | default: lcr_tmp |= LCR_NONE; |
irsanjul | 0:ad254d5f94b1 | 134 | } |
irsanjul | 0:ad254d5f94b1 | 135 | |
irsanjul | 0:ad254d5f94b1 | 136 | switch (stop_bits) |
irsanjul | 0:ad254d5f94b1 | 137 | { |
irsanjul | 0:ad254d5f94b1 | 138 | case 1: lcr_tmp |= LCR_BITS1; |
irsanjul | 0:ad254d5f94b1 | 139 | break; |
irsanjul | 0:ad254d5f94b1 | 140 | case 2: lcr_tmp |= LCR_BITS2; |
irsanjul | 0:ad254d5f94b1 | 141 | break; |
irsanjul | 0:ad254d5f94b1 | 142 | default: lcr_tmp |= LCR_BITS1; |
irsanjul | 0:ad254d5f94b1 | 143 | } |
irsanjul | 0:ad254d5f94b1 | 144 | |
irsanjul | 0:ad254d5f94b1 | 145 | _config.dataformat = lcr_tmp; |
irsanjul | 0:ad254d5f94b1 | 146 | |
irsanjul | 0:ad254d5f94b1 | 147 | if(!wr(LCR, lcr_tmp)) return 0; |
irsanjul | 0:ad254d5f94b1 | 148 | |
irsanjul | 0:ad254d5f94b1 | 149 | return true; |
irsanjul | 0:ad254d5f94b1 | 150 | } |
irsanjul | 0:ad254d5f94b1 | 151 | |
irsanjul | 0:ad254d5f94b1 | 152 | bool SC16IS752::set_flow_control(Flow type, PinName flow1, PinName flow2) |
irsanjul | 0:ad254d5f94b1 | 153 | { |
irsanjul | 0:ad254d5f94b1 | 154 | char lcr_tmp; |
irsanjul | 0:ad254d5f94b1 | 155 | char efr_tmp = 0x00; |
irsanjul | 0:ad254d5f94b1 | 156 | |
irsanjul | 0:ad254d5f94b1 | 157 | switch (type) |
irsanjul | 0:ad254d5f94b1 | 158 | { |
irsanjul | 0:ad254d5f94b1 | 159 | case Disabled : |
irsanjul | 0:ad254d5f94b1 | 160 | break; |
irsanjul | 0:ad254d5f94b1 | 161 | case RTS: efr_tmp = EFR_ENABLE_RTS; |
irsanjul | 0:ad254d5f94b1 | 162 | break; |
irsanjul | 0:ad254d5f94b1 | 163 | case CTS: efr_tmp = EFR_ENABLE_CTS; |
irsanjul | 0:ad254d5f94b1 | 164 | break; |
irsanjul | 0:ad254d5f94b1 | 165 | case RTSCTS: efr_tmp = EFR_ENABLE_RTS | EFR_ENABLE_CTS; |
irsanjul | 0:ad254d5f94b1 | 166 | break; |
irsanjul | 0:ad254d5f94b1 | 167 | default: break; |
irsanjul | 0:ad254d5f94b1 | 168 | } |
irsanjul | 0:ad254d5f94b1 | 169 | |
irsanjul | 0:ad254d5f94b1 | 170 | _config.flowctrl = efr_tmp | EFR_ENABLE_ENHANCED_FUNCTIONS; |
irsanjul | 0:ad254d5f94b1 | 171 | |
irsanjul | 0:ad254d5f94b1 | 172 | lcr_tmp = rd(LCR); |
irsanjul | 0:ad254d5f94b1 | 173 | if(!wr(LCR, LCR_ENABLE_ENHANCED_FUNCTIONS)) return 0; |
irsanjul | 0:ad254d5f94b1 | 174 | if(!wr(EFR, _config.flowctrl)) return 0; |
irsanjul | 0:ad254d5f94b1 | 175 | if(!wr(LCR, lcr_tmp)) return 0; |
irsanjul | 0:ad254d5f94b1 | 176 | |
irsanjul | 0:ad254d5f94b1 | 177 | return true; |
irsanjul | 0:ad254d5f94b1 | 178 | } |
irsanjul | 0:ad254d5f94b1 | 179 | |
irsanjul | 0:ad254d5f94b1 | 180 | bool SC16IS752::set_flow_triggers(int resume, int halt) |
irsanjul | 0:ad254d5f94b1 | 181 | { |
irsanjul | 0:ad254d5f94b1 | 182 | halt = halt & 0x0F; |
irsanjul | 0:ad254d5f94b1 | 183 | resume = resume & 0x0F; |
irsanjul | 0:ad254d5f94b1 | 184 | if (halt <= resume) |
irsanjul | 0:ad254d5f94b1 | 185 | { |
irsanjul | 0:ad254d5f94b1 | 186 | halt = TCR_HALT_DEFAULT; |
irsanjul | 0:ad254d5f94b1 | 187 | resume = TCR_RESUME_DEFAULT; |
irsanjul | 0:ad254d5f94b1 | 188 | } |
irsanjul | 0:ad254d5f94b1 | 189 | |
irsanjul | 0:ad254d5f94b1 | 190 | if(!wr(TCR, (resume << 4) | halt)) return 0; |
irsanjul | 0:ad254d5f94b1 | 191 | |
irsanjul | 0:ad254d5f94b1 | 192 | return true; |
irsanjul | 0:ad254d5f94b1 | 193 | } |
irsanjul | 0:ad254d5f94b1 | 194 | |
irsanjul | 0:ad254d5f94b1 | 195 | bool SC16IS752::set_modem_control() |
irsanjul | 0:ad254d5f94b1 | 196 | { |
irsanjul | 0:ad254d5f94b1 | 197 | if (SC16IS752_PRESCALER == SC16IS752_PRESCALER_1) |
irsanjul | 0:ad254d5f94b1 | 198 | { |
irsanjul | 0:ad254d5f94b1 | 199 | if(!wr(MCR, MCR_PRESCALE_1 | MCR_ENABLE_TCR_TLR)) return 0; |
irsanjul | 0:ad254d5f94b1 | 200 | } |
irsanjul | 0:ad254d5f94b1 | 201 | else |
irsanjul | 0:ad254d5f94b1 | 202 | { |
irsanjul | 0:ad254d5f94b1 | 203 | if(!wr(MCR, MCR_PRESCALE_4 | MCR_ENABLE_TCR_TLR)) return 0; |
irsanjul | 0:ad254d5f94b1 | 204 | } |
irsanjul | 0:ad254d5f94b1 | 205 | |
irsanjul | 0:ad254d5f94b1 | 206 | return true; |
irsanjul | 0:ad254d5f94b1 | 207 | } |
irsanjul | 0:ad254d5f94b1 | 208 | |
irsanjul | 0:ad254d5f94b1 | 209 | bool SC16IS752::connected() |
irsanjul | 0:ad254d5f94b1 | 210 | { |
irsanjul | 0:ad254d5f94b1 | 211 | char TEST_CHARACTER = 'A'; |
irsanjul | 0:ad254d5f94b1 | 212 | |
irsanjul | 0:ad254d5f94b1 | 213 | if(!wr(SPR, TEST_CHARACTER)) return 0; |
irsanjul | 0:ad254d5f94b1 | 214 | |
irsanjul | 0:ad254d5f94b1 | 215 | char test = rd(SPR); |
irsanjul | 0:ad254d5f94b1 | 216 | |
irsanjul | 0:ad254d5f94b1 | 217 | dbg.printf("read char: %c\r\n",test); |
irsanjul | 0:ad254d5f94b1 | 218 | |
irsanjul | 0:ad254d5f94b1 | 219 | if(test == TEST_CHARACTER) |
irsanjul | 0:ad254d5f94b1 | 220 | return true; |
irsanjul | 0:ad254d5f94b1 | 221 | else return 0; |
irsanjul | 0:ad254d5f94b1 | 222 | } |
irsanjul | 0:ad254d5f94b1 | 223 | |
irsanjul | 0:ad254d5f94b1 | 224 | bool SC16IS752::set_fifo_control(bool stat) |
irsanjul | 0:ad254d5f94b1 | 225 | { |
irsanjul | 0:ad254d5f94b1 | 226 | _config.fifoenable = stat; |
irsanjul | 0:ad254d5f94b1 | 227 | |
irsanjul | 0:ad254d5f94b1 | 228 | _config.fifoformat = FCR_RX_IRQ_8 | FCR_TX_IRQ_8; |
irsanjul | 0:ad254d5f94b1 | 229 | |
irsanjul | 0:ad254d5f94b1 | 230 | if (_config.fifoenable) |
irsanjul | 0:ad254d5f94b1 | 231 | if(!wr(FCR, _config.fifoformat | FCR_ENABLE_FIFO)) return 0; |
irsanjul | 0:ad254d5f94b1 | 232 | else |
irsanjul | 0:ad254d5f94b1 | 233 | if(!wr(FCR, _config.fifoformat)) return 0; |
irsanjul | 0:ad254d5f94b1 | 234 | |
irsanjul | 0:ad254d5f94b1 | 235 | if(!wr(TLR, 0x00)) return 0; |
irsanjul | 0:ad254d5f94b1 | 236 | |
irsanjul | 0:ad254d5f94b1 | 237 | return true; |
irsanjul | 0:ad254d5f94b1 | 238 | } |
irsanjul | 0:ad254d5f94b1 | 239 | |
irsanjul | 0:ad254d5f94b1 | 240 | bool SC16IS752::flush() |
irsanjul | 0:ad254d5f94b1 | 241 | { |
irsanjul | 0:ad254d5f94b1 | 242 | if(!wr(FCR, FCR_TX_FIFO_RST | FCR_RX_FIFO_RST)) return 0; |
irsanjul | 0:ad254d5f94b1 | 243 | |
irsanjul | 0:ad254d5f94b1 | 244 | if (_config.fifoenable) |
irsanjul | 0:ad254d5f94b1 | 245 | if(!wr(FCR, _config.fifoformat | FCR_ENABLE_FIFO)) return 0; |
irsanjul | 0:ad254d5f94b1 | 246 | else |
irsanjul | 0:ad254d5f94b1 | 247 | if(!wr(FCR, _config.fifoformat)) return 0; |
irsanjul | 0:ad254d5f94b1 | 248 | |
irsanjul | 0:ad254d5f94b1 | 249 | return true; |
irsanjul | 0:ad254d5f94b1 | 250 | } |
irsanjul | 0:ad254d5f94b1 | 251 | |
irsanjul | 0:ad254d5f94b1 | 252 | bool SC16IS752::readable() |
irsanjul | 0:ad254d5f94b1 | 253 | { |
irsanjul | 0:ad254d5f94b1 | 254 | if (rd(LSR) & LSR_DR) // Data in Receiver Bit, at least one character waiting |
irsanjul | 0:ad254d5f94b1 | 255 | { |
irsanjul | 0:ad254d5f94b1 | 256 | dbg.printf(GRE "Serial is readable\r\n" DEF); |
irsanjul | 0:ad254d5f94b1 | 257 | return true; |
irsanjul | 0:ad254d5f94b1 | 258 | } |
irsanjul | 0:ad254d5f94b1 | 259 | else |
irsanjul | 0:ad254d5f94b1 | 260 | { |
irsanjul | 0:ad254d5f94b1 | 261 | dbg.printf(RED "Serial is not readable\r\n" DEF); |
irsanjul | 0:ad254d5f94b1 | 262 | return false; |
irsanjul | 0:ad254d5f94b1 | 263 | } |
irsanjul | 0:ad254d5f94b1 | 264 | } |
irsanjul | 0:ad254d5f94b1 | 265 | |
irsanjul | 0:ad254d5f94b1 | 266 | int SC16IS752::readableCount() |
irsanjul | 0:ad254d5f94b1 | 267 | { |
irsanjul | 0:ad254d5f94b1 | 268 | int result = (int)rd(RXLVL); |
irsanjul | 0:ad254d5f94b1 | 269 | dbg.printf("readable count = %d\r\n", result); |
irsanjul | 0:ad254d5f94b1 | 270 | return result; |
irsanjul | 0:ad254d5f94b1 | 271 | } |
irsanjul | 0:ad254d5f94b1 | 272 | |
irsanjul | 0:ad254d5f94b1 | 273 | int SC16IS752::writeable() |
irsanjul | 0:ad254d5f94b1 | 274 | { |
irsanjul | 0:ad254d5f94b1 | 275 | if (rd(LSR) & LSR_THRE) // THR Empty, space for at least one character |
irsanjul | 0:ad254d5f94b1 | 276 | { |
irsanjul | 0:ad254d5f94b1 | 277 | dbg.printf(GRE "Serial is writeable\r\n" DEF); |
irsanjul | 0:ad254d5f94b1 | 278 | return true; |
irsanjul | 0:ad254d5f94b1 | 279 | } |
irsanjul | 0:ad254d5f94b1 | 280 | else |
irsanjul | 0:ad254d5f94b1 | 281 | { |
irsanjul | 0:ad254d5f94b1 | 282 | dbg.printf(RED "Serial is writeable\r\n" DEF); |
irsanjul | 0:ad254d5f94b1 | 283 | return false; |
irsanjul | 0:ad254d5f94b1 | 284 | } |
irsanjul | 0:ad254d5f94b1 | 285 | } |
irsanjul | 0:ad254d5f94b1 | 286 | |
irsanjul | 0:ad254d5f94b1 | 287 | int SC16IS752::writeableCount() |
irsanjul | 0:ad254d5f94b1 | 288 | { |
irsanjul | 0:ad254d5f94b1 | 289 | int result = (int)rd(TXLVL); |
irsanjul | 0:ad254d5f94b1 | 290 | dbg.printf("writeable count = %d\r\n", result); |
irsanjul | 0:ad254d5f94b1 | 291 | return result; |
irsanjul | 0:ad254d5f94b1 | 292 | } |
irsanjul | 0:ad254d5f94b1 | 293 | |
irsanjul | 0:ad254d5f94b1 | 294 | int SC16IS752::get() |
irsanjul | 0:ad254d5f94b1 | 295 | { |
irsanjul | 0:ad254d5f94b1 | 296 | if (!readable()) |
irsanjul | 0:ad254d5f94b1 | 297 | { |
irsanjul | 0:ad254d5f94b1 | 298 | return -1; |
irsanjul | 0:ad254d5f94b1 | 299 | } |
irsanjul | 0:ad254d5f94b1 | 300 | char res = rd(RHR); |
irsanjul | 0:ad254d5f94b1 | 301 | return res; |
irsanjul | 0:ad254d5f94b1 | 302 | } |
irsanjul | 0:ad254d5f94b1 | 303 | |
irsanjul | 0:ad254d5f94b1 | 304 | int SC16IS752::put(int value) |
irsanjul | 0:ad254d5f94b1 | 305 | { |
irsanjul | 0:ad254d5f94b1 | 306 | while (writeableCount() == 0); |
irsanjul | 0:ad254d5f94b1 | 307 | // { |
irsanjul | 0:ad254d5f94b1 | 308 | // wait_us(1); |
irsanjul | 0:ad254d5f94b1 | 309 | // }; |
irsanjul | 0:ad254d5f94b1 | 310 | |
irsanjul | 0:ad254d5f94b1 | 311 | if(!wr(THR, value)) return false; |
irsanjul | 0:ad254d5f94b1 | 312 | |
irsanjul | 0:ad254d5f94b1 | 313 | return true; |
irsanjul | 0:ad254d5f94b1 | 314 | } |
irsanjul | 0:ad254d5f94b1 | 315 | |
irsanjul | 0:ad254d5f94b1 | 316 | void SC16IS752::writeString(const char *str) |
irsanjul | 0:ad254d5f94b1 | 317 | { |
irsanjul | 0:ad254d5f94b1 | 318 | int len = strlen(str); |
irsanjul | 0:ad254d5f94b1 | 319 | int count = 0; |
irsanjul | 0:ad254d5f94b1 | 320 | |
irsanjul | 0:ad254d5f94b1 | 321 | while(len) |
irsanjul | 0:ad254d5f94b1 | 322 | { |
irsanjul | 0:ad254d5f94b1 | 323 | int blk = MAX_BUFF; |
irsanjul | 0:ad254d5f94b1 | 324 | |
irsanjul | 0:ad254d5f94b1 | 325 | if(len < blk) |
irsanjul | 0:ad254d5f94b1 | 326 | blk = len; |
irsanjul | 0:ad254d5f94b1 | 327 | |
irsanjul | 0:ad254d5f94b1 | 328 | if (blk > 0) |
irsanjul | 0:ad254d5f94b1 | 329 | { |
irsanjul | 0:ad254d5f94b1 | 330 | for(int i=0; i<blk; i++) |
irsanjul | 0:ad254d5f94b1 | 331 | { |
irsanjul | 0:ad254d5f94b1 | 332 | while (writeableCount() == 0) |
irsanjul | 0:ad254d5f94b1 | 333 | { |
irsanjul | 0:ad254d5f94b1 | 334 | wait_us(10); |
irsanjul | 0:ad254d5f94b1 | 335 | }; |
irsanjul | 0:ad254d5f94b1 | 336 | wr(THR, str[i + (count * blk)]); |
irsanjul | 0:ad254d5f94b1 | 337 | } |
irsanjul | 0:ad254d5f94b1 | 338 | |
irsanjul | 0:ad254d5f94b1 | 339 | len = len - blk; |
irsanjul | 0:ad254d5f94b1 | 340 | count++; |
irsanjul | 0:ad254d5f94b1 | 341 | } |
irsanjul | 0:ad254d5f94b1 | 342 | else len = 0; |
irsanjul | 0:ad254d5f94b1 | 343 | } |
irsanjul | 0:ad254d5f94b1 | 344 | } |
irsanjul | 0:ad254d5f94b1 | 345 | |
irsanjul | 0:ad254d5f94b1 | 346 | void SC16IS752::writeBytes(const char *data, int len) |
irsanjul | 0:ad254d5f94b1 | 347 | { |
irsanjul | 0:ad254d5f94b1 | 348 | #if ENABLE_BULK_TRANSFERS |
irsanjul | 0:ad254d5f94b1 | 349 | int idx; |
irsanjul | 0:ad254d5f94b1 | 350 | |
irsanjul | 0:ad254d5f94b1 | 351 | while (len > BULK_BLOCK_LEN) |
irsanjul | 0:ad254d5f94b1 | 352 | { |
irsanjul | 0:ad254d5f94b1 | 353 | while(rd(TXLVL) < BULK_BLOCK_LEN) |
irsanjul | 0:ad254d5f94b1 | 354 | { |
irsanjul | 0:ad254d5f94b1 | 355 | wait_us(10); |
irsanjul | 0:ad254d5f94b1 | 356 | }; |
irsanjul | 0:ad254d5f94b1 | 357 | |
irsanjul | 0:ad254d5f94b1 | 358 | wrblock(data, BULK_BLOCK_LEN); |
irsanjul | 0:ad254d5f94b1 | 359 | |
irsanjul | 0:ad254d5f94b1 | 360 | len -= BULK_BLOCK_LEN; |
irsanjul | 0:ad254d5f94b1 | 361 | data += BULK_BLOCK_LEN; |
irsanjul | 0:ad254d5f94b1 | 362 | } |
irsanjul | 0:ad254d5f94b1 | 363 | |
irsanjul | 0:ad254d5f94b1 | 364 | for (idx=0; idx<len; idx++) |
irsanjul | 0:ad254d5f94b1 | 365 | { |
irsanjul | 0:ad254d5f94b1 | 366 | while (rd(TXLVL) == 0) |
irsanjul | 0:ad254d5f94b1 | 367 | { |
irsanjul | 0:ad254d5f94b1 | 368 | wait_us(10); |
irsanjul | 0:ad254d5f94b1 | 369 | }; |
irsanjul | 0:ad254d5f94b1 | 370 | wr(THR, data[idx]); |
irsanjul | 0:ad254d5f94b1 | 371 | } |
irsanjul | 0:ad254d5f94b1 | 372 | #else |
irsanjul | 0:ad254d5f94b1 | 373 | int idx; |
irsanjul | 0:ad254d5f94b1 | 374 | |
irsanjul | 0:ad254d5f94b1 | 375 | for (idx=0; idx<len; idx++) |
irsanjul | 0:ad254d5f94b1 | 376 | { |
irsanjul | 0:ad254d5f94b1 | 377 | while (rd(TXLVL) == 0) |
irsanjul | 0:ad254d5f94b1 | 378 | { |
irsanjul | 0:ad254d5f94b1 | 379 | wait_us(10); |
irsanjul | 0:ad254d5f94b1 | 380 | }; |
irsanjul | 0:ad254d5f94b1 | 381 | wr(THR, str[idx]); |
irsanjul | 0:ad254d5f94b1 | 382 | } |
irsanjul | 0:ad254d5f94b1 | 383 | #endif |
irsanjul | 0:ad254d5f94b1 | 384 | } |
irsanjul | 0:ad254d5f94b1 | 385 | |
irsanjul | 0:ad254d5f94b1 | 386 | |
irsanjul | 0:ad254d5f94b1 | 387 | bool SC16IS752::init(int baudrate) |
irsanjul | 0:ad254d5f94b1 | 388 | { |
irsanjul | 0:ad254d5f94b1 | 389 | if(!swReset())return 0; |
irsanjul | 0:ad254d5f94b1 | 390 | if(!baud(baudrate))return 0; |
irsanjul | 0:ad254d5f94b1 | 391 | if(!format())return 0; |
irsanjul | 0:ad254d5f94b1 | 392 | if(!set_flow_control())return 0; |
irsanjul | 0:ad254d5f94b1 | 393 | if(!set_fifo_control())return 0; |
irsanjul | 0:ad254d5f94b1 | 394 | if(!flush())return 0; |
irsanjul | 0:ad254d5f94b1 | 395 | if(!set_modem_control())return 0; |
irsanjul | 0:ad254d5f94b1 | 396 | if(!set_flow_triggers())return 0; |
irsanjul | 0:ad254d5f94b1 | 397 | |
irsanjul | 0:ad254d5f94b1 | 398 | return true; |
irsanjul | 0:ad254d5f94b1 | 399 | } |