diff --git a/IO.cpp b/IO.cpp index 00521aa..344244e 100644 --- a/IO.cpp +++ b/IO.cpp @@ -1,8 +1,8 @@ /* * Copyright (C) 2015,2016 by Jonathan Naylor G4KLX * Copyright (C) 2016,2017,2018 by Andy Uribe CA6JAU - * Copyright (C) 2017 by Danilo DB4PLE - + * Copyright (C) 2017 by Danilo DB4PLE + * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -105,9 +105,9 @@ void CIO::process() uint8_t bit; uint32_t scantime; uint8_t control; - + m_ledCount++; - + if (m_started) { // Two seconds timeout if (m_watchdog >= 19200U) { @@ -194,7 +194,7 @@ void CIO::process() if (m_rxBuffer.getData() >= 1U) { m_rxBuffer.get(bit, control); - + switch (m_modemState_prev) { case STATE_DSTAR: dstarRX.databit(bit); @@ -229,9 +229,9 @@ void CIO::process() } void CIO::start() -{ +{ m_TotalModes = 0U; - + if(m_dstarEnable) { m_Modes[m_TotalModes] = STATE_DSTAR; m_TotalModes++; @@ -252,7 +252,7 @@ void CIO::start() m_Modes[m_TotalModes] = STATE_NXDN; m_TotalModes++; } - + #if defined(ENABLE_SCAN_MODE) if(m_TotalModes > 1U) m_scanEnable = true; @@ -267,9 +267,9 @@ void CIO::start() if (m_started) return; - + startInt(); - + m_started = true; } @@ -284,7 +284,7 @@ void CIO::write(uint8_t* data, uint16_t length, const uint8_t* control) else m_txBuffer.put(data[i], control[i]); } - + // Switch the transmitter on if needed if (!m_tx) { setTX(); @@ -338,6 +338,24 @@ uint8_t CIO::setFreq(uint32_t frequency_rx, uint32_t frequency_tx, uint8_t rf_po return 4U; #endif +// Check if we have a single, dualband or duplex board +#if defined (ZUMSPOT_ADF7021) + if (!(io.hasSingleADF7021())) { + // There are two ADF7021s on the board + if (io.isDualBand()) { + // Dual band + if ((frequency_tx <= VHF2_MAX) && (frequency_rx <= VHF2_MAX)) { + // Turn on VHF side + io.setBandVHF(true); + } else if ((frequency_tx >= UHF1_MIN) && (frequency_rx >= UHF1_MIN)) { + // Turn on UHF side + io.setBandVHF(false); + } + } + } + +#endif + // Configure frequency m_frequency_rx = frequency_rx; m_frequency_tx = frequency_tx; diff --git a/IO.h b/IO.h index b455cff..bbc546b 100644 --- a/IO.h +++ b/IO.h @@ -1,8 +1,8 @@ /* * Copyright (C) 2015,2016 by Jonathan Naylor G4KLX * Copyright (C) 2016,2017,2018 by Andy Uribe CA6JAU - * Copyright (C) 2017 by Danilo DB4PLE - + * Copyright (C) 2017 by Danilo DB4PLE + * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -124,6 +124,9 @@ public: uint32_t getWatchdog(void); void getIntCounter(uint16_t &int1, uint16_t &int2); void selfTest(void); + void setBandVHF(bool vhf_on); + bool hasSingleADF7021(void); + bool isDualBand(void); // RF interface API void setTX(void); @@ -164,7 +167,7 @@ private: uint16_t m_RX_F_divider; uint8_t m_TX_N_divider; uint16_t m_TX_F_divider; - + bool m_started; CBitRB m_rxBuffer; CBitRB m_txBuffer; diff --git a/IOSTM.cpp b/IOSTM.cpp index 7fb5d84..f943d7b 100644 --- a/IOSTM.cpp +++ b/IOSTM.cpp @@ -115,6 +115,15 @@ #define PIN_RXD GPIO_Pin_4 #define PORT_RXD GPIOB +#define PIN_SGL_DBL GPIO_Pin_12 +#define PORT_SGL_DBL GPIOA + +#define PIN_DL_DPX GPIO_Pin_15 +#define PORT_DL_DPX GPIOC + +#define PIN_SET_BAND GPIO_Pin_15 +#define PORT_SET_BAND GPIOA + // TXD used in SPI Data mode of ADF7021 // TXD is TxRxCLK of ADF7021, standard TX/RX data interface #define PIN_TXD GPIO_Pin_3 @@ -326,6 +335,30 @@ void CIO::Init() GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); #endif +#if defined(ZUMSPOT_ADF7021) + // Pin defines if the board has a single ADF7021 or double + GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStruct.GPIO_Pin = PIN_SGL_DBL; + GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(PORT_SGL_DBL, &GPIO_InitStruct); + + // Pin defines if the board is dual band or duplex + GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStruct.GPIO_Pin = PIN_DL_DPX; + GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU; + GPIO_Init(PORT_DL_DPX, &GPIO_InitStruct); + + // Pin will set UHF or VHF + GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStruct.GPIO_Pin = PIN_SET_BAND; + GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; + GPIO_Init(PORT_SET_BAND, &GPIO_InitStruct); + // TODO: Remove this line + // GPIO_WriteBit(PORT_SET_BAND, PIN_SET_BAND, Bit_RESET); + +#endif + +#if defined(STM32_USB_HOST) // Pin PA11,PA12 = LOW, USB Reset GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12; @@ -334,6 +367,8 @@ void CIO::Init() GPIO_WriteBit(GPIOA, GPIO_Pin_11, Bit_RESET); GPIO_WriteBit(GPIOA, GPIO_Pin_12, Bit_RESET); +#endif + #if defined(LONG_USB_RESET) // 10 ms delay delay_us(10000U); @@ -719,6 +754,17 @@ void CIO::COS_pin(bool on) GPIO_WriteBit(PORT_COS_LED, PIN_COS_LED, on ? Bit_SET : Bit_RESET); } +void CIO::setBandVHF(bool vhf_on) { + GPIO_WriteBit(PORT_SET_BAND, PIN_SET_BAND, vhf_on ? Bit_SET : Bit_RESET); +} + +bool CIO::hasSingleADF7021() { + return GPIO_ReadInputDataBit(PORT_SGL_DBL, PIN_SGL_DBL) == Bit_SET; +} + +bool CIO::isDualBand() { + return GPIO_ReadInputDataBit(PORT_DL_DPX, PIN_DL_DPX) == Bit_SET; +} /** * Function delay_us() from stm32duino project