DW1000 UWB driver based on work of Matthias Grob & Manuel Stalder - ETH Zürich - 2015
Diff: DW1000.cpp
- Revision:
- 1:dcbd071f38d5
- Parent:
- 0:bddb8cd5e7df
- Child:
- 3:1459d2aa6b97
- Child:
- 16:2080adef6fa6
--- a/DW1000.cpp Tue Apr 05 10:51:00 2016 +0000 +++ b/DW1000.cpp Tue Apr 05 11:37:23 2016 +0000 @@ -141,7 +141,7 @@ writeRegister8(DW1000_TX_CAL, 0x00, 0x01); writeRegister8(DW1000_TX_CAL, 0x00, 0x00); data = readRegister8(DW1000_TX_CAL, 0x03); // get the 8-Bit reading for Voltage - float Voltage = (float)(data - readOTP8(0x08)) *0.00578 + 3.3; + float Voltage = (float)(data - (readOTP(0x08)&0x00ff)) *0.00578 + 3.3; return Voltage; } @@ -155,7 +155,7 @@ writeRegister8(DW1000_TX_CAL, 0x00, 0x01); writeRegister8(DW1000_TX_CAL, 0x00, 0x00); data = readRegister16(DW1000_TX_CAL, 0x04); // get the 8-Bit reading for Temperature - float temperature = (float)(data - readOTP8(0x09))*0.9 + 23; + float temperature = (float)(data - (readOTP(0x09) & 0x00ff))*0.9 + 23; return temperature; } @@ -267,10 +267,11 @@ void DW1000::loadLDOTUNE() { - uint64_t LDOTuningValue = readOTP40(0x0004); - if (LDOTuningValue != 0) + uint64_t LDOTuningValue = readOTP(0x0004); + if (LDOTuningValue != 0) { + LDOTuningValue = LDOTuningValue | ((uint64_t)(readOTP(0x0005) & 0x00ff) << 32); writeRegister40(DW1000_RF_CONF,DWRFCONF_RF_LDOTUNE,LDOTuningValue); - + } } void DW1000::resetRX() @@ -294,7 +295,7 @@ } /// After writes have been completed reset the device. -bool DW1000::writeOTP(uint16_t address,uint32_t data) +bool DW1000::writeOTP(uint16_t word_address,uint32_t data) { spi.frequency(SPIRATE_OSC); // with a 1MHz clock rate (worked up to 49MHz in our Test) @@ -325,13 +326,13 @@ writeRegister8(DW1000_OTP_IF,DWOTP_OTP_CTRL,0x00); // writeRegister32(DW1000_OTP_IF,DWOTP_OTP_WDAT,data); // - writeRegister16(DW1000_OTP_IF,DWOTP_OTP_ADDR,address); // + writeRegister16(DW1000_OTP_IF,DWOTP_OTP_ADDR,word_address); // writeRegister8(DW1000_OTP_IF,DWOTP_OTP_CTRL,0x40); // writeRegister8(DW1000_OTP_IF,DWOTP_OTP_CTRL,0x00); // wait_ms(1); for (int i=0; i<10; i++) { - if (readOTP32(address) == data) + if (readOTP(word_address) == data) return true; writeRegister8(DW1000_OTP_IF,DWOTP_OTP_CTRL,0x40); // retry writeRegister8(DW1000_OTP_IF,DWOTP_OTP_CTRL,0x00); @@ -340,19 +341,10 @@ return false; } -uint32_t DW1000::readOTP (uint16_t word_address, uint8_t size) { - if (size == 1) - return readOTP8(word_address); - else if (size == 2) - return readOTP16(word_address); - else - return readOTP32(word_address); - } - -uint32_t DW1000::readOTP32(uint16_t address) +uint32_t DW1000::readOTP(uint16_t word_address) { - writeRegister16(DW1000_OTP_IF,DWOTP_OTP_ADDR,address); // write address + writeRegister16(DW1000_OTP_IF,DWOTP_OTP_ADDR,word_address); // write address writeRegister8(DW1000_OTP_IF,DWOTP_OTP_CTRL,0x03); // read address load writeRegister8(DW1000_OTP_IF,DWOTP_OTP_CTRL,0x01); // read uint32_t data = readRegister32(DW1000_OTP_IF,DWOTP_OTP_RDAT); @@ -360,16 +352,6 @@ return data; } -uint8_t DW1000::readOTP8(uint16_t address) -{ - writeRegister16(DW1000_OTP_IF,DWOTP_OTP_ADDR,address); // write address - writeRegister8(DW1000_OTP_IF,DWOTP_OTP_CTRL,0x03); // read address load - writeRegister8(DW1000_OTP_IF,DWOTP_OTP_CTRL,0x01); // read - uint8_t data = readRegister8(DW1000_OTP_IF,DWOTP_OTP_RDAT); - writeRegister8(DW1000_OTP_IF,DWOTP_OTP_CTRL,0x00); // OTP idle - return data; -} - void DW1000::setInterrupt(bool RX, bool TX) { writeRegister16(DW1000_SYS_MASK, 0, RX*0x4000 | TX*0x0080); // RX good frame 0x4000, TX done 0x0080