ESP32S3 FSPI & HSPI Help

Hello, I am new to ESP32S3 I am currently having issues using both HSPI and FSPI at the same time for my board. I am trying to use both SPI busses simultaneously I am able to get one working but not the other. Any advice would be much appreciated I am currently using this as a reference.

( ESP32 SPI Communication: Pins, Multiple SPI, Peripherals (Arduino) | Random Nerd Tutorials)

HSPI Code

#define ADF_MOSI   2   // Master Out Slave In
#define ADF_MISO   12  // Master In Slave Out
#define ADF_SCLK   4   // Serial Clock
#define ADF_CS     13  // Chip Select
#define ADF_LE     3   // Latch Enable
#define ADF_CE     1   // Chip Enable
#define ADF_LD     5   // Lock Detect

// Timing Constants
#define LE_PULSE_WIDTH 1  // 1µs LE pulse

SPIClass adf_spi(HSPI);  // Use HSPI for ADF4351

// ADF4351 Register Configuration
const uint32_t ADF4351_Registers[6] = {
  0x00400000,  // Register 0
  0x8008011,   // Register 1
  0x004E42,    // Register 2 (VCO calibration)
  0x0004B3,    // Register 3
  0x0DC80FC,   // Register 4
  0x0580005    // Register 5
};

void initializeADF4351() {
  // Configure SPI
  adf_spi.begin(ADF_SCLK, ADF_MISO, ADF_MOSI, ADF_CS);
  pinMode(ADF_CS, OUTPUT);
  digitalWrite(ADF_CS, HIGH);  // Start inactive
  
  // Configure control pins
  pinMode(ADF_LE, OUTPUT);
  pinMode(ADF_CE, OUTPUT);
  digitalWrite(ADF_LE, HIGH);
  digitalWrite(ADF_CE, LOW);   // Enable chip
  
  // Configure Lock Detect
  pinMode(ADF_LD, INPUT);
  
  Serial.println("ADF4351 Initialized");
}

void writeADFRegister(uint32_t regValue) {
  // Debug output
  Serial.printf("Writing Register: 0x%08X\n", regValue);
  
  // Split into bytes (MSB first)
  uint8_t bytes[4];
  bytes[0] = (regValue >> 24) & 0xFF;
  bytes[1] = (regValue >> 16) & 0xFF;
  bytes[2] = (regValue >> 8)  & 0xFF;
  bytes[3] = regValue & 0xFF;
  
  // SPI Transaction
  adf_spi.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
  digitalWrite(ADF_CS, LOW);
  
  for (int i = 0; i < 4; i++) {
    adf_spi.transfer(bytes[i]);
    Serial.printf("  Byte %d: 0x%02X\n", i, bytes[i]);
    delayMicroseconds(5);  // Small delay between bytes
  }
  
  digitalWrite(ADF_CS, HIGH);
  adf_spi.endTransaction();
  
  // Latch data
  digitalWrite(ADF_LE, LOW);
  delayMicroseconds(LE_PULSE_WIDTH);
  digitalWrite(ADF_LE, HIGH);
  Serial.println("  Data Latched");
}

void programAllRegisters() {
  Serial.println("\nProgramming ADF4351 Registers:");
  for (int i = 5; i >= 0; i--) {  // Reverse order (5->0)
    writeADFRegister(ADF4351_Registers[i]);
    delay(10);  // Short delay between registers
  }
}

void setup() {
  Serial.begin(115200);
  while (!Serial);  // Wait for Serial Monitor
  
  initializeADF4351();
  programAllRegisters();
  
  Serial.println("ADF4351 System Ready");
}

void loop() {
  // Check PLL lock state
  bool isLocked = digitalRead(ADF_LD);
  
  // Reprogram registers if unlocked
  if (!isLocked) {
    Serial.println("PLL Unlocked - Reprogramming");
    programAllRegisters();
  }
  
  delay(1000);
}

FSPI Code

#include "Display_ST7789.h"

SPIClass LCDspi(FSPI);
#define SPI_WRITE(_dat)         LCDspi.transfer(_dat)
#define SPI_WRITE_Word(_dat)    LCDspi.transfer16(_dat)
void SPI_Init()
{
  LCDspi.begin(EXAMPLE_PIN_NUM_SCLK,EXAMPLE_PIN_NUM_MISO,EXAMPLE_PIN_NUM_MOSI); 
}

void LCD_WriteCommand(uint8_t Cmd)  
{ 
  LCDspi.beginTransaction(SPISettings(SPIFreq, MSBFIRST, SPI_MODE0));
  digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, LOW);  
  digitalWrite(EXAMPLE_PIN_NUM_LCD_DC, LOW); 
  SPI_WRITE(Cmd);
  digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, HIGH);  
  LCDspi.endTransaction();
}
void LCD_WriteData(uint8_t Data) 
{ 
  LCDspi.beginTransaction(SPISettings(SPIFreq, MSBFIRST, SPI_MODE0));
  digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, LOW);  
  digitalWrite(EXAMPLE_PIN_NUM_LCD_DC, HIGH);  
  SPI_WRITE(Data);  
  digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, HIGH);  
  LCDspi.endTransaction();
}    
void LCD_WriteData_Word(uint16_t Data)
{
  LCDspi.beginTransaction(SPISettings(SPIFreq, MSBFIRST, SPI_MODE0));
  digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, LOW);  
  digitalWrite(EXAMPLE_PIN_NUM_LCD_DC, HIGH); 
  SPI_WRITE_Word(Data);
  digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, HIGH);  
  LCDspi.endTransaction();
}   
void LCD_WriteData_nbyte(uint8_t* SetData,uint8_t* ReadData,uint32_t Size) 
{ 
  LCDspi.beginTransaction(SPISettings(SPIFreq, MSBFIRST, SPI_MODE0));
  digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, LOW);  
  digitalWrite(EXAMPLE_PIN_NUM_LCD_DC, HIGH);  
  LCDspi.transferBytes(SetData, ReadData, Size);
  digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, HIGH);  
  LCDspi.endTransaction();
} 

void LCD_Reset(void)
{
  digitalWrite(EXAMPLE_PIN_NUM_LCD_CS, LOW);       
  delay(50);
  digitalWrite(EXAMPLE_PIN_NUM_LCD_RST, LOW); 
  delay(50);
  digitalWrite(EXAMPLE_PIN_NUM_LCD_RST, HIGH); 
  delay(50);
}
void LCD_Init(void)
{
  pinMode(EXAMPLE_PIN_NUM_LCD_CS, OUTPUT);
  pinMode(EXAMPLE_PIN_NUM_LCD_DC, OUTPUT);
  pinMode(EXAMPLE_PIN_NUM_LCD_RST, OUTPUT); 
  Backlight_Init();
  SPI_Init();

  LCD_Reset();
  //************* Start Initial Sequence **********// 
  LCD_WriteCommand(0x11);
  delay(120);
  LCD_WriteCommand(0x36);
  if (HORIZONTAL)
      LCD_WriteData(0x00);
  else
      LCD_WriteData(0x70);

  LCD_WriteCommand(0x3A);
  LCD_WriteData(0x05);

  LCD_WriteCommand(0xB0);
  LCD_WriteData(0x00);
  LCD_WriteData(0xE8);
  
  LCD_WriteCommand(0xB2);
  LCD_WriteData(0x0C);
  LCD_WriteData(0x0C);
  LCD_WriteData(0x00);
  LCD_WriteData(0x33);
  LCD_WriteData(0x33);

  LCD_WriteCommand(0xB7);
  LCD_WriteData(0x35);

  LCD_WriteCommand(0xBB);
  LCD_WriteData(0x35);

  LCD_WriteCommand(0xC0);
  LCD_WriteData(0x2C);

  LCD_WriteCommand(0xC2);
  LCD_WriteData(0x01);

  LCD_WriteCommand(0xC3);
  LCD_WriteData(0x13);

  LCD_WriteCommand(0xC4);
  LCD_WriteData(0x20);

  LCD_WriteCommand(0xC6);
  LCD_WriteData(0x0F);

  LCD_WriteCommand(0xD0);
  LCD_WriteData(0xA4);
  LCD_WriteData(0xA1);

  LCD_WriteCommand(0xD6);
  LCD_WriteData(0xA1);

  LCD_WriteCommand(0xE0);
  LCD_WriteData(0xF0);
  LCD_WriteData(0x00);
  LCD_WriteData(0x04);
  LCD_WriteData(0x04);
  LCD_WriteData(0x04);
  LCD_WriteData(0x05);
  LCD_WriteData(0x29);
  LCD_WriteData(0x33);
  LCD_WriteData(0x3E);
  LCD_WriteData(0x38);
  LCD_WriteData(0x12);
  LCD_WriteData(0x12);
  LCD_WriteData(0x28);
  LCD_WriteData(0x30);

  LCD_WriteCommand(0xE1);
  LCD_WriteData(0xF0);
  LCD_WriteData(0x07);
  LCD_WriteData(0x0A);
  LCD_WriteData(0x0D);
  LCD_WriteData(0x0B);
  LCD_WriteData(0x07);
  LCD_WriteData(0x28);
  LCD_WriteData(0x33);
  LCD_WriteData(0x3E);
  LCD_WriteData(0x36);
  LCD_WriteData(0x14);
  LCD_WriteData(0x14);
  LCD_WriteData(0x29);
  LCD_WriteData(0x32);

  LCD_WriteCommand(0x21);

  LCD_WriteCommand(0x11);
  delay(120);
  LCD_WriteCommand(0x29); 
}
/******************************************************************************
function: Set the cursor position
parameter :
    Xstart:   Start uint16_t x coordinate
    Ystart:   Start uint16_t y coordinate
    Xend  :   End uint16_t coordinates
    Yend  :   End uint16_t coordinatesen
******************************************************************************/
void LCD_SetCursor(uint16_t Xstart, uint16_t Ystart, uint16_t Xend, uint16_t  Yend)
{ 
  if (HORIZONTAL) {
    // set the X coordinates
    LCD_WriteCommand(0x2A);
    LCD_WriteData(Xstart >> 8);
    LCD_WriteData(Xstart + Offset_X);
    LCD_WriteData(Xend >> 8);
    LCD_WriteData(Xend + Offset_X);
    
    // set the Y coordinates
    LCD_WriteCommand(0x2B);
    LCD_WriteData(Ystart >> 8);
    LCD_WriteData(Ystart + Offset_Y);
    LCD_WriteData(Yend >> 8);
    LCD_WriteData(Yend + Offset_Y);
  }
  else {
    // set the X coordinates
    LCD_WriteCommand(0x2A);
    LCD_WriteData(Ystart >> 8);
    LCD_WriteData(Ystart + Offset_Y);
    LCD_WriteData(Yend >> 8);
    LCD_WriteData(Yend + Offset_Y);
    // set the Y coordinates
    LCD_WriteCommand(0x2B);
    LCD_WriteData(Xstart >> 8);
    LCD_WriteData(Xstart + Offset_X);
    LCD_WriteData(Xend >> 8);
    LCD_WriteData(Xend + Offset_X);
  }
  LCD_WriteCommand(0x2C);
}
/******************************************************************************
function: Refresh the image in an area
parameter :
    Xstart:   Start uint16_t x coordinate
    Ystart:   Start uint16_t y coordinate
    Xend  :   End uint16_t coordinates
    Yend  :   End uint16_t coordinates
    color :   Set the color
******************************************************************************/
void LCD_addWindow(uint16_t Xstart, uint16_t Ystart, uint16_t Xend, uint16_t Yend,uint16_t* color)
{             
  uint16_t Show_Width = Xend - Xstart + 1;
  uint16_t Show_Height = Yend - Ystart + 1;
  uint32_t numBytes = Show_Width * Show_Height * sizeof(uint16_t);
  uint8_t Read_D[numBytes];
  LCD_SetCursor(Xstart, Ystart, Xend, Yend);
  LCD_WriteData_nbyte((uint8_t*)color, Read_D, numBytes);        
}
// backlight
void Backlight_Init(void)
{
  ledcAttach(EXAMPLE_PIN_NUM_BK_LIGHT, Frequency, Resolution);    
  ledcWrite(EXAMPLE_PIN_NUM_BK_LIGHT, 100);                      
}

void Set_Backlight(uint8_t Light)                        //
{

  if(Light > 100 || Light < 0)
    printf("Set Backlight parameters in the range of 0 to 100 \r\n");
  else{
    uint32_t Backlight = Light*10;
    ledcWrite(EXAMPLE_PIN_NUM_BK_LIGHT, Backlight);
  }
}

The regular Arduino SPI object is pre-defined on FSPI for ESP32S3. Just use that rather than instantiating another object on FSPI.

the FSPI Code is default from the drivers

I am currently having an issue where I am getting the correct spi signals on the pins using an LA. But I am getting a static screen what could be the cause of this I was thinking that by setting the ADF on HSPI and the LCD on FSPI that there would not be any conflicts...

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.