Improving ADF7021 interface, fixing small bugs

pull/2/head
Andy CA6JAU 9 years ago
parent 83d1916b11
commit fc0d47af0a

@ -32,6 +32,9 @@
volatile uint32_t AD7021_control_byte; volatile uint32_t AD7021_control_byte;
volatile int AD7021_counter; volatile int AD7021_counter;
uint32_t ADF7021_RX_REG0;
uint32_t ADF7021_TX_REG0;
void Send_AD7021_control() void Send_AD7021_control()
{ {
for(AD7021_counter = 31; AD7021_counter >= 0; AD7021_counter--) { for(AD7021_counter = 31; AD7021_counter >= 0; AD7021_counter--) {
@ -52,13 +55,17 @@ void Send_AD7021_control()
io.SDATA_pin(LOW); io.SDATA_pin(LOW);
} }
void Send_REG0_RX() void CIO::ifConf()
{ {
uint32_t ADF7021_RX_REG0; float divider;
float divider; uint8_t N_divider;
uint8_t N_divider;
uint16_t F_divider; uint16_t F_divider;
uint32_t ADF7021_REG2 = 0;
uint32_t ADF7021_REG3 = 0;
uint32_t ADF7021_REG4 = 0;
uint32_t ADF7021_REG13 = 0;
divider = (m_frequency_rx - 100000) / (ADF7021_PFD / 2.0); divider = (m_frequency_rx - 100000) / (ADF7021_PFD / 2.0);
N_divider = floor(divider); N_divider = floor(divider);
@ -70,17 +77,6 @@ void Send_REG0_RX()
ADF7021_RX_REG0 |= (uint32_t) N_divider << 19; // frequency; ADF7021_RX_REG0 |= (uint32_t) N_divider << 19; // frequency;
ADF7021_RX_REG0 |= (uint32_t) F_divider << 4; // frequency; ADF7021_RX_REG0 |= (uint32_t) F_divider << 4; // frequency;
AD7021_control_byte = ADF7021_RX_REG0;
Send_AD7021_control();
}
void Send_REG0_TX()
{
uint32_t ADF7021_TX_REG0;
float divider;
uint8_t N_divider;
uint16_t F_divider;
divider = m_frequency_tx / (ADF7021_PFD / 2.0); divider = m_frequency_tx / (ADF7021_PFD / 2.0);
N_divider = floor(divider); N_divider = floor(divider);
@ -92,17 +88,6 @@ void Send_REG0_TX()
ADF7021_TX_REG0 |= (uint32_t) N_divider << 19; // frequency; ADF7021_TX_REG0 |= (uint32_t) N_divider << 19; // frequency;
ADF7021_TX_REG0 |= (uint32_t) F_divider << 4; // frequency; ADF7021_TX_REG0 |= (uint32_t) F_divider << 4; // frequency;
AD7021_control_byte = ADF7021_TX_REG0;
Send_AD7021_control();
}
void CIO::ifConf()
{
uint32_t ADF7021_REG2 = 0;
uint32_t ADF7021_REG3 = 0;
uint32_t ADF7021_REG4 = 0;
uint32_t ADF7021_REG13 = 0;
if (m_dstarEnable) { if (m_dstarEnable) {
// Dev: 1200 Hz, symb rate = 4800 // Dev: 1200 Hz, symb rate = 4800
@ -208,6 +193,9 @@ void CIO::ifConf()
AD7021_control_byte = ADF7021_REG5; AD7021_control_byte = ADF7021_REG5;
Send_AD7021_control(); Send_AD7021_control();
// Frequency RX (0)
setRX();
// MODULATION (2) // MODULATION (2)
ADF7021_REG2 |= (uint32_t) 0b0010; // register 2 ADF7021_REG2 |= (uint32_t) 0b0010; // register 2
ADF7021_REG2 |= (uint32_t) m_power << 13; // power level ADF7021_REG2 |= (uint32_t) m_power << 13; // power level
@ -247,18 +235,23 @@ void CIO::ifConf()
//====================================================================================================================== //======================================================================================================================
void CIO::setTX() void CIO::setTX()
{ {
AD7021_control_byte = ADF7021_TX_REG0;
Send_AD7021_control();
PTT_pin(HIGH); PTT_pin(HIGH);
LED_pin(LOW); LED_pin(LOW);
Send_REG0_TX();
} }
//====================================================================================================================== //======================================================================================================================
void CIO::setRX() void CIO::setRX()
{ {
delay_rx();
AD7021_control_byte = ADF7021_RX_REG0;
Send_AD7021_control();
PTT_pin(LOW); PTT_pin(LOW);
LED_pin(HIGH); LED_pin(HIGH);
delay_rx();
Send_REG0_RX();
} }
#endif #endif

@ -189,8 +189,6 @@ www.analog.com/media/en/technical-documentation/data-sheets/ADF7021.pdf
#define bitRead(value, bit) (((value) >> (bit)) & 0x01) #define bitRead(value, bit) (((value) >> (bit)) & 0x01)
void Send_AD7021_control(void); void Send_AD7021_control(void);
void Send_REG0_RX(void);
void Send_REG0_TX(void);
#endif #endif

@ -57,8 +57,10 @@ void CIO::process()
// Switch off the transmitter if needed // Switch off the transmitter if needed
if (m_txBuffer.getData() == 0U && m_tx) { if (m_txBuffer.getData() == 0U && m_tx) {
m_tx = false; DEB_pin(LOW);
setRX(); setRX();
m_tx = false;
DEB_pin(LOW);
} }
if (m_rxBuffer.getData() >= 1U) { if (m_rxBuffer.getData() >= 1U) {
@ -83,6 +85,8 @@ void CIO::interrupt()
return; return;
if(m_tx) { if(m_tx) {
DEB_pin(HIGH);
m_txBuffer.get(bit); m_txBuffer.get(bit);
if(bit) if(bit)
@ -98,7 +102,6 @@ void CIO::interrupt()
m_rxBuffer.put(bit); m_rxBuffer.put(bit);
} }
} }
void CIO::start() void CIO::start()
@ -108,9 +111,6 @@ void CIO::start()
if (m_started) if (m_started)
return; return;
delay_rx();
setRX();
startInt(); startInt();
m_started = true; m_started = true;

@ -70,12 +70,15 @@ extern "C" {
} }
void CIO::delay_rx() { void CIO::delay_rx() {
delayMicroseconds(1); #if defined (__STM32F1__)
delayMicroseconds(290);
#else
delayMicroseconds(150);
#endif
} }
void CIO::dlybit(void) void CIO::dlybit(void)
{ {
volatile unsigned int delay;
delayMicroseconds(1); delayMicroseconds(1);
} }

@ -80,15 +80,33 @@ extern "C" {
} }
} }
/**
* Function delay_us() from stm32duino project
*
* @brief Delay the given number of microseconds.
*
* @param us Number of microseconds to delay.
*/
static inline void delay_us(uint32_t us) {
us *= 12;
/* fudge for function call overhead */
us--;
asm volatile(" mov r0, %[us] \n\t"
"1: subs r0, #1 \n\t"
" bhi 1b \n\t"
:
: [us] "r" (us)
: "r0");
}
void CIO::delay_rx() { void CIO::delay_rx() {
volatile unsigned int delay; delay_us(340);
for(delay = 0;delay<512;delay++);
} }
void CIO::dlybit(void) void CIO::dlybit(void)
{ {
volatile unsigned int delay; delay_us(1);
for(delay = 0;delay<5;delay++);
} }
void CIO::Init() void CIO::Init()

Loading…
Cancel
Save

Powered by TurnKey Linux.