diff --git a/Makefile b/Makefile index 1e2f654..cb3b96b 100644 --- a/Makefile +++ b/Makefile @@ -85,8 +85,8 @@ endif ifeq ($(TARGET),F303) USE_FPU = hard - USE_PROCESS_STACKSIZE = 0x220 - USE_EXCEPTIONS_STACKSIZE = 0x100 + USE_PROCESS_STACKSIZE = 0x300 + USE_EXCEPTIONS_STACKSIZE = 0x200 endif # diff --git a/ili9341.c b/ili9341.c index 0fd552d..fb506ca 100644 --- a/ili9341.c +++ b/ili9341.c @@ -20,6 +20,7 @@ #include "ch.h" #include "hal.h" #include "nanovna.h" +#include "si4432.h" #include "spi.h" // Allow enable DMA for read display data @@ -305,11 +306,37 @@ static void spi_init(void) LCD_SPI->CR1|= SPI_CR1_SPE; //SPI enable } +static uint16_t current_spi_mode; +void set_SPI_mode(uint16_t mode){ + if (current_spi_mode == mode) return; + switch(current_spi_mode){ + case SPI_MODE_LCD: + break; + case SPI_MODE_SD_CARD: + break; + case SPI_MODE_SI: + stop_SI4432_SPI_mode(); + break; + } + switch(mode){ + case SPI_MODE_LCD: + break; + case SPI_MODE_SD_CARD: + break; + case SPI_MODE_SI: + LCD_CS_HIGH; + start_SI4432_SPI_mode(); + break; + } + current_spi_mode = mode; +} + // Disable inline for this function static void send_command(uint8_t cmd, uint8_t len, const uint8_t *data) { // Uncomment on low speed SPI (possible get here before previous tx complete) // while (SPI_IN_TX_RX); + set_SPI_mode(SPI_MODE_LCD); LCD_CS_LOW; LCD_DC_CMD; SPI_WRITE_8BIT(LCD_SPI, cmd); diff --git a/main.c b/main.c index 33f6d3c..f552c9f 100644 --- a/main.c +++ b/main.c @@ -102,7 +102,7 @@ static void transform_domain(void); static int8_t drive_strength = DRIVE_STRENGTH_AUTO; #endif -int8_t sweep_mode = SWEEP_ENABLE; +uint8_t sweep_mode = SWEEP_ENABLE; volatile uint8_t redraw_request = 0; // contains REDRAW_XXX flags // Version text, displayed in Config->Version menu, also send by info command @@ -124,13 +124,13 @@ extern int dirty; bool completed = false; -static THD_WORKING_AREA(waThread1, 768); +static THD_WORKING_AREA(waThread1, 1024); static THD_FUNCTION(Thread1, arg) { (void)arg; chRegSetThreadName("sweep"); - ui_process(); +// ui_process(); while (1) { // START_PROFILE diff --git a/nanovna.h b/nanovna.h index be2b419..9a83605 100644 --- a/nanovna.h +++ b/nanovna.h @@ -164,7 +164,7 @@ enum { //#define SWEEP_FACTORY 0x20 -extern int8_t sweep_mode; +extern uint8_t sweep_mode; extern bool completed; extern const char *info_about[]; @@ -281,7 +281,7 @@ extern void tlv320aic3204_select(int channel); #ifdef __SCROLL__ extern uint16_t _grid_y; #define GRIDY _grid_y -#define HEIGHT_SCROLL 260 +#define HEIGHT_SCROLL 180 #define HEIGHT_NOSCROLL 310 #define SCROLL_GRIDY (HEIGHT_SCROLL / NGRIDY) #define NOSCROLL_GRIDY (HEIGHT_NOSCROLL / NGRIDY) diff --git a/si4432.c b/si4432.c index e77d5b9..14f0e5b 100644 --- a/si4432.c +++ b/si4432.c @@ -23,11 +23,31 @@ #include "nanovna.h" #include #include "si4432.h" +#include "spi.h" #pragma GCC push_options #pragma GCC optimize ("O2") -#define LCD_CS_HIGH palSetPad(GPIOB, GPIOB_LCD_CS) +// Define for use hardware SPI mode +#define USE_HARDWARE_SPI_MODE + +// 10MHz clock +#define SI4432_10MHZ 10000000U +// !!!! FROM ili9341.c for disable it !!!! +#define LCD_CS_HIGH palSetPad(GPIOB, GPIOB_LCD_CS) +#define SI_CS_LOW palClearPad(GPIOA, GPIOA_SI_SEL) +#define SI_CS_HIGH palSetPad(GPIOA, GPIOA_SI_SEL) + + +// Hardware or software SPI use +#ifdef USE_HARDWARE_SPI_MODE +#define SI4432_SPI SPI1 +#define SI4432_SPI_SPEED SPI_BR_DIV8 +static uint32_t old_spi_settings; +#else +static uint32_t old_port_moder; +static uint32_t new_port_moder; +#endif #define CS_SI0_HIGH palSetPad(GPIOB, GPIOB_RX_SEL) @@ -36,20 +56,19 @@ #define RF_POWER_HIGH palSetPad(GPIOB, GPIOB_RF_PWR) +#define CS_SI0_LOW palClearPad(GPIOB, GPIOB_RX_SEL) +#define CS_SI1_LOW palClearPad(GPIOB, GPIOB_LO_SEL) +#define CS_PE_LOW palClearPad(GPIOA, GPIOA_PE_SEL) -#define CS_SI0_LOW palClearPad(GPIOB, GPIOB_RX_SEL) -#define CS_SI1_LOW palClearPad(GPIOB, GPIOB_LO_SEL) -#define CS_PE_LOW palClearPad(GPIOA, GPIOA_PE_SEL) - -#define SPI2_CLK_HIGH palSetPad(GPIOB, GPIOB_SPI_SCLK) -#define SPI2_CLK_LOW palClearPad(GPIOB, GPIOB_SPI_SCLK) +#define SPI1_CLK_HIGH palSetPad(GPIOB, GPIOB_SPI_SCLK) +#define SPI1_CLK_LOW palClearPad(GPIOB, GPIOB_SPI_SCLK) -#define SPI2_SDI_HIGH palSetPad(GPIOB, GPIOB_SPI_MOSI) -#define SPI2_SDI_LOW palClearPad(GPIOB, GPIOB_SPI_MOSI) -#define SPI2_RESET palClearPort(GPIOB, (1<>GPIOB_SPI_MISO)&1) -#define SPI2_portSDO (palReadPort(GPIOB)&(1<>GPIOB_SPI_MISO)&1) +#define SPI1_portSDO (palReadPort(GPIOB)&(1<CR1; + SPI_BR_SET(SI4432_SPI, SI4432_SPI_SPEED); +#else + // Init legs mode for software bitbang + old_port_moder = GPIOB->MODER; + new_port_moder = old_port_moder & ~(PIN_MODE_ANALOG(GPIOB_SPI_SCLK)|PIN_MODE_ANALOG(GPIOB_SPI_MISO)|PIN_MODE_ANALOG(GPIOB_SPI_MOSI)); + new_port_moder|= PIN_MODE_OUTPUT(GPIOB_SPI_SCLK)|PIN_MODE_INPUT(GPIOB_SPI_MISO)|PIN_MODE_OUTPUT(GPIOB_SPI_MOSI); + GPIOB->MODER = new_port_moder; + // Pull down SPI + SPI_SDI_LOW; + SPI_CLK_LOW; +#endif +} + +void stop_SI4432_SPI_mode(void){ +#ifdef USE_HARDWARE_SPI_MODE + SI4432_SPI->CR1 = old_spi_settings; +#else + // Restore hardware SPI + GPIOB->MODER = old_port_moder; +#endif } static void shiftOut(uint8_t val) @@ -69,9 +109,9 @@ static void shiftOut(uint8_t val) uint8_t i = 0; do { if (val & 0x80) - SPI2_SDI_HIGH; - SPI2_CLK_HIGH; - SPI2_RESET; + SPI1_SDI_HIGH; + SPI1_CLK_HIGH; + SPI1_RESET; val<<=1; }while((++i) & 0x07); } @@ -82,9 +122,9 @@ static uint8_t shiftIn(void) uint8_t i = 0; do { value<<=1; - SPI2_CLK_HIGH; - value|=SPI2_portSDO; - SPI2_CLK_LOW; + SPI1_CLK_HIGH; + value|=SPI1_portSDO; + SPI1_CLK_LOW; }while((++i) & 0x07); return value>>GPIOB_SPI_MISO; } @@ -96,17 +136,17 @@ static inline void shiftInBuf(uint16_t sel, uint8_t addr, deviceRSSI_t *buf, uin palClearPad(GPIOC, sel); do { if (value & 0x80) - SPI2_SDI_HIGH; - SPI2_CLK_HIGH; - SPI2_RESET; + SPI1_SDI_HIGH; + SPI1_CLK_HIGH; + SPI1_RESET; value<<=1; }while((++i) & 0x07); value = 0; do { - SPI2_CLK_HIGH; + SPI1_CLK_HIGH; value<<=1; - value|=SPI2_portSDO; - SPI2_CLK_LOW; + value|=SPI1_portSDO; + SPI1_CLK_LOW; }while((++i) & 0x07); palSetPad(GPIOC, sel); *buf++=value>>GPIOB_SPI_MISO; @@ -121,12 +161,12 @@ static void shiftOutBuf(uint8_t *buf, uint16_t size) { uint8_t val = *buf++; do{ if (val & 0x80) - SPI2_SDI_HIGH; + SPI1_SDI_HIGH; else - SPI2_SDI_LOW; + SPI1_SDI_LOW; val<<=1; - SPI2_CLK_HIGH; - SPI2_CLK_LOW; + SPI1_CLK_HIGH; + SPI1_CLK_LOW; }while((++i) & 0x07); }while(--size); } @@ -141,11 +181,11 @@ volatile int SI4432_Sel = 0; // currently selected SI4432 #define SELECT_DELAY 10 void SI4432_Write_Byte(byte ADR, byte DATA ) { - startSPI(); + set_SPI_mode(SPI_MODE_SI); // if (SI4432_guard) // while(1) ; // SI4432_guard = 1; -// SPI2_CLK_LOW; +// SPI1_CLK_LOW; palClearPad(GPIOB, SI_nSEL[SI4432_Sel]); // chThdSleepMicroseconds(SELECT_DELAY); ADR |= 0x80 ; // RW = 1 @@ -157,11 +197,11 @@ void SI4432_Write_Byte(byte ADR, byte DATA ) void SI4432_Write_3_Byte(byte ADR, byte DATA1, byte DATA2, byte DATA3 ) { - startSPI(); + set_SPI_mode(SPI_MODE_SI); // if (SI4432_guard) // while(1) ; // SI4432_guard = 1; -// SPI2_CLK_LOW; +// SPI1_CLK_LOW; palClearPad(GPIOB, SI_nSEL[SI4432_Sel]); // chThdSleepMicroseconds(SELECT_DELAY); ADR |= 0x80 ; // RW = 1 @@ -175,12 +215,12 @@ void SI4432_Write_3_Byte(byte ADR, byte DATA1, byte DATA2, byte DATA3 ) byte SI4432_Read_Byte( byte ADR ) { - startSPI(); + set_SPI_mode(SPI_MODE_SI); byte DATA ; // if (SI4432_guard) // while(1) ; // SI4432_guard = 1; -// SPI2_CLK_LOW; +// SPI1_CLK_LOW; palClearPad(GPIOB, SI_nSEL[SI4432_Sel]); shiftOut( ADR ); DATA = shiftIn(); @@ -418,7 +458,7 @@ int SI4432_is_fast_mode(void) void SI4432_Fill(int s, int start) { - startSPI(); + set_SPI_mode(SPI_MODE_SI); SI4432_Sel = s; uint16_t sel = SI_nSEL[SI4432_Sel]; #if 0 @@ -434,7 +474,7 @@ void SI4432_Fill(int s, int start) systime_t measure = chVTGetSystemTimeX(); // __disable_irq(); #if 0 - SPI2_CLK_LOW; + SPI1_CLK_LOW; int i = start; do { palClearPad(GPIOC, sel); @@ -612,8 +652,8 @@ void SI4432_Init() CS_SI0_LOW; // Drop CS so power can be removed CS_SI1_LOW; // Drop CS so power can be removed CS_PE_LOW; // low is the default safe state - SPI2_CLK_LOW; // low is the default safe state - SPI2_SDI_LOW; // will be set with any data out + SPI1_CLK_LOW; // low is the default safe state + SPI1_SDI_LOW; // will be set with any data out palClearPad(GPIOA, GPIOA_RF_PWR); // Drop power chThdSleepMilliseconds(10); // Wait @@ -622,7 +662,7 @@ void SI4432_Init() CS_SI1_HIGH; chThdSleepMilliseconds(10); // Wait #endif - SPI2_CLK_LOW; + SPI1_CLK_LOW; //DebugLine("IO set"); SI4432_Sel = SI4432_RX; SI4432_Sub_Init(); @@ -680,13 +720,13 @@ void PE4302_shiftOut(uint8_t val) SI4432_log(val); for (i = 0; i < 8; i++) { if (val & (1 << (7 - i))) - SPI2_SDI_HIGH; + SPI1_SDI_HIGH; else - SPI2_SDI_LOW; + SPI1_SDI_LOW; // chThdSleepMicroseconds(PE4302_DELAY); - SPI2_CLK_HIGH; + SPI1_CLK_HIGH; // chThdSleepMicroseconds(PE4302_DELAY); - SPI2_CLK_LOW; + SPI1_CLK_LOW; // chThdSleepMicroseconds(PE4302_DELAY); } } @@ -698,7 +738,7 @@ bool PE4302_Write_Byte(unsigned char DATA ) if (old_attenuation == DATA) return false; // chThdSleepMicroseconds(PE4302_DELAY); -// SPI2_CLK_LOW; +// SPI1_CLK_LOW; // chThdSleepMicroseconds(PE4302_DELAY); // PE4302_shiftOut(DATA); diff --git a/si4432.h b/si4432.h index 1f04ed9..4ec7da3 100644 --- a/si4432.h +++ b/si4432.h @@ -106,6 +106,10 @@ typedef uint8_t byte; extern volatile int SI4432_Sel; // currently selected SI4432 + +void start_SI4432_SPI_mode(void); +void stop_SI4432_SPI_mode(void); + void SI4432_Write_Byte(byte ADR, byte DATA ); byte SI4432_Read_Byte( byte ADR ); diff --git a/spi.h b/spi.h index 04238c9..319cc1a 100644 --- a/spi.h +++ b/spi.h @@ -78,3 +78,8 @@ #define SPI_READ_8BIT(spi) *(__IO uint8_t*)(&spi->DR) #define SPI_READ_16BIT(spi) *(__IO uint16_t*)(&spi->DR) +#define SPI_MODE_LCD 0x00 +#define SPI_MODE_SD_CARD 0x01 +#define SPI_MODE_SI 0x02 + +void set_SPI_mode(uint16_t mode);