summaryrefslogtreecommitdiff
path: root/software/avr.lib/cc1101.c
diff options
context:
space:
mode:
Diffstat (limited to 'software/avr.lib/cc1101.c')
-rw-r--r--software/avr.lib/cc1101.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/software/avr.lib/cc1101.c b/software/avr.lib/cc1101.c
index 2023c01..9053417 100644
--- a/software/avr.lib/cc1101.c
+++ b/software/avr.lib/cc1101.c
@@ -32,7 +32,7 @@ static cc1101_driver_conf_t drv = {
.spi_write_byte = NULL,
.spi_read_byte = NULL,
.spi_transfer_byte = NULL,
- .freq_corr = 0.0
+ .freq_corr = 1.0
};
/*
@@ -103,10 +103,7 @@ void cc1101_init(cc1101_driver_conf_t conf)
void cc1101_reg_init(void)
{
- // Set freq to 437.525 MHz
- cc1101_spi_write_register(CC1101_REG_RW_FREQ2,0x10); //Frequency Control Word, High Byte
- cc1101_spi_write_register(CC1101_REG_RW_FREQ1,0xD3); //Frequency Control Word, Middle Byte
- cc1101_spi_write_register(CC1101_REG_RW_FREQ0,0xF0); //Frequency Control Word, Low Byte
+ // TODO: init register depending on mode beacon vs. data
}
void cc1101_soft_reset(void)
@@ -119,6 +116,29 @@ void cc1101_powerdown(void)
cc1101_spi_strobe_command(CC1101_CMD_SPWD);
}
+void cc1101_set_freq_hz(uint32_t hz)
+{
+ uint32_t freq = (uint32_t)((float)hz / drv.freq_corr);
+ if(freq <= 0x3FFFFF)
+
+ // TODO: this is only allowed in idle mode
+ cc1101_spi_write_register(CC1101_REG_RW_FREQ0, freq & 0xFF);
+ cc1101_spi_write_register(CC1101_REG_RW_FREQ1, (freq >> 8) & 0xFF);
+ cc1101_spi_write_register(CC1101_REG_RW_FREQ2, (freq >> 16) & 0x3F);
+}
+
+uint32_t cc1101_get_freq_hz(void)
+{
+ uint32_t freq = 0;
+ freq = cc1101_spi_read_register(CC1101_REG_RW_FREQ2) & 0x3F;
+ freq = freq << 8;
+ freq |= cc1101_spi_read_register(CC1101_REG_RW_FREQ1);
+ freq = freq << 8;
+ freq |= cc1101_spi_read_register(CC1101_REG_RW_FREQ0);
+
+ return (uint32_t)((float)freq * drv.freq_corr);
+}
+
static char* cc1101_config_reg_to_string(uint8_t addr)
{
switch(addr) {