From 705eeda6201d182585317bd0edb84b541e449d6e Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Wed, 20 Mar 2013 04:23:41 +0000 Subject: parts of rda1846dongle working git-svn-id: https://svn.spreadspace.org/mur.sat@702 7de4ea59-55d0-425e-a1af-a3118ea81d4c --- software/rda1846dongle/rda1846.c | 125 +++++++++++++++++++++++++++++++++++---- 1 file changed, 114 insertions(+), 11 deletions(-) (limited to 'software/rda1846dongle/rda1846.c') diff --git a/software/rda1846dongle/rda1846.c b/software/rda1846dongle/rda1846.c index ecab5d3..c806036 100644 --- a/software/rda1846dongle/rda1846.c +++ b/software/rda1846dongle/rda1846.c @@ -44,6 +44,7 @@ static uint8_t rda1846_write_register_raw(const uint8_t addr, const uint16_t dat i2c_error: TWI_StopTransmission(); + printf("I2C error (write_register_raw)\r\n"); return 1; } @@ -69,6 +70,7 @@ static uint8_t rda1846_read_register_raw(const uint8_t addr, uint16_t* data) i2c_error: TWI_StopTransmission(); + printf("I2C error (write_register_raw)\r\n"); return 1; } @@ -112,6 +114,7 @@ void rda1846_init(void) TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 200000)); // switch to 2m Band (134 ~ 174 MHz) rda1846_write_register(RDA1846_REG_RF_BAND, RDA1846_RF_BAND_2M); +// rda1846_write_register(RDA1846_REG_RF_BAND, RDA1846_RF_BAND_70CM); // set crystal frequency (12.288 MHz) rda1846_write_register(RDA1846_REG_XTAL, RDA1846_XTAL_FREQ); @@ -128,8 +131,53 @@ void rda1846_init(void) // use this if VOX, SQ, TXON_RF, RXON_RF are meant as inputs // rda1846_write_register(RDA1846_REG_GPIO, RDA1846_GPIO_2_INT); - rda1846_write_register(RDA1846_REG_TX_VOICE, RDA1846_TX_VOICE_NONE); - rda1846_write_register(RDA1846_REG_DTMF_CTL, RDA1846_DTMF_DUAL | RDA1846_DTMF_EN); +// rda1846_write_register(RDA1846_REG_TX_VOICE, RDA1846_TX_VOICE_NONE); + rda1846_write_register(RDA1846_REG_TX_VOICE, RDA1846_TX_VOICE_MIC); +// rda1846_write_register(RDA1846_REG_TX_VOICE, RDA1846_TX_VOICE_TONE2); + +// rda1846_write_register(RDA1846_REG_DTMF_CTL, RDA1846_DTMF_DUAL | RDA1846_DTMF_EN); +} + +void rda1846_powerdown(void) +{ + uint16_t data; + if(rda1846_read_register(RDA1846_REG_CTL, &data)) + return; + + data &= ~(RDA1846_CTL_PDN); + rda1846_write_register(RDA1846_REG_CTL, data); +} + +void rda1846_wakeup(void) +{ + uint16_t data; + if(rda1846_read_register(RDA1846_REG_CTL, &data)) + return; + + data |= RDA1846_CTL_PDN; + rda1846_write_register(RDA1846_REG_CTL, data); +} + +void rda1846_receive(void) +{ + uint16_t data; + if(rda1846_read_register(RDA1846_REG_CTL, &data)) + return; + + data |= RDA1846_CTL_RX; + data &= ~(RDA1846_CTL_TX); + rda1846_write_register(RDA1846_REG_CTL, data); +} + +void rda1846_transmit(void) +{ + uint16_t data; + if(rda1846_read_register(RDA1846_REG_CTL, &data)) + return; + + data &= ~(RDA1846_CTL_RX); + data |= RDA1846_CTL_TX; + rda1846_write_register(RDA1846_REG_CTL, data); } void rda1846_soft_reset(void) @@ -161,8 +209,8 @@ uint16_t rda1846_get_flags(void) uint16_t data; if(rda1846_read_register(RDA1846_REG_FLAG, &data)) return 0xFFFF; - - return data; + + return data & 0x1687; } uint8_t rda1846_get_dtmf(uint8_t* idx1, uint8_t* idx2, uint8_t* code) @@ -187,25 +235,80 @@ int32_t rda1846_get_freq_kHz(void) if(ret) return -1; - freq = (((uint32_t)data)<<16); + freq = (((uint32_t)(data & 0x3FFF))<<16); ret = rda1846_read_register(RDA1846_REG_FREQL, &data); if(ret) return -1; - freq |= data; - + freq += data; return (freq>>3); } +#define RDA1846_BAND_LOW 134000 // kHz +#define RDA1846_BAND_HIGH 174000 // kHZ + uint8_t rda1846_set_freq_kHz(int32_t freq) { - if(freq < RDA1846_BAND_LOW || freq > RDA1846_BAND_HIGH) - return 1; + /* if(freq < RDA1846_BAND_LOW || freq > RDA1846_BAND_HIGH) */ + /* return 1; */ freq = freq<<3; - uint8_t ret = rda1846_write_register(RDA1846_REG_FREQH, (uint16_t)(freq>>16)); + uint8_t ret = rda1846_write_register(RDA1846_REG_FREQH, ((freq>>16) & 0x0000FFFF)); if(ret) return 1; - return rda1846_write_register(RDA1846_REG_FREQL, (uint16_t)(freq & 0x0000FFFF)); + return rda1846_write_register(RDA1846_REG_FREQL, (freq & 0x0000FFFF)); +} + +char* rda1846_regaddr_to_string(uint8_t addr) +{ + switch(addr) { + case RDA1846_REG_CTL: return "CTL"; + case RDA1846_REG_GPIO: return "GPIO"; + case RDA1846_REG_INT: return "INT"; + case RDA1846_REG_FLAG: return "FLAG"; + case RDA1846_REG_RSSI: return "RSSI"; + case RDA1846_REG_VSSI: return "VSSI"; + case RDA1846_REG_CLK_MODE: return "CLK_MODE"; + case RDA1846_REG_XTAL: return "XTAL"; + case RDA1846_REG_ADCLK: return "ADCLK"; + case RDA1846_REG_RF_BAND: return "RF_BAND"; + case RDA1846_REG_FREQH: return "FREQH"; + case RDA1846_REG_FREQL: return "FREQL"; + case RDA1846_REG_PA_BIAS: return "PA_BIAS"; + case RDA1846_REG_TX_VOICE: return "TX_VOICE"; + case RDA1846_REG_VOX_OPEN: return "VOX_OPEN"; + case RDA1846_REG_VOX_SHUT: return "VOX_SHUT"; + case RDA1846_REG_SUBAUDIO: return "SUBAUDIO"; + case RDA1846_REG_SQ_OPEN: return "SQ_OPEN"; + case RDA1846_REG_SQ_SHUT: return "SQ_SHUT"; + case RDA1846_REG_DTMF_CTL: return "DTMF_CTL"; + case RDA1846_REG_DTMF_T1: return "DTMF_T1"; + case RDA1846_REG_DTMF_T2: return "DTMF_T2"; + case RDA1846_REG_DTMF_C01: return "DTMF_C01"; + case RDA1846_REG_DTMF_C23: return "DTMF_C23"; + case RDA1846_REG_DTMF_C45: return "DTMF_C45"; + case RDA1846_REG_DTMF_C67: return "DTMF_C67"; + case RDA1846_REG_DTMF_OUT: return "DTMF_OUT"; + default: return "unknown"; + } +} + +void rda1846_dump_register(void) +{ + printf("RDA1846: register dump\r\n"); + + const uint8_t regs[] = { RDA1846_REG_RF_BAND, RDA1846_REG_XTAL, RDA1846_REG_ADCLK, + RDA1846_REG_CLK_MODE, RDA1846_REG_CTL, RDA1846_REG_INT, + RDA1846_REG_GPIO, RDA1846_REG_TX_VOICE, RDA1846_REG_DTMF_CTL, + RDA1846_REG_RSSI, RDA1846_REG_VSSI, RDA1846_REG_FLAG, + RDA1846_REG_DTMF_OUT, RDA1846_REG_FREQH, RDA1846_REG_FREQL }; + + int i; + for(i=0; i