From 87e4480a590503b9b7feaf9c6d45089058c1eb95 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Tue, 17 Feb 2015 05:10:56 +0100 Subject: hhd70: getting/setting frequency --- software/avr.lib/cc1101.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) (limited to 'software/avr.lib/cc1101.c') 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) { -- cgit v1.2.3