diff options
| author | Sadeep Madurange <sadeep@asciimx.com> | 2024-12-07 19:35:20 +0800 |
|---|---|---|
| committer | Sadeep Madurange <sadeep@asciimx.com> | 2024-12-07 19:35:20 +0800 |
| commit | ddf550e831489939df75e6a3ec43d65560ae6c64 (patch) | |
| tree | 5fe4fed53b8b41cc94de200269627869d95a50dd /rf_test/radio.c | |
| parent | 9ed70e05ffb6b0bdc8cd3c5160b5f21457b04654 (diff) | |
| download | smart-home-ddf550e831489939df75e6a3ec43d65560ae6c64.tar.gz | |
radio init.
Diffstat (limited to 'rf_test/radio.c')
| -rw-r--r-- | rf_test/radio.c | 86 |
1 files changed, 51 insertions, 35 deletions
diff --git a/rf_test/radio.c b/rf_test/radio.c index 6f8c9c4..ddc3e7c 100644 --- a/rf_test/radio.c +++ b/rf_test/radio.c @@ -6,14 +6,50 @@ #include "radio.h" #include "serial.h" -#define SPI_SS PB2 -#define SPI_SCK PB5 -#define SPI_MISO PB4 -#define SPI_MOSI PB3 -#define SPI_DDR DDRB -#define SPI_PORT PORTB +#define SPI_SS PB2 +#define SPI_SCK PB5 +#define SPI_MISO PB4 +#define SPI_MOSI PB3 +#define SPI_DDR DDRB +#define SPI_PORT PORTB -#define MAX_POWER_LEVEL 23 +#define OP_MODE_SLEEP 0x00 +#define OP_MODE_STDBY 0x04 +#define OP_MODE_FS 0x08 +#define OP_MODE_RX 0x10 +#define OP_MODE_TX 0x0C + +#define MAX_POWER_LEVEL 23 + +static inline void set_power_level(uint8_t pwl) +{ + uint8_t pa_mask; + + if (pwl < 16) { + pwl += 16; + pa_mask = 0x40; + } else { + pwl += pwl < 20 ? 10 : 8; + pa_mask = 0x40 | 0x20; + } + + write_reg(0x5A, 0x5D); + write_reg(0x5C, 0x7C); + write_reg(0x11, (pa_mask | pwl)); +} + +static inline set_mode(uint8_t mode) +{ + write_reg(0x01, ((read_reg(0x01) & 0xE3) | mode)); + + switch (mode) { + case OP_MODE_TX: + write_reg(0x5A, 0x5D); + write_reg(0x5C, 0x7C); + break; + case OP_MODE_RX: + } +} static inline uint8_t read_reg(uint8_t reg) { @@ -103,34 +139,6 @@ uint8_t radio_recv(char *buf, uint8_t n) return read_len; } -static inline void set_high_power_pa(uint8_t enable) -{ - write_reg(0x5A, (enable ? 0x5D : 0x55)); - write_reg(0x5C, (enable ? 0x7C : 0x70)); -} - -static inline void set_power_level(uint8_t pwl) -{ - uint8_t pa_mask; - - if (pwl < 16) { - pwl += 16; - pa_mask = 0x40; - } else { - pwl += pwl < 20 ? 10 : 8; - pa_mask = 0x40 | 0x20; - } - - set_high_power_pa(1); - write_reg(0x11, (pa_mask | pwl)); -} - -void radio_high_power(void) -{ - write_reg(0x13, 0x0F); - set_power_level(MAX_POWER_LEVEL); -} - void radio_init(struct radio_cfg *cfg) { SPI_DDR |= (1 << SPI_SS) | (1 << SPI_SCK) | (1 << SPI_MOSI); @@ -185,4 +193,12 @@ void radio_init(struct radio_cfg *cfg) // disable encryption write_reg(0x3D, ((read_reg(0x3D) & 0xFE) | 0x00)); + + // enable high power amps + write_reg(0x13, 0x0F); + set_power_level(MAX_POWER_LEVEL); + + write_reg(0x01, ((read_reg(0x01) & 0xE3) | 0x04)); + while (!(read_reg(0x27) & 0x80)) + ; } |
