MDUV3x0: updated radio driver

This commit is contained in:
Silvano Seva 2024-09-29 17:17:16 +02:00
parent 0c4a0435a8
commit 8f9502cade
5 changed files with 63 additions and 6 deletions

View File

@ -24,9 +24,7 @@
#include <OpMode_FM.hpp> #include <OpMode_FM.hpp>
#include <rtx.h> #include <rtx.h>
#if defined(PLATFORM_MDUV3x0) #if defined(PLATFORM_TTWRPLUS)
#include "../../../drivers/baseband/HR_C6000.h"
#elif defined(PLATFORM_TTWRPLUS)
#include "AT1846S.h" #include "AT1846S.h"
#endif #endif
@ -50,7 +48,7 @@ void _setVolume()
#if defined(PLATFORM_MDUV3x0) #if defined(PLATFORM_MDUV3x0)
// Apply new volume level, map 0 - 255 range into -31 to 31 // Apply new volume level, map 0 - 255 range into -31 to 31
int8_t gain = ((int8_t) (volume / 4)) - 31; int8_t gain = ((int8_t) (volume / 4)) - 31;
HR_C6000::instance().setDacGain(gain); C6000.setDacGain(gain);
#elif defined(PLATFORM_TTWRPLUS) #elif defined(PLATFORM_TTWRPLUS)
// AT1846S volume control is 4 bit // AT1846S volume control is 4 bit
AT1846S::instance().setRxAudioGain(volume / 16, volume / 16); AT1846S::instance().setRxAudioGain(volume / 16, volume / 16);

View File

@ -43,7 +43,7 @@ static uint8_t txModBias = 0; // VCXO bias for TX
static enum opstatus radioStatus; // Current operating status static enum opstatus radioStatus; // Current operating status
static HR_C6000& C6000 = HR_C6000::instance(); // HR_C5000 driver HR_C6000 C6000((const struct spiDevice *) &c6000_spi, { DMR_CS }); // HR_C6000 driver
static AT1846S& at1846s = AT1846S::instance(); // AT1846S driver static AT1846S& at1846s = AT1846S::instance(); // AT1846S driver
void radio_init(const rtxStatus_t *rtxState) void radio_init(const rtxStatus_t *rtxState)
@ -87,6 +87,11 @@ void radio_init(const rtxStatus_t *rtxState)
/* /*
* Configure AT1846S and HR_C6000, keep AF output disabled at power on. * Configure AT1846S and HR_C6000, keep AF output disabled at power on.
*/ */
gpio_setMode(DMR_CLK, OUTPUT);
gpio_setMode(DMR_MOSI, OUTPUT);
gpio_setMode(DMR_MISO, INPUT);
spi_init((const struct spiDevice *) &c6000_spi);
at1846s.init(); at1846s.init();
C6000.init(); C6000.init();
radio_disableAfOutput(); radio_disableAfOutput();

View File

@ -18,7 +18,54 @@
* along with this program; if not, see <http://www.gnu.org/licenses/> * * along with this program; if not, see <http://www.gnu.org/licenses/> *
***************************************************************************/ ***************************************************************************/
#include <spi_bitbang.h>
#include <spi_custom.h>
#include <hwconfig.h> #include <hwconfig.h>
#include <pinmap.h>
#include <spi_stm32.h> #include <spi_stm32.h>
/**
* SPI bitbang function for HR_C6000 command interface (U_SPI).
*
* Hand-tuned to be as fast as possible, gives the following clock performance
* when compiled with -Os and run on STM32F405 at 168MHz:
*
* - Freq 6.46MHz
* - Pos. width 71ns
* - Neg. with 83ns
*/
static uint8_t spiC6000_func(const void *priv, uint8_t value)
{
(void) priv;
uint8_t incoming = 0;
__disable_irq();
for(uint8_t cnt = 0; cnt < 8; cnt++)
{
GPIOE->BSRR = (1 << 3); // Set PE3 (CLK)
if(value & (0x80 >> cnt))
GPIOE->BSRR = 1 << 4; // Set PE4 (MOSI)
else
GPIOE->BSRR = 1 << 20; // Clear PE4 (MOSI)
// ~70ns delay
asm volatile(" mov r1, #1 \n"
"___loop_1: cmp r1, #0 \n"
" itt ne \n"
" subne r1, r1, #1 \n"
" bne ___loop_1 \n":::"r1");
incoming <<= 1;
GPIOE->BSRR = (1 << 19); // Clear PE3 (CLK)
incoming |= (GPIOE->IDR >> 5) & 0x01; // Read PE5 (MISO)
}
__enable_irq();
return incoming;
}
SPI_CUSTOM_DEVICE_DEFINE(c6000_spi, spiC6000_func, NULL, NULL)
SPI_STM32_DEVICE_DEFINE(nvm_spi, SPI1, NULL) SPI_STM32_DEVICE_DEFINE(nvm_spi, SPI1, NULL)

View File

@ -24,9 +24,16 @@
#include "pinmap.h" #include "pinmap.h"
#ifdef __cplusplus #ifdef __cplusplus
// Export the HR_C6000 driver only for C++ sources
#include <HR_C6000.h>
extern HR_C6000 C6000;
extern "C" { extern "C" {
#endif #endif
extern const struct spiCustomDevice c6000_spi;
extern const struct spiDevice nvm_spi; extern const struct spiDevice nvm_spi;
/* Device has a working real time clock */ /* Device has a working real time clock */

View File

@ -108,7 +108,7 @@
/* HR_C6000 control interface */ /* HR_C6000 control interface */
#define DMR_SLEEP GPIOE,6 #define DMR_SLEEP GPIOE,6
#define DMR_CS GPIOE,2 #define DMR_CS &GpioE,2
#define DMR_CLK GPIOE,3 #define DMR_CLK GPIOE,3
#define DMR_MOSI GPIOE,4 #define DMR_MOSI GPIOE,4
#define DMR_MISO GPIOE,5 #define DMR_MISO GPIOE,5