|
@@ -4,6 +4,12 @@
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
|
+#undef DBG
|
|
|
+#define DBG if(0)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
void LT8920::dump_register(uint8_t reg)
|
|
|
{
|
|
|
uint16_t r = readRegister(reg);
|
|
@@ -78,273 +84,253 @@ void LT8920::begin()
|
|
|
|
|
|
void LT8920::setChannel(uint8_t channel)
|
|
|
{
|
|
|
- _channel = channel;
|
|
|
- writeRegister(R_CHANNEL, (_channel & CHANNEL_MASK));
|
|
|
+ _channel = channel;
|
|
|
+ writeRegister(R_CHANNEL, (_channel & CHANNEL_MASK));
|
|
|
}
|
|
|
|
|
|
uint8_t LT8920::getChannel()
|
|
|
{
|
|
|
- return _channel;
|
|
|
+ return _channel;
|
|
|
}
|
|
|
|
|
|
void LT8920::setCurrentControl(uint8_t power, uint8_t gain)
|
|
|
{
|
|
|
- writeRegister(R_CURRENT,
|
|
|
- ((power << CURRENT_POWER_SHIFT) & CURRENT_POWER_MASK) |
|
|
|
- ((gain << CURRENT_GAIN_SHIFT) & CURRENT_GAIN_MASK));
|
|
|
+ writeRegister(R_CURRENT,
|
|
|
+ ((power << CURRENT_POWER_SHIFT) & CURRENT_POWER_MASK) |
|
|
|
+ ((gain << CURRENT_GAIN_SHIFT) & CURRENT_GAIN_MASK));
|
|
|
}
|
|
|
|
|
|
bool LT8920::setDataRate(DataRate rate)
|
|
|
{
|
|
|
- uint16_t newValue;
|
|
|
-
|
|
|
- switch (rate)
|
|
|
- {
|
|
|
- case LT8920_1MBPS:
|
|
|
- newValue = DATARATE_1MBPS;
|
|
|
- break;
|
|
|
- case LT8920_250KBPS:
|
|
|
- newValue = DATARATE_250KBPS;
|
|
|
- break;
|
|
|
- case LT8920_125KBPS:
|
|
|
- newValue = DATARATE_125KBPS;
|
|
|
- break;
|
|
|
- case LT8920_62KBPS:
|
|
|
- newValue = DATARATE_62KBPS;
|
|
|
- break;
|
|
|
- default:
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- writeRegister(R_DATARATE, newValue);
|
|
|
- return ( (readRegister(R_DATARATE) & DATARATE_MASK) == (newValue & DATARATE_MASK));
|
|
|
+ uint16_t newValue;
|
|
|
+
|
|
|
+ switch (rate)
|
|
|
+ {
|
|
|
+ case LT8920_1MBPS:
|
|
|
+ newValue = DATARATE_1MBPS;
|
|
|
+ break;
|
|
|
+ case LT8920_250KBPS:
|
|
|
+ newValue = DATARATE_250KBPS;
|
|
|
+ break;
|
|
|
+ case LT8920_125KBPS:
|
|
|
+ newValue = DATARATE_125KBPS;
|
|
|
+ break;
|
|
|
+ case LT8920_62KBPS:
|
|
|
+ newValue = DATARATE_62KBPS;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ writeRegister(R_DATARATE, newValue);
|
|
|
+
|
|
|
+ return ( (readRegister(R_DATARATE) & DATARATE_MASK) == (newValue & DATARATE_MASK));
|
|
|
}
|
|
|
|
|
|
LT8920::DataRate LT8920::getDataRate()
|
|
|
{
|
|
|
- uint16_t value = readRegister(R_DATARATE) & DATARATE_MASK;
|
|
|
- switch (value)
|
|
|
- {
|
|
|
- case DATARATE_1MBPS:
|
|
|
- return LT8920_1MBPS;
|
|
|
- case DATARATE_250KBPS:
|
|
|
- return LT8920_250KBPS;
|
|
|
- case DATARATE_125KBPS:
|
|
|
- return LT8920_125KBPS;
|
|
|
- case DATARATE_62KBPS:
|
|
|
- return LT8920_62KBPS;
|
|
|
- }
|
|
|
+ uint16_t value = readRegister(R_DATARATE) & DATARATE_MASK;
|
|
|
+
|
|
|
+ switch (value)
|
|
|
+ {
|
|
|
+ case DATARATE_1MBPS:
|
|
|
+ return LT8920_1MBPS;
|
|
|
+ case DATARATE_250KBPS:
|
|
|
+ return LT8920_250KBPS;
|
|
|
+ case DATARATE_125KBPS:
|
|
|
+ return LT8920_125KBPS;
|
|
|
+ case DATARATE_62KBPS:
|
|
|
+ return LT8920_62KBPS;
|
|
|
+ default :
|
|
|
+ return LT8920_ERROR;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
uint16_t LT8920::readRegister(uint8_t reg)
|
|
|
{
|
|
|
LT8920_CS_LOW;
|
|
|
- SPI.transfer(REGISTER_READ | (REGISTER_MASK & reg));
|
|
|
- uint8_t high = SPI.transfer(0x00);
|
|
|
- uint8_t low = SPI.transfer(0x00);
|
|
|
+
|
|
|
+ lt_spi_transfer_byte(REGISTER_READ | (REGISTER_MASK & reg));
|
|
|
+ uint8_t high = lt_spi_transfer_byte(0x00);
|
|
|
+ uint8_t low = lt_spi_transfer_byte(0x00);
|
|
|
LT8920_CS_HIGH;
|
|
|
|
|
|
+ DBG printf("reg: %X = %X\r\n", reg, (high << 8 | low));
|
|
|
|
|
|
- // Serial.print(reg);
|
|
|
- // Serial.print(" = ");
|
|
|
- // Serial.println(high << 8 | low);
|
|
|
-
|
|
|
- return (high << 8 | low);
|
|
|
+ return (high << 8 | low);
|
|
|
}
|
|
|
|
|
|
uint8_t LT8920::writeRegister(uint8_t reg, uint16_t data)
|
|
|
{
|
|
|
- uint8_t high = data >> 8;
|
|
|
- uint8_t low = data & 0xFF;
|
|
|
+ uint8_t high = data >> 8;
|
|
|
+ uint8_t low = data & 0xFF;
|
|
|
|
|
|
- return writeRegister2(reg, high, low);
|
|
|
+ return writeRegister2(reg, high, low);
|
|
|
}
|
|
|
|
|
|
uint8_t LT8920::writeRegister2(uint8_t reg, uint8_t high, uint8_t low)
|
|
|
{
|
|
|
-
|
|
|
// char sbuf[32];
|
|
|
// sprintf_P(sbuf, PSTR("%d => %02x%02x"), reg, high, low);
|
|
|
// Serial.println(sbuf);
|
|
|
|
|
|
-
|
|
|
- LT8920_CS_LOW;
|
|
|
- uint8_t result = SPI.transfer(REGISTER_WRITE | (REGISTER_MASK & reg));
|
|
|
- SPI.transfer(high);
|
|
|
- SPI.transfer(low);
|
|
|
-
|
|
|
- LT8920_CS_HIGH;
|
|
|
- return result;
|
|
|
+ LT8920_CS_LOW;
|
|
|
+ uint8_t result = lt_spi_transfer_byte(REGISTER_WRITE | (REGISTER_MASK & reg));
|
|
|
+ lt_spi_transfer_byte(high);
|
|
|
+ lt_spi_transfer_byte(low);
|
|
|
+
|
|
|
+ LT8920_CS_HIGH;
|
|
|
+ return result;
|
|
|
}
|
|
|
|
|
|
void LT8920::sleep()
|
|
|
{
|
|
|
- //set bit 14 on register 35.
|
|
|
- writeRegister(35, readRegister(35) | _BV(14));
|
|
|
+ //set bit 14 on register 35.
|
|
|
+ writeRegister(35, readRegister(35) | _BV(14));
|
|
|
}
|
|
|
|
|
|
void LT8920::whatsUp(void)
|
|
|
{
|
|
|
- uint16_t mode = readRegister(R_CHANNEL);
|
|
|
-
|
|
|
-#if 0
|
|
|
- print("\nTx_EN=");
|
|
|
- println((mode & _BV(CHANNEL_TX_BIT)) != false);
|
|
|
- print("Rx_EN=");
|
|
|
- println((mode & _BV(CHANNEL_RX_BIT)) != false);
|
|
|
- print("Channel=");
|
|
|
- println(mode & CHANNEL_MASK);
|
|
|
-#endif
|
|
|
+ uint16_t mode = readRegister(R_CHANNEL);
|
|
|
|
|
|
- //read the status register.
|
|
|
- uint16_t state = readRegister(R_STATUS);
|
|
|
-
|
|
|
- bool crc_error = state & _BV(15);
|
|
|
- bool fec23_error = state & _BV(14);
|
|
|
- uint8_t framer_st = (state & 0b0011111100000000) >> 8;
|
|
|
- bool pkt_flag = state & _BV(6);
|
|
|
- bool fifo_flag = state & _BV(5);
|
|
|
-
|
|
|
-#if 0
|
|
|
- stream.print("CRC=");
|
|
|
- stream.println(crc_error);
|
|
|
- stream.print("FEC=");
|
|
|
- stream.println(fec23_error);
|
|
|
- stream.print("FRAMER_ST=");
|
|
|
- stream.println(framer_st);
|
|
|
- stream.print("PKT=");
|
|
|
- stream.println(pkt_flag);
|
|
|
- stream.print("FIFO=");
|
|
|
- stream.println(fifo_flag);
|
|
|
-#endif
|
|
|
+ DBG printf("Tx_EN = %u, Rx_EN = %u\r\n", (mode & _BV(CHANNEL_TX_BIT)), (mode & _BV(CHANNEL_RX_BIT)));
|
|
|
+ DBG printf("Channel = %u\r\n", (mode & CHANNEL_MASK));
|
|
|
|
|
|
- uint16_t fifo = readRegister(R_FIFO_CONTROL);
|
|
|
-#if 0
|
|
|
- stream.print("FIFO_WR_PTR=");
|
|
|
- stream.println((fifo >> 8) & 0b111111);
|
|
|
- stream.print("FIFO_RD_PTR=");
|
|
|
- stream.println(fifo & 0b111111);
|
|
|
-#endif
|
|
|
+ //read the status register.
|
|
|
+ uint16_t state = readRegister(R_STATUS);
|
|
|
+
|
|
|
+ bool crc_error = state & _BV(15);
|
|
|
+ bool fec23_error = state & _BV(14);
|
|
|
+ uint8_t framer_st = (state & 0b0011111100000000) >> 8;
|
|
|
+ bool pkt_flag = state & _BV(6);
|
|
|
+ bool fifo_flag = state & _BV(5);
|
|
|
+
|
|
|
+ DBG printf("CRC = %u, FEC = %u, FRAMER_ST = %u, PKT = %u, FIFO = %u\r\n",
|
|
|
+ crc_error, fec23_error, framer_st, pkt_flag, fifo_flag);
|
|
|
+
|
|
|
+ uint16_t fifo = readRegister(R_FIFO_CONTROL);
|
|
|
+
|
|
|
+ DBG printf("FIFO_WR_PTR = %X, FIFO_RD_PTR = %X\r\n",
|
|
|
+ ((fifo >> 8) & 0b111111), (fifo & 0b111111));
|
|
|
}
|
|
|
|
|
|
bool LT8920::available()
|
|
|
{
|
|
|
//read the PKT_FLAG state; this can also be done with a hard wire.
|
|
|
+ if (LT8920_GET_PKT != 0) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
|
|
|
- if (LT8920_GET_PKT != 0)
|
|
|
- {
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
- return false;
|
|
|
+ return false;
|
|
|
}
|
|
|
|
|
|
int LT8920::read(uint8_t *buffer, size_t maxBuffer)
|
|
|
{
|
|
|
- uint16_t value = readRegister(R_STATUS);
|
|
|
- if (bitRead(value, STATUS_CRC_BIT) == 0)
|
|
|
- {
|
|
|
- //CRC ok
|
|
|
-
|
|
|
- uint16_t data = readRegister(R_FIFO);
|
|
|
- uint8_t packetSize = data >> 8;
|
|
|
- if(maxBuffer < packetSize+1)
|
|
|
+ uint16_t value = readRegister(R_STATUS);
|
|
|
+ uint8_t pos = 0;
|
|
|
+
|
|
|
+ if (bitRead(value, STATUS_CRC_BIT) == 0)
|
|
|
{
|
|
|
- //BUFFER TOO SMALL
|
|
|
- return -2;
|
|
|
+ //CRC ok
|
|
|
+ uint16_t data = readRegister(R_FIFO);
|
|
|
+ uint8_t packetSize = data >> 8;
|
|
|
+
|
|
|
+ if (maxBuffer < packetSize + 1) {
|
|
|
+ //BUFFER TOO SMALL
|
|
|
+ return -2;
|
|
|
+ }
|
|
|
+
|
|
|
+ buffer[pos++] = (data & 0xFF);
|
|
|
+
|
|
|
+ while (pos < packetSize)
|
|
|
+ {
|
|
|
+ data = readRegister(R_FIFO);
|
|
|
+ buffer[pos++] = data >> 8;
|
|
|
+ buffer[pos++] = data & 0xFF;
|
|
|
+ }
|
|
|
+
|
|
|
+ return packetSize;
|
|
|
}
|
|
|
-
|
|
|
- uint8_t pos;
|
|
|
- buffer[pos++] = (data & 0xFF);
|
|
|
- while (pos < packetSize)
|
|
|
- {
|
|
|
- data = readRegister(R_FIFO);
|
|
|
- buffer[pos++] = data >> 8;
|
|
|
- buffer[pos++] = data & 0xFF;
|
|
|
+ else {
|
|
|
+ //CRC error
|
|
|
+ return -1;
|
|
|
}
|
|
|
-
|
|
|
- return packetSize;
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- //CRC error
|
|
|
- return -1;
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
void LT8920::startListening()
|
|
|
{
|
|
|
- writeRegister(R_CHANNEL, _channel & CHANNEL_MASK); //turn off rx/tx
|
|
|
- HAL_Delay(3);
|
|
|
- writeRegister(R_FIFO_CONTROL, 0x0080); //flush rx
|
|
|
- writeRegister(R_CHANNEL, (_channel & CHANNEL_MASK) | _BV(CHANNEL_RX_BIT)); //enable RX
|
|
|
- HAL_Delay(5);
|
|
|
+ writeRegister(R_CHANNEL, _channel & CHANNEL_MASK); // turn off rx/tx
|
|
|
+ HAL_Delay(3);
|
|
|
+ writeRegister(R_FIFO_CONTROL, 0x0080); //flush rx
|
|
|
+ writeRegister(R_CHANNEL, (_channel & CHANNEL_MASK) | _BV(CHANNEL_RX_BIT)); //enable RX
|
|
|
+ HAL_Delay(5);
|
|
|
}
|
|
|
|
|
|
/* set the BRCLK_SEL value */
|
|
|
void LT8920::setClock(uint8_t clock)
|
|
|
{
|
|
|
- //register 32, bits 3:1.
|
|
|
- uint16_t val = readRegister(35);
|
|
|
- val &= 0b1111111111110001;
|
|
|
- val |= ((clock & 0x07) << 1);;
|
|
|
+ //register 32, bits 3:1.
|
|
|
+ uint16_t val = readRegister(35);
|
|
|
+ val &= 0b1111111111110001;
|
|
|
+ val |= ((clock & 0x07) << 1);;
|
|
|
|
|
|
- writeRegister(35, val);
|
|
|
+ writeRegister(35, val);
|
|
|
}
|
|
|
|
|
|
bool LT8920::sendPacket(uint8_t *data, size_t packetSize)
|
|
|
{
|
|
|
- if (packetSize < 1 || packetSize > 255)
|
|
|
- {
|
|
|
- return false;
|
|
|
- }
|
|
|
+ if (packetSize < 1 || packetSize > 255)
|
|
|
+ {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
- writeRegister(R_CHANNEL, 0x0000);
|
|
|
- writeRegister(R_FIFO_CONTROL, 0x8000); //flush tx
|
|
|
+ writeRegister(R_CHANNEL, 0x0000);
|
|
|
+ writeRegister(R_FIFO_CONTROL, 0x8000); //flush tx
|
|
|
|
|
|
- //packets are sent in 16bit words, and the first word will be the packet size.
|
|
|
- //start spitting out words until we are done.
|
|
|
+ // packets are sent in 16bit words, and the first word will be the packet size.
|
|
|
+ // start spitting out words until we are done.
|
|
|
|
|
|
- uint8_t pos = 0;
|
|
|
- writeRegister2(R_FIFO, packetSize, data[pos++]);
|
|
|
- while (pos < packetSize)
|
|
|
- {
|
|
|
- uint8_t msb = data[pos++];
|
|
|
- uint8_t lsb = data[pos++];
|
|
|
+ uint8_t pos = 0;
|
|
|
+ writeRegister2(R_FIFO, packetSize, data[pos++]);
|
|
|
+
|
|
|
+ while (pos < packetSize)
|
|
|
+ {
|
|
|
+ uint8_t msb = data[pos++];
|
|
|
+ uint8_t lsb = data[pos++];
|
|
|
|
|
|
- writeRegister2(R_FIFO, msb, lsb);
|
|
|
- }
|
|
|
+ writeRegister2(R_FIFO, msb, lsb);
|
|
|
+ }
|
|
|
|
|
|
- writeRegister(R_CHANNEL, (_channel & CHANNEL_MASK) | _BV(CHANNEL_TX_BIT)); //enable TX
|
|
|
+ writeRegister(R_CHANNEL, (_channel & CHANNEL_MASK) | _BV(CHANNEL_TX_BIT)); //enable TX
|
|
|
|
|
|
- //Wait until the packet is sent.
|
|
|
- while (LT8920_GET_PKT == 0)
|
|
|
- {
|
|
|
- //do nothing.
|
|
|
- }
|
|
|
+ // Wait until the packet is sent.
|
|
|
+ while (LT8920_GET_PKT == 0)
|
|
|
+ {
|
|
|
+ //do nothing.
|
|
|
+ }
|
|
|
|
|
|
- return true;
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
void LT8920::setSyncWord(uint64_t syncWord)
|
|
|
{
|
|
|
- writeRegister(R_SYNCWORD1, syncWord);
|
|
|
- writeRegister(R_SYNCWORD2, syncWord >> 16);
|
|
|
- writeRegister(R_SYNCWORD3, syncWord >> 32);
|
|
|
- writeRegister(R_SYNCWORD4, syncWord >> 48);
|
|
|
+ writeRegister(R_SYNCWORD1, syncWord);
|
|
|
+ writeRegister(R_SYNCWORD2, syncWord >> 16);
|
|
|
+ writeRegister(R_SYNCWORD3, syncWord >> 32);
|
|
|
+ writeRegister(R_SYNCWORD4, syncWord >> 48);
|
|
|
}
|
|
|
|
|
|
void LT8920::setSyncWordLength(uint8_t option)
|
|
|
{
|
|
|
- option &= 0x03;
|
|
|
- option <<= 11;
|
|
|
+ option &= 0x03;
|
|
|
+ option <<= 11;
|
|
|
|
|
|
- writeRegister(32, (readRegister(32) & 0b0001100000000000) | option);
|
|
|
+ writeRegister(32, (readRegister(32) & 0b0001100000000000) | option);
|
|
|
}
|
|
|
|
|
|
uint8_t LT8920::getRSSI()
|
|
|
{
|
|
|
- //RSSI: 15:10
|
|
|
+ // RSSI: 15:10
|
|
|
uint16_t value = readRegister(6);
|
|
|
|
|
|
return (value >> 10);
|
|
@@ -352,6 +338,8 @@ uint8_t LT8920::getRSSI()
|
|
|
|
|
|
void LT8920::scanRSSI(uint16_t *buffer, uint8_t start_channel, uint8_t num_channels)
|
|
|
{
|
|
|
+ uint8_t pos = 0;
|
|
|
+
|
|
|
// writeRegister(R_CHANNEL, _BV(CHANNEL_RX_BIT));
|
|
|
//
|
|
|
// //add read mode.
|
|
@@ -365,16 +353,12 @@ void LT8920::scanRSSI(uint16_t *buffer, uint8_t start_channel, uint8_t num_chann
|
|
|
writeRegister(43, (readRegister(43) & 0b0000000011111111) | ((start_channel & 0b1111111) << 8));
|
|
|
writeRegister(43, (readRegister(43) & 0b0111111111111111) | _BV(15));
|
|
|
|
|
|
- while (LT8920_GET_PKT == 0)
|
|
|
- {
|
|
|
- }
|
|
|
-
|
|
|
+ while (LT8920_GET_PKT == 0) {}
|
|
|
|
|
|
//read the results.
|
|
|
- uint8_t pos = 0;
|
|
|
- while(pos < num_channels)
|
|
|
+ while (pos < num_channels)
|
|
|
{
|
|
|
- uint16_t data = readRegister(R_FIFO);
|
|
|
- buffer[pos++] = data >> 8;
|
|
|
+ uint16_t data = readRegister(R_FIFO);
|
|
|
+ buffer[pos++] = data >> 8;
|
|
|
}
|
|
|
}
|