[CC1101] Receive up to 255 bytes
This commit is contained in:
parent
965631aa47
commit
54405ac042
1 changed files with 56 additions and 25 deletions
|
@ -124,16 +124,11 @@ int16_t CC1101::receive(uint8_t* data, size_t len) {
|
||||||
int16_t state = startReceive();
|
int16_t state = startReceive();
|
||||||
RADIOLIB_ASSERT(state);
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
// wait for sync word
|
// wait for rx queue to exceed threshold.
|
||||||
while (!digitalRead(_mod->getIrq())) {
|
while (!digitalRead(_mod->getIrq())) {
|
||||||
yield();
|
yield();
|
||||||
}
|
}
|
||||||
|
|
||||||
// wait for packet end
|
|
||||||
while(digitalRead(_mod->getIrq())) {
|
|
||||||
yield();
|
|
||||||
}
|
|
||||||
|
|
||||||
// read packet data
|
// read packet data
|
||||||
return(readData(data, len));
|
return(readData(data, len));
|
||||||
}
|
}
|
||||||
|
@ -275,8 +270,9 @@ int16_t CC1101::startReceive() {
|
||||||
// flush Rx FIFO
|
// flush Rx FIFO
|
||||||
SPIsendCommand(CC1101_CMD_FLUSH_RX);
|
SPIsendCommand(CC1101_CMD_FLUSH_RX);
|
||||||
|
|
||||||
// set GDO0 mapping
|
// set GDO0 mapping: Asserted when RX FIFO > 4 bytes.
|
||||||
int state = SPIsetRegValue(CC1101_REG_IOCFG0, CC1101_GDOX_SYNC_WORD_SENT_OR_RECEIVED);
|
int state = SPIsetRegValue(CC1101_REG_IOCFG0, CC1101_GDOX_RX_FIFO_FULL_OR_PKT_END);
|
||||||
|
state |= SPIsetRegValue(CC1101_REG_FIFOTHR, CC1101_FIFO_THR_TX_61_RX_4, 3, 0);
|
||||||
RADIOLIB_ASSERT(state);
|
RADIOLIB_ASSERT(state);
|
||||||
|
|
||||||
// set mode to receive
|
// set mode to receive
|
||||||
|
@ -289,7 +285,7 @@ int16_t CC1101::readData(uint8_t* data, size_t len) {
|
||||||
// get packet length
|
// get packet length
|
||||||
size_t length = len;
|
size_t length = len;
|
||||||
if (len == CC1101_MAX_PACKET_LENGTH) {
|
if (len == CC1101_MAX_PACKET_LENGTH) {
|
||||||
length = getPacketLength();
|
length = getPacketLength(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// check address filtering
|
// check address filtering
|
||||||
|
@ -298,9 +294,42 @@ int16_t CC1101::readData(uint8_t* data, size_t len) {
|
||||||
SPIreadRegister(CC1101_REG_FIFO);
|
SPIreadRegister(CC1101_REG_FIFO);
|
||||||
}
|
}
|
||||||
|
|
||||||
// read packet data
|
uint8_t bytesInFIFO = SPIgetRegValue(CC1101_REG_RXBYTES, 6, 0);
|
||||||
SPIreadRegisterBurst(CC1101_REG_FIFO, length, data);
|
uint16_t readBytes = 0;
|
||||||
|
unsigned long lastPop = millis();
|
||||||
|
|
||||||
|
// keep reading from FIFO until we get all the packet.
|
||||||
|
while (readBytes < length) {
|
||||||
|
if (bytesInFIFO == 0) {
|
||||||
|
if (millis() - lastPop > 5) {
|
||||||
|
// readData was required to read a packet longer than the one received.
|
||||||
|
RADIOLIB_DEBUG_PRINT(F("No data for more than 5mS. Stop here."));
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
delay(1);
|
||||||
|
bytesInFIFO = SPIgetRegValue(CC1101_REG_RXBYTES, 6, 0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// read the minimum between "remaining length" and bytesInFifo
|
||||||
|
uint8_t bytesToRead = min(length - readBytes, bytesInFIFO);
|
||||||
|
SPIreadRegisterBurst(CC1101_REG_FIFO, bytesToRead, &(data[readBytes]));
|
||||||
|
readBytes += bytesToRead;
|
||||||
|
lastPop = millis();
|
||||||
|
|
||||||
|
// Get how many bytes are left in FIFO.
|
||||||
|
bytesInFIFO = SPIgetRegValue(CC1101_REG_RXBYTES, 6, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// add terminating null
|
||||||
|
data[readBytes] = 0;
|
||||||
|
|
||||||
|
// check if status bytes are enabled (default: CC1101_APPEND_STATUS_ON)
|
||||||
|
bool isAppendStatus = SPIgetRegValue(CC1101_REG_PKTCTRL1, 2, 2) == CC1101_APPEND_STATUS_ON;
|
||||||
|
|
||||||
|
// If status byte is enabled at least 2 bytes (2 status bytes + any following packet) will remain in FIFO.
|
||||||
|
if (bytesInFIFO >= 2 && isAppendStatus) {
|
||||||
// read RSSI byte
|
// read RSSI byte
|
||||||
_rawRSSI = SPIgetRegValue(CC1101_REG_FIFO);
|
_rawRSSI = SPIgetRegValue(CC1101_REG_FIFO);
|
||||||
|
|
||||||
|
@ -308,21 +337,23 @@ int16_t CC1101::readData(uint8_t* data, size_t len) {
|
||||||
uint8_t val = SPIgetRegValue(CC1101_REG_FIFO);
|
uint8_t val = SPIgetRegValue(CC1101_REG_FIFO);
|
||||||
_rawLQI = val & 0x7F;
|
_rawLQI = val & 0x7F;
|
||||||
|
|
||||||
// add terminating null
|
// check CRC
|
||||||
data[length] = 0;
|
if (_crcOn && (val & 0b10000000) == 0b00000000) {
|
||||||
|
return (ERR_CRC_MISMATCH);
|
||||||
// flush Rx FIFO
|
}
|
||||||
SPIsendCommand(CC1101_CMD_FLUSH_RX);
|
}
|
||||||
|
|
||||||
// clear internal flag so getPacketLength can return the new packet length
|
// clear internal flag so getPacketLength can return the new packet length
|
||||||
_packetLengthQueried = false;
|
_packetLengthQueried = false;
|
||||||
|
|
||||||
|
// Flush then standby according to RXOFF_MODE (default: CC1101_RXOFF_IDLE)
|
||||||
|
if (SPIgetRegValue(CC1101_REG_MCSM1, 3, 2) == CC1101_RXOFF_IDLE) {
|
||||||
|
|
||||||
|
// flush Rx FIFO
|
||||||
|
SPIsendCommand(CC1101_CMD_FLUSH_RX);
|
||||||
|
|
||||||
// set mode to standby
|
// set mode to standby
|
||||||
standby();
|
standby();
|
||||||
|
|
||||||
// check CRC
|
|
||||||
if (_crcOn && (val & 0b10000000) == 0b00000000) {
|
|
||||||
return (ERR_CRC_MISMATCH);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return(ERR_NONE);
|
return(ERR_NONE);
|
||||||
|
|
Loading…
Add table
Reference in a new issue