From 16be10d2f386af8a3b15e31e108b8195fba1e55a Mon Sep 17 00:00:00 2001 From: InsanityAutomation Date: Sun, 26 May 2024 14:59:09 -0400 Subject: [PATCH] SPI updates from @p3p upstream --- Marlin/src/HAL/LPC4078/HAL_SPI.cpp | 28 +++++++++++++++++-- Marlin/src/HAL/LPC4078/include/SPI.h | 2 ++ .../u8g/u8g_com_HAL_LPC1768_sw_spi.cpp | 4 +-- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/Marlin/src/HAL/LPC4078/HAL_SPI.cpp b/Marlin/src/HAL/LPC4078/HAL_SPI.cpp index 4aefb25143..b01df9d146 100644 --- a/Marlin/src/HAL/LPC4078/HAL_SPI.cpp +++ b/Marlin/src/HAL/LPC4078/HAL_SPI.cpp @@ -165,14 +165,13 @@ // * @brief Wait until TXE (tx empty) flag is set and BSY (busy) flag unset. // */ static inline void waitSpiTxEnd(void *spi_d) { - #warning unimplemented // while (SSP_GetStatus(spi_d, SSP_STAT_TXFIFO_EMPTY) == RESET) { /* nada */ } // wait until TXE=1 // while (SSP_GetStatus(spi_d, SSP_STAT_BUSY) == SET) { /* nada */ } // wait until BSY=0 } // // Retain the pin init state of the SPI, to avoid init more than once, // // even if more instances of SPIClass exist -static bool spiInitialised[BOARD_NR_SPI] = { false }; +static bool spiInitialised[BOARD_NR_SPI] = {}; SPIClass::SPIClass(uint8_t device) { // // Init things specific to each SPI device @@ -184,6 +183,12 @@ SPIClass::SPIClass(uint8_t device) { _settings[0].m_config.pin_mosi = BOARD_SPI1_MOSI_PIN; _settings[0].m_config.pin_sck = BOARD_SPI1_SCK_PIN; _settings[0].m_config.pin_ssel = BOARD_SPI1_NSS_PIN; + _settings[0].m_config.frequency = 100000; + _settings[0].m_config.data_bits = 8; + _settings[0].m_config.mode = 0; + _settings[0].m_config.format = MCUI::SSP::Config::Format::SPI; + + // _settings[0].dataMode = SPI_MODE0; // _settings[0].dataSize = DATA_SIZE_8BIT; // _settings[0].clock = SPI_CLOCK_MAX; @@ -202,6 +207,18 @@ SPIClass::SPIClass(uint8_t device) { // //_settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); #endif + #if BOARD_NR_SPI >= 3 + _settings[2].device_id = 1; + _settings[2].m_config.pin_miso = BOARD_SPI3_MISO_PIN; + _settings[2].m_config.pin_mosi = BOARD_SPI3_MOSI_PIN; + _settings[2].m_config.pin_sck = BOARD_SPI3_SCK_PIN; + _settings[2].m_config.pin_ssel = BOARD_SPI3_NSS_PIN; +// _settings[1].dataMode = SPI_MODE0; +// _settings[1].dataSize = DATA_SIZE_8BIT; +// _settings[1].clock = SPI_CLOCK_MAX; +// //_settings[1].clockDivider = determine_baud_rate(_settings[1].spi_d, _settings[1].clock); + #endif + setModule(device); // // Init the GPDMA controller @@ -216,6 +233,9 @@ SPIClass::SPIClass(pin_t mosi, pin_t miso, pin_t sclk, pin_t ssel) { #if BOARD_NR_SPI >= 2 if (mosi == BOARD_SPI2_MOSI_PIN) SPIClass(2); #endif + #if BOARD_NR_SPI >= 3 + if (mosi == BOARD_SPI3_MOSI_PIN) SPIClass(3); + #endif } void SPIClass::begin() { @@ -341,7 +361,9 @@ void SPIClass::setDataSize(uint32_t dataSize) { _currentSetting->dataSize = data // /** // * Set up/tear down // */ -void SPIClass::updateSettings() { } +void SPIClass::updateSettings() { + MCUI::SSP::configure(_currentSetting->device_id, _currentSetting->m_config); +} SPIClass SPI(1); diff --git a/Marlin/src/HAL/LPC4078/include/SPI.h b/Marlin/src/HAL/LPC4078/include/SPI.h index a1b2f4623f..af4ab67745 100644 --- a/Marlin/src/HAL/LPC4078/include/SPI.h +++ b/Marlin/src/HAL/LPC4078/include/SPI.h @@ -120,6 +120,8 @@ private: bitOrder = inBitOrder; dataMode = inDataMode; dataSize = inDataSize; + m_config = {}; + m_config.frequency = 400000; } MCUI::SSP::Config m_config; diff --git a/Marlin/src/HAL/LPC4078/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp b/Marlin/src/HAL/LPC4078/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp index 03cd7b48a9..62d7008f99 100644 --- a/Marlin/src/HAL/LPC4078/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp +++ b/Marlin/src/HAL/LPC4078/u8g/u8g_com_HAL_LPC1768_sw_spi.cpp @@ -132,7 +132,7 @@ uint8_t swSpiTransfer_mode_3(uint8_t b, const uint8_t spi_speed, const pin_t sck static uint8_t SPI_speed = 0; static void u8g_sw_spi_HAL_LPC1768_shift_out(uint8_t dataPin, uint8_t clockPin, uint8_t val) { - #if EITHER(FYSETC_MINI_12864, MKS_MINI_12864) + #if ANY(FYSETC_MINI_12864, MKS_MINI_12864) swSpiTransfer_mode_3(val, SPI_speed, clockPin, -1, dataPin); #else swSpiTransfer_mode_0(val, SPI_speed, clockPin, -1, dataPin); @@ -160,7 +160,7 @@ uint8_t u8g_com_HAL_LPC1768_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, break; case U8G_COM_MSG_CHIP_SELECT: - #if EITHER(FYSETC_MINI_12864, MKS_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0 + #if ANY(FYSETC_MINI_12864, MKS_MINI_12864) // LCD SPI is running mode 3 while SD card is running mode 0 if (arg_val) { // SCK idle state needs to be set to the proper idle state before // the next chip select goes active u8g_SetPILevel(u8g, U8G_PI_SCK, 1); // Set SCK to mode 3 idle state before CS goes active