Xbee API library with support SPI connection. (use only SPI supported model. see also http://www.digi.com/support/kbase/kbaseresultdetl?id=3362 )
Dependents: XBeeWiFi_SPI_example
Fork of XBee by
Diff: XBee.cpp
- Revision:
- 9:e32c2e5390d3
- Parent:
- 6:6f84e2840408
- Child:
- 10:eb70be6ceb6d
--- a/XBee.cpp Tue Dec 31 05:31:24 2013 +0000 +++ b/XBee.cpp Fri Jan 03 03:33:03 2014 +0000 @@ -672,6 +672,7 @@ _response.reset(); } +#ifdef XBEE_USE_UART XBee::XBee(PinName p_tx, PinName p_rx): _xbee(p_tx, p_rx) { _pos = 0; _epos = 0; @@ -724,6 +725,31 @@ _response.init(); _response.setFrameData(_responseFrameData); } +#endif + +#ifdef XBEE_USE_SPI +XBee::XBee(PinName p_mosi, PinName p_miso, PinName p_sclk, PinName p_ssel, PinName p_attn, PinName p_reset): + _xbee(p_mosi, p_miso, p_sclk), _ssel(p_ssel), _attn(p_attn), _reset(p_reset) { + _ssel = 1; + + _pos = 0; + _epos = 0; + _escape = false; + _checksumTotal = 0; + _nextFrameId = 0; + + _xbee.format(8,0); + _xbee.frequency(3500000); + + _reset = 0; + wait_ms(20); + _reset = 1; + wait_ms(100); + + _response.init(); + _response.setFrameData(_responseFrameData); +} +#endif uint8_t XBee::getNextFrameId() { @@ -737,9 +763,11 @@ return _nextFrameId; } +#ifdef XBEE_USE_UART void XBee::begin(long baud) { _xbee.baud(baud); } +#endif /* void XBee::setSerial(HardwareSerial serial) { @@ -781,6 +809,7 @@ while (int((millis() - start)) < timeout) { */ + DBG("(readPacket timeout=%d)\r\n", timeout); t.reset(); t.start(); while (t.read_ms() < timeout) { @@ -788,9 +817,11 @@ if (getResponse().isAvailable()) { t.stop(); + DBG("(available %d %d)\r\n", _pos, _epos); return true; } else if (getResponse().isError()) { t.stop(); + DBG("(error %d %d)\r\n", _pos, _epos); return false; } } @@ -801,10 +832,12 @@ return false; } +#ifdef XBEE_USE_UART void XBee::isr_recv () { _rxbuf[_rxaddr_w] = _xbee.getc(); _rxaddr_w = (_rxaddr_w + 1) % MAX_RXBUF_SIZE; } +#endif int XBee::getbuf () { int r; @@ -826,23 +859,40 @@ resetResponse(); } +#ifdef XBEE_USE_UART // while (_xbee.readable()) { while ((! _rts && _xbee.readable()) || (_rts && bufreadable())) { +#else + while (! _attn || bufreadable()) { +#endif +#ifdef XBEE_USE_UART // b = _xbee.getc(); if (_rts) { b = getbuf(); } else { b = _xbee.getc(); } +#else + if (! _attn) { + _ssel = 0; + sendByte(0x00, false); + //_ssel = 1; + } + b = getbuf(); +#endif if (_pos > 0 && b == START_BYTE && ATAP == 2) { // new packet start before previous packeted completed -- discard previous packet and start over DBG("error: %02x %d %d\r\n", b, _pos, _epos); _response.setErrorCode(UNEXPECTED_START_BYTE); +#ifdef XBEE_USE_SPI + _ssel = 1; +#endif return; } +#ifdef XBEE_USE_UART if (_pos > 0 && b == ESCAPE) { if (_xbee.readable()) { // b = _xbee.getc(); @@ -859,13 +909,16 @@ continue; } } +#endif DBG("%02x_", b); +#ifdef XBEE_USE_UART if (_escape == true) { b = 0x20 ^ b; _escape = false; _epos ++; } +#endif // checksum includes all bytes starting with api id if (_pos >= API_ID_INDEX) { @@ -902,6 +955,9 @@ if (_pos > MAX_FRAME_DATA_SIZE) { // exceed max size. should never occur _response.setErrorCode(PACKET_EXCEEDS_BYTE_ARRAY_LENGTH); +#ifdef XBEE_USE_SPI + _ssel = 1; +#endif return; } @@ -933,6 +989,9 @@ _checksumTotal = 0; +#ifdef XBEE_USE_SPI + _ssel = 1; +#endif return; } else { // add to packet array, starting with the fourth byte of the apiFrame @@ -941,6 +1000,9 @@ } } } +#ifdef XBEE_USE_SPI + _ssel = 1; +#endif } // it's peanut butter jelly time!! @@ -1399,6 +1461,9 @@ //} void XBee::send(XBeeRequest &request) { +#ifdef XBEE_USE_SPI + _ssel = 0; +#endif // the new new deal sendByte(START_BYTE, false); @@ -1439,11 +1504,15 @@ // send packet Serial.flush(); */ +#ifdef XBEE_USE_SPI + _ssel = 1; +#endif DBG("\r\n"); } void XBee::sendByte(uint8_t b, bool escape) { +#ifdef XBEE_USE_UART if (escape && (b == START_BYTE || b == ESCAPE || b == XON || b == XOFF)) { // std::cout << "escaping byte [" << toHexString(b) << "] " << std::endl; _xbee.putc(ESCAPE); @@ -1451,6 +1520,14 @@ } else { _xbee.putc(b); } +#else + if (! _attn) { + _rxbuf[_rxaddr_w] = _xbee.write(b); + _rxaddr_w = (_rxaddr_w + 1) % MAX_RXBUF_SIZE; + } else { + _xbee.write(b); + } +#endif DBG("%02x ", b); }