Implement share SPI bus

Removed_REF_marker
DiSlord 5 years ago
parent b49f3edadf
commit 5abf8b900e

@ -85,8 +85,8 @@ endif
ifeq ($(TARGET),F303) ifeq ($(TARGET),F303)
USE_FPU = hard USE_FPU = hard
USE_PROCESS_STACKSIZE = 0x220 USE_PROCESS_STACKSIZE = 0x300
USE_EXCEPTIONS_STACKSIZE = 0x100 USE_EXCEPTIONS_STACKSIZE = 0x200
endif endif
# #

@ -20,6 +20,7 @@
#include "ch.h" #include "ch.h"
#include "hal.h" #include "hal.h"
#include "nanovna.h" #include "nanovna.h"
#include "si4432.h"
#include "spi.h" #include "spi.h"
// Allow enable DMA for read display data // Allow enable DMA for read display data
@ -305,11 +306,37 @@ static void spi_init(void)
LCD_SPI->CR1|= SPI_CR1_SPE; //SPI enable 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 // Disable inline for this function
static void send_command(uint8_t cmd, uint8_t len, const uint8_t *data) 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) // Uncomment on low speed SPI (possible get here before previous tx complete)
// while (SPI_IN_TX_RX); // while (SPI_IN_TX_RX);
set_SPI_mode(SPI_MODE_LCD);
LCD_CS_LOW; LCD_CS_LOW;
LCD_DC_CMD; LCD_DC_CMD;
SPI_WRITE_8BIT(LCD_SPI, cmd); SPI_WRITE_8BIT(LCD_SPI, cmd);

@ -102,7 +102,7 @@ static void transform_domain(void);
static int8_t drive_strength = DRIVE_STRENGTH_AUTO; static int8_t drive_strength = DRIVE_STRENGTH_AUTO;
#endif #endif
int8_t sweep_mode = SWEEP_ENABLE; uint8_t sweep_mode = SWEEP_ENABLE;
volatile uint8_t redraw_request = 0; // contains REDRAW_XXX flags volatile uint8_t redraw_request = 0; // contains REDRAW_XXX flags
// Version text, displayed in Config->Version menu, also send by info command // Version text, displayed in Config->Version menu, also send by info command
@ -124,13 +124,13 @@ extern int dirty;
bool completed = false; bool completed = false;
static THD_WORKING_AREA(waThread1, 768); static THD_WORKING_AREA(waThread1, 1024);
static THD_FUNCTION(Thread1, arg) static THD_FUNCTION(Thread1, arg)
{ {
(void)arg; (void)arg;
chRegSetThreadName("sweep"); chRegSetThreadName("sweep");
ui_process(); // ui_process();
while (1) { while (1) {
// START_PROFILE // START_PROFILE

@ -164,7 +164,7 @@ enum {
//#define SWEEP_FACTORY 0x20 //#define SWEEP_FACTORY 0x20
extern int8_t sweep_mode; extern uint8_t sweep_mode;
extern bool completed; extern bool completed;
extern const char *info_about[]; extern const char *info_about[];
@ -281,7 +281,7 @@ extern void tlv320aic3204_select(int channel);
#ifdef __SCROLL__ #ifdef __SCROLL__
extern uint16_t _grid_y; extern uint16_t _grid_y;
#define GRIDY _grid_y #define GRIDY _grid_y
#define HEIGHT_SCROLL 260 #define HEIGHT_SCROLL 180
#define HEIGHT_NOSCROLL 310 #define HEIGHT_NOSCROLL 310
#define SCROLL_GRIDY (HEIGHT_SCROLL / NGRIDY) #define SCROLL_GRIDY (HEIGHT_SCROLL / NGRIDY)
#define NOSCROLL_GRIDY (HEIGHT_NOSCROLL / NGRIDY) #define NOSCROLL_GRIDY (HEIGHT_NOSCROLL / NGRIDY)

@ -23,11 +23,31 @@
#include "nanovna.h" #include "nanovna.h"
#include <math.h> #include <math.h>
#include "si4432.h" #include "si4432.h"
#include "spi.h"
#pragma GCC push_options #pragma GCC push_options
#pragma GCC optimize ("O2") #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) #define CS_SI0_HIGH palSetPad(GPIOB, GPIOB_RX_SEL)
@ -36,20 +56,19 @@
#define RF_POWER_HIGH palSetPad(GPIOB, GPIOB_RF_PWR) #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 SPI1_CLK_HIGH palSetPad(GPIOB, GPIOB_SPI_SCLK)
#define CS_SI1_LOW palClearPad(GPIOB, GPIOB_LO_SEL) #define SPI1_CLK_LOW palClearPad(GPIOB, GPIOB_SPI_SCLK)
#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 SPI2_SDI_HIGH palSetPad(GPIOB, GPIOB_SPI_MOSI) #define SPI1_SDI_HIGH palSetPad(GPIOB, GPIOB_SPI_MOSI)
#define SPI2_SDI_LOW palClearPad(GPIOB, GPIOB_SPI_MOSI) #define SPI1_SDI_LOW palClearPad(GPIOB, GPIOB_SPI_MOSI)
#define SPI2_RESET palClearPort(GPIOB, (1<<GPIOB_SPI_SCLK)|(1<<GPIOB_SPI_MOSI)) #define SPI1_RESET palClearPort(GPIOB, (1<<GPIOB_SPI_SCLK)|(1<<GPIOB_SPI_MOSI))
#define SPI2_SDO ((palReadPort(GPIOB)>>GPIOB_SPI_MISO)&1) #define SPI1_SDO ((palReadPort(GPIOB)>>GPIOB_SPI_MISO)&1)
#define SPI2_portSDO (palReadPort(GPIOB)&(1<<GPIOB_SPI_MISO)) #define SPI1_portSDO (palReadPort(GPIOB)&(1<<GPIOB_SPI_MISO))
//#define MAXLOG 1024 //#define MAXLOG 1024
//unsigned char SI4432_logging[MAXLOG]; //unsigned char SI4432_logging[MAXLOG];
@ -58,8 +77,29 @@
//#define SI4432_log(X) { if (log_index < MAXLOG) SI4432_logging[log_index++] = X; } //#define SI4432_log(X) { if (log_index < MAXLOG) SI4432_logging[log_index++] = X; }
#define SI4432_log(X) #define SI4432_log(X)
void startSPI(void){ void start_SI4432_SPI_mode(void){
LCD_CS_HIGH; #ifdef USE_HARDWARE_SPI_MODE
old_spi_settings = SI4432_SPI->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) static void shiftOut(uint8_t val)
@ -69,9 +109,9 @@ static void shiftOut(uint8_t val)
uint8_t i = 0; uint8_t i = 0;
do { do {
if (val & 0x80) if (val & 0x80)
SPI2_SDI_HIGH; SPI1_SDI_HIGH;
SPI2_CLK_HIGH; SPI1_CLK_HIGH;
SPI2_RESET; SPI1_RESET;
val<<=1; val<<=1;
}while((++i) & 0x07); }while((++i) & 0x07);
} }
@ -82,9 +122,9 @@ static uint8_t shiftIn(void)
uint8_t i = 0; uint8_t i = 0;
do { do {
value<<=1; value<<=1;
SPI2_CLK_HIGH; SPI1_CLK_HIGH;
value|=SPI2_portSDO; value|=SPI1_portSDO;
SPI2_CLK_LOW; SPI1_CLK_LOW;
}while((++i) & 0x07); }while((++i) & 0x07);
return value>>GPIOB_SPI_MISO; 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); palClearPad(GPIOC, sel);
do { do {
if (value & 0x80) if (value & 0x80)
SPI2_SDI_HIGH; SPI1_SDI_HIGH;
SPI2_CLK_HIGH; SPI1_CLK_HIGH;
SPI2_RESET; SPI1_RESET;
value<<=1; value<<=1;
}while((++i) & 0x07); }while((++i) & 0x07);
value = 0; value = 0;
do { do {
SPI2_CLK_HIGH; SPI1_CLK_HIGH;
value<<=1; value<<=1;
value|=SPI2_portSDO; value|=SPI1_portSDO;
SPI2_CLK_LOW; SPI1_CLK_LOW;
}while((++i) & 0x07); }while((++i) & 0x07);
palSetPad(GPIOC, sel); palSetPad(GPIOC, sel);
*buf++=value>>GPIOB_SPI_MISO; *buf++=value>>GPIOB_SPI_MISO;
@ -121,12 +161,12 @@ static void shiftOutBuf(uint8_t *buf, uint16_t size) {
uint8_t val = *buf++; uint8_t val = *buf++;
do{ do{
if (val & 0x80) if (val & 0x80)
SPI2_SDI_HIGH; SPI1_SDI_HIGH;
else else
SPI2_SDI_LOW; SPI1_SDI_LOW;
val<<=1; val<<=1;
SPI2_CLK_HIGH; SPI1_CLK_HIGH;
SPI2_CLK_LOW; SPI1_CLK_LOW;
}while((++i) & 0x07); }while((++i) & 0x07);
}while(--size); }while(--size);
} }
@ -141,11 +181,11 @@ volatile int SI4432_Sel = 0; // currently selected SI4432
#define SELECT_DELAY 10 #define SELECT_DELAY 10
void SI4432_Write_Byte(byte ADR, byte DATA ) void SI4432_Write_Byte(byte ADR, byte DATA )
{ {
startSPI(); set_SPI_mode(SPI_MODE_SI);
// if (SI4432_guard) // if (SI4432_guard)
// while(1) ; // while(1) ;
// SI4432_guard = 1; // SI4432_guard = 1;
// SPI2_CLK_LOW; // SPI1_CLK_LOW;
palClearPad(GPIOB, SI_nSEL[SI4432_Sel]); palClearPad(GPIOB, SI_nSEL[SI4432_Sel]);
// chThdSleepMicroseconds(SELECT_DELAY); // chThdSleepMicroseconds(SELECT_DELAY);
ADR |= 0x80 ; // RW = 1 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 ) void SI4432_Write_3_Byte(byte ADR, byte DATA1, byte DATA2, byte DATA3 )
{ {
startSPI(); set_SPI_mode(SPI_MODE_SI);
// if (SI4432_guard) // if (SI4432_guard)
// while(1) ; // while(1) ;
// SI4432_guard = 1; // SI4432_guard = 1;
// SPI2_CLK_LOW; // SPI1_CLK_LOW;
palClearPad(GPIOB, SI_nSEL[SI4432_Sel]); palClearPad(GPIOB, SI_nSEL[SI4432_Sel]);
// chThdSleepMicroseconds(SELECT_DELAY); // chThdSleepMicroseconds(SELECT_DELAY);
ADR |= 0x80 ; // RW = 1 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 ) byte SI4432_Read_Byte( byte ADR )
{ {
startSPI(); set_SPI_mode(SPI_MODE_SI);
byte DATA ; byte DATA ;
// if (SI4432_guard) // if (SI4432_guard)
// while(1) ; // while(1) ;
// SI4432_guard = 1; // SI4432_guard = 1;
// SPI2_CLK_LOW; // SPI1_CLK_LOW;
palClearPad(GPIOB, SI_nSEL[SI4432_Sel]); palClearPad(GPIOB, SI_nSEL[SI4432_Sel]);
shiftOut( ADR ); shiftOut( ADR );
DATA = shiftIn(); DATA = shiftIn();
@ -418,7 +458,7 @@ int SI4432_is_fast_mode(void)
void SI4432_Fill(int s, int start) void SI4432_Fill(int s, int start)
{ {
startSPI(); set_SPI_mode(SPI_MODE_SI);
SI4432_Sel = s; SI4432_Sel = s;
uint16_t sel = SI_nSEL[SI4432_Sel]; uint16_t sel = SI_nSEL[SI4432_Sel];
#if 0 #if 0
@ -434,7 +474,7 @@ void SI4432_Fill(int s, int start)
systime_t measure = chVTGetSystemTimeX(); systime_t measure = chVTGetSystemTimeX();
// __disable_irq(); // __disable_irq();
#if 0 #if 0
SPI2_CLK_LOW; SPI1_CLK_LOW;
int i = start; int i = start;
do { do {
palClearPad(GPIOC, sel); palClearPad(GPIOC, sel);
@ -612,8 +652,8 @@ void SI4432_Init()
CS_SI0_LOW; // Drop CS so power can be removed CS_SI0_LOW; // Drop CS so power can be removed
CS_SI1_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 CS_PE_LOW; // low is the default safe state
SPI2_CLK_LOW; // low is the default safe state SPI1_CLK_LOW; // low is the default safe state
SPI2_SDI_LOW; // will be set with any data out SPI1_SDI_LOW; // will be set with any data out
palClearPad(GPIOA, GPIOA_RF_PWR); // Drop power palClearPad(GPIOA, GPIOA_RF_PWR); // Drop power
chThdSleepMilliseconds(10); // Wait chThdSleepMilliseconds(10); // Wait
@ -622,7 +662,7 @@ void SI4432_Init()
CS_SI1_HIGH; CS_SI1_HIGH;
chThdSleepMilliseconds(10); // Wait chThdSleepMilliseconds(10); // Wait
#endif #endif
SPI2_CLK_LOW; SPI1_CLK_LOW;
//DebugLine("IO set"); //DebugLine("IO set");
SI4432_Sel = SI4432_RX; SI4432_Sel = SI4432_RX;
SI4432_Sub_Init(); SI4432_Sub_Init();
@ -680,13 +720,13 @@ void PE4302_shiftOut(uint8_t val)
SI4432_log(val); SI4432_log(val);
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
if (val & (1 << (7 - i))) if (val & (1 << (7 - i)))
SPI2_SDI_HIGH; SPI1_SDI_HIGH;
else else
SPI2_SDI_LOW; SPI1_SDI_LOW;
// chThdSleepMicroseconds(PE4302_DELAY); // chThdSleepMicroseconds(PE4302_DELAY);
SPI2_CLK_HIGH; SPI1_CLK_HIGH;
// chThdSleepMicroseconds(PE4302_DELAY); // chThdSleepMicroseconds(PE4302_DELAY);
SPI2_CLK_LOW; SPI1_CLK_LOW;
// chThdSleepMicroseconds(PE4302_DELAY); // chThdSleepMicroseconds(PE4302_DELAY);
} }
} }
@ -698,7 +738,7 @@ bool PE4302_Write_Byte(unsigned char DATA )
if (old_attenuation == DATA) if (old_attenuation == DATA)
return false; return false;
// chThdSleepMicroseconds(PE4302_DELAY); // chThdSleepMicroseconds(PE4302_DELAY);
// SPI2_CLK_LOW; // SPI1_CLK_LOW;
// chThdSleepMicroseconds(PE4302_DELAY); // chThdSleepMicroseconds(PE4302_DELAY);
// PE4302_shiftOut(DATA); // PE4302_shiftOut(DATA);

@ -106,6 +106,10 @@
typedef uint8_t byte; typedef uint8_t byte;
extern volatile int SI4432_Sel; // currently selected SI4432 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 ); void SI4432_Write_Byte(byte ADR, byte DATA );
byte SI4432_Read_Byte( byte ADR ); byte SI4432_Read_Byte( byte ADR );

@ -78,3 +78,8 @@
#define SPI_READ_8BIT(spi) *(__IO uint8_t*)(&spi->DR) #define SPI_READ_8BIT(spi) *(__IO uint8_t*)(&spi->DR)
#define SPI_READ_16BIT(spi) *(__IO uint16_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);

Loading…
Cancel
Save

Powered by TurnKey Linux.