From 7d06cd473b63a704660c7d4030066dea95041a26 Mon Sep 17 00:00:00 2001 From: erikkaashoek Date: Wed, 9 Jun 2021 14:03:09 +0200 Subject: [PATCH] Slow SW SPI for PE4312 --- ili9341.c | 7 +++++++ si4468.c | 51 +++++++++++++++++++++++++++++++++++++++++++++------ spi.h | 3 +++ 3 files changed, 55 insertions(+), 6 deletions(-) diff --git a/ili9341.c b/ili9341.c index e1b2535..24ecf35 100644 --- a/ili9341.c +++ b/ili9341.c @@ -351,6 +351,9 @@ void set_SPI_mode(uint16_t mode){ break; case SPI_MODE_SI: stop_SI4432_SPI_mode(); + break; + case SPI_MODE_PE: + stop_PE4312_SPI_mode(); break; } // Enable new mode @@ -363,6 +366,10 @@ void set_SPI_mode(uint16_t mode){ case SPI_MODE_SI: LCD_CS_HIGH; start_SI4432_SPI_mode(); + break; + case SPI_MODE_PE: + LCD_CS_HIGH; + start_PE4312_SPI_mode(); break; } current_spi_mode = mode; diff --git a/si4468.c b/si4468.c index 0ffc4b6..9827bec 100644 --- a/si4468.c +++ b/si4468.c @@ -74,13 +74,13 @@ //#define ADF_SPI_SPEED SPI_BR_DIV32 #define ADF_SPI_SPEED SPI_BR_DIV2 -#define PE_SPI_SPEED SPI_BR_DIV2 +#define PE_SPI_SPEED SPI_BR_DIV16 static uint32_t old_spi_settings; #else -static uint32_t old_port_moder; static uint32_t new_port_moder; #endif +static uint32_t old_port_moder; #define SPI1_CLK_HIGH palSetPad(GPIOB, GPIOB_SPI_SCLK) #define SPI1_CLK_LOW palClearPad(GPIOB, GPIOB_SPI_SCLK) @@ -129,6 +129,41 @@ void stop_SI4432_SPI_mode(void){ #endif } +void start_PE4312_SPI_mode(void){ + // Init legs mode for software bitbang + old_spi_settings = SI4432_SPI->CR1; + old_port_moder = GPIOB->MODER; + uint32_t 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 + SPI1_SDI_LOW; + SPI1_CLK_LOW; +} + +void stop_PE4312_SPI_mode(void){ + // Restore hardware SPI + GPIOB->MODER = old_port_moder; + SI4432_SPI->CR1 = old_spi_settings; +} + +static void software_shiftOut(uint8_t val) +{ + SI4432_log(SI4432_Sel); + SI4432_log(val); + uint8_t i = 0; + do { + if (val & 0x80) + SPI1_SDI_HIGH; + my_microsecond_delay(100); + SPI1_CLK_HIGH; + my_microsecond_delay(100); + SPI1_RESET; + val<<=1; + }while((++i) & 0x07); +} + + static void shiftOut(uint8_t val) { #ifdef USE_HARDWARE_SPI_MODE @@ -186,20 +221,24 @@ bool PE4302_Write_Byte(unsigned char DATA ) if (old_attenuation == DATA) return false; old_attenuation = DATA; - +#if 0 set_SPI_mode(SPI_MODE_SI); if (SI4432_SPI_SPEED != PE_SPI_SPEED) SPI_BR_SET(SI4432_SPI, PE_SPI_SPEED); -#if 1 SPI_WRITE_8BIT(SI4432_SPI, DATA); while (SPI_IS_BUSY(SI4432_SPI)); -#else - shiftOut(DATA); +#else // Run PE4312 in SW mode to avoid disturbances + set_SPI_mode(SPI_MODE_PE); + software_shiftOut(DATA); #endif CS_PE_HIGH; + my_microsecond_delay(100); CS_PE_LOW; + my_microsecond_delay(100); +#if 0 if (SI4432_SPI_SPEED != PE_SPI_SPEED) SPI_BR_SET(SI4432_SPI, SI4432_SPI_SPEED); +#endif return true; } #endif diff --git a/spi.h b/spi.h index 9944963..ce51a72 100644 --- a/spi.h +++ b/spi.h @@ -82,7 +82,10 @@ #define SPI_MODE_LCD 0x00 #define SPI_MODE_SD_CARD 0x01 #define SPI_MODE_SI 0x02 +#define SPI_MODE_PE 0x04 void set_SPI_mode(uint16_t mode); void start_SI4432_SPI_mode(void); void stop_SI4432_SPI_mode(void); +void start_PE4312_SPI_mode(void); +void stop_PE4312_SPI_mode(void); #endif