Slow SW SPI for PE4312

multi_trace
erikkaashoek 5 years ago
parent de39eac5a8
commit 7d06cd473b

@ -351,6 +351,9 @@ void set_SPI_mode(uint16_t mode){
break; break;
case SPI_MODE_SI: case SPI_MODE_SI:
stop_SI4432_SPI_mode(); stop_SI4432_SPI_mode();
break;
case SPI_MODE_PE:
stop_PE4312_SPI_mode();
break; break;
} }
// Enable new mode // Enable new mode
@ -363,6 +366,10 @@ void set_SPI_mode(uint16_t mode){
case SPI_MODE_SI: case SPI_MODE_SI:
LCD_CS_HIGH; LCD_CS_HIGH;
start_SI4432_SPI_mode(); start_SI4432_SPI_mode();
break;
case SPI_MODE_PE:
LCD_CS_HIGH;
start_PE4312_SPI_mode();
break; break;
} }
current_spi_mode = mode; current_spi_mode = mode;

@ -74,13 +74,13 @@
//#define ADF_SPI_SPEED SPI_BR_DIV32 //#define ADF_SPI_SPEED SPI_BR_DIV32
#define ADF_SPI_SPEED SPI_BR_DIV2 #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; static uint32_t old_spi_settings;
#else #else
static uint32_t old_port_moder;
static uint32_t new_port_moder; static uint32_t new_port_moder;
#endif #endif
static uint32_t old_port_moder;
#define SPI1_CLK_HIGH palSetPad(GPIOB, GPIOB_SPI_SCLK) #define SPI1_CLK_HIGH palSetPad(GPIOB, GPIOB_SPI_SCLK)
#define SPI1_CLK_LOW palClearPad(GPIOB, GPIOB_SPI_SCLK) #define SPI1_CLK_LOW palClearPad(GPIOB, GPIOB_SPI_SCLK)
@ -129,6 +129,41 @@ void stop_SI4432_SPI_mode(void){
#endif #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) static void shiftOut(uint8_t val)
{ {
#ifdef USE_HARDWARE_SPI_MODE #ifdef USE_HARDWARE_SPI_MODE
@ -186,20 +221,24 @@ bool PE4302_Write_Byte(unsigned char DATA )
if (old_attenuation == DATA) if (old_attenuation == DATA)
return false; return false;
old_attenuation = DATA; old_attenuation = DATA;
#if 0
set_SPI_mode(SPI_MODE_SI); set_SPI_mode(SPI_MODE_SI);
if (SI4432_SPI_SPEED != PE_SPI_SPEED) if (SI4432_SPI_SPEED != PE_SPI_SPEED)
SPI_BR_SET(SI4432_SPI, PE_SPI_SPEED); SPI_BR_SET(SI4432_SPI, PE_SPI_SPEED);
#if 1
SPI_WRITE_8BIT(SI4432_SPI, DATA); SPI_WRITE_8BIT(SI4432_SPI, DATA);
while (SPI_IS_BUSY(SI4432_SPI)); while (SPI_IS_BUSY(SI4432_SPI));
#else #else // Run PE4312 in SW mode to avoid disturbances
shiftOut(DATA); set_SPI_mode(SPI_MODE_PE);
software_shiftOut(DATA);
#endif #endif
CS_PE_HIGH; CS_PE_HIGH;
my_microsecond_delay(100);
CS_PE_LOW; CS_PE_LOW;
my_microsecond_delay(100);
#if 0
if (SI4432_SPI_SPEED != PE_SPI_SPEED) if (SI4432_SPI_SPEED != PE_SPI_SPEED)
SPI_BR_SET(SI4432_SPI, SI4432_SPI_SPEED); SPI_BR_SET(SI4432_SPI, SI4432_SPI_SPEED);
#endif
return true; return true;
} }
#endif #endif

@ -82,7 +82,10 @@
#define SPI_MODE_LCD 0x00 #define SPI_MODE_LCD 0x00
#define SPI_MODE_SD_CARD 0x01 #define SPI_MODE_SD_CARD 0x01
#define SPI_MODE_SI 0x02 #define SPI_MODE_SI 0x02
#define SPI_MODE_PE 0x04
void set_SPI_mode(uint16_t mode); void set_SPI_mode(uint16_t mode);
void start_SI4432_SPI_mode(void); void start_SI4432_SPI_mode(void);
void stop_SI4432_SPI_mode(void); void stop_SI4432_SPI_mode(void);
void start_PE4312_SPI_mode(void);
void stop_PE4312_SPI_mode(void);
#endif #endif

Loading…
Cancel
Save

Powered by TurnKey Linux.