summaryrefslogtreecommitdiff
path: root/software/rda1846dongle/rda1846.c
diff options
context:
space:
mode:
authorChristian Pointner <equinox@mur.at>2013-03-20 04:23:41 +0000
committerChristian Pointner <equinox@mur.at>2013-03-20 04:23:41 +0000
commit705eeda6201d182585317bd0edb84b541e449d6e (patch)
tree455e933488f51fa88e979d3831e9bbd76df4754d /software/rda1846dongle/rda1846.c
parentfixed usb footprint (easier drills) (diff)
parts of rda1846dongle working
git-svn-id: https://svn.spreadspace.org/mur.sat@702 7de4ea59-55d0-425e-a1af-a3118ea81d4c
Diffstat (limited to 'software/rda1846dongle/rda1846.c')
-rw-r--r--software/rda1846dongle/rda1846.c125
1 files changed, 114 insertions, 11 deletions
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<sizeof(regs); ++i) {
+ uint16_t data;
+ if(rda1846_read_register(regs[i], &data))
+ data = 0xFFFF;
+ printf(" 0x%02X (%s): 0x%04X\r\n", regs[i], rda1846_regaddr_to_string(regs[i]), data);
+ }
}