Tobi's ubw test branch
Dependencies: mavlink_bridge mbed
Fork of AIT_UWB_Range by
Diff: DW1000/DW1000.cpp
- Revision:
- 21:23bf4399020d
- Parent:
- 20:257d56530ae1
- Child:
- 22:576ee999b004
--- a/DW1000/DW1000.cpp Tue Nov 25 15:22:53 2014 +0000 +++ b/DW1000/DW1000.cpp Wed Nov 26 12:10:09 2014 +0000 @@ -3,6 +3,8 @@ DW1000::DW1000(PinName MOSI, PinName MISO, PinName SCLK, PinName CS, PinName IRQ) : irq(IRQ), spi(MOSI, MISO, SCLK), cs(CS) { receiving = false; // state in the beginning is not listening for frames sending = false; // state in the beginning is not sending anything + callbackRX = NULL; // TODO: setter + callbackTX = NULL; deselect(); // Chip must be deselected first spi.format(8,0); // Setup the spi for standard 8 bit data and SPI-Mode 0 (GPIO5, GPIO6 open circuit or ground on DW1000) @@ -65,25 +67,27 @@ if (length >= 1021) length = 1021; // check for maximim length a frame can have TODO: 127 Byte mode? writeRegister(DW1000_TX_BUFFER, 0, message, length); // fill buffer - uint8_t backup = readRegister8(DW1000_TX_FCTRL, 1); // put length of frame including 2 CRC Bytes - length += 2; + uint8_t backup = readRegister8(DW1000_TX_FCTRL, 1); // put length of frame + length += 2; // including 2 CRC Bytes length = ((backup & 0xFC) << 8) | (length & 0x03FF); - writeRegister(DW1000_TX_FCTRL, 0, (uint8_t*)&length, 2); + writeRegister16(DW1000_TX_FCTRL, 0, length); - if (receiving) stopTRX(); // stop receiving if we are in this state - sending = true; + /*if (receiving)*/ stopTRX(); // stop receiving if we are in this state + //sending = true; + wait(0.01); writeRegister8(DW1000_SYS_CTRL, 0, 0x02); // trigger sending process by setting the TXSTRT bit + wait(0.01); } void DW1000::startRX() { - while(sending); // block until sending finished TODO: the right way?? - receiving = true; + //while(sending); // block until sending finished TODO: the right way?? + //receiving = true; writeRegister8(DW1000_SYS_CTRL, 0x01, 0x01); // start listening for preamble by setting the RXENAB bit } void DW1000::stopRX() { - receiving = false; stopTRX(); + //receiving = false; } // PRIVATE Methods ------------------------------------------------------------------------------------ @@ -113,13 +117,17 @@ void DW1000::ISR() { uint64_t status = getStatus(); if (status & 0x4000) { - callbackRX(getFramelength()); + if (callbackRX != NULL) + callbackRX(getFramelength()); } if (status & 0x80) { sending = false; - if (receiving) startRX(); // enable receiver again if we need to preserve state TODO: have to do it here?? - callbackTX(); + wait(0.1); + /*if (receiving)*/ startRX(); // enable receiver again if we need to preserve state TODO: have to do it here?? + if (callbackTX != NULL) + callbackTX(); } + //writeRegister16(DW1000_SYS_STATUS, 0, 0x1111); // TODO: clearing status bits not necessary? } uint16_t DW1000::getFramelength() {