| 
					
				 | 
			
			
				@@ -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; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |