diff --git a/cores/arduino/mik32/hal/peripherals/Include/mik32_hal_spi.h b/cores/arduino/mik32/hal/peripherals/Include/mik32_hal_spi.h index 4886377..e24e7df 100644 --- a/cores/arduino/mik32/hal/peripherals/Include/mik32_hal_spi.h +++ b/cores/arduino/mik32/hal/peripherals/Include/mik32_hal_spi.h @@ -253,8 +253,8 @@ void HAL_SPI_CS_Disable(SPI_HandleTypeDef *hspi); HAL_StatusTypeDef HAL_SPI_Exchange(SPI_HandleTypeDef *hspi, uint8_t TransmitBytes[], uint8_t ReceiveBytes[], uint32_t Size, uint32_t Timeout); HAL_StatusTypeDef HAL_SPI_ExchangeThreshold(SPI_HandleTypeDef *hspi, uint8_t TransmitBytes[], uint8_t ReceiveBytes[], uint32_t DataSize, uint32_t Timeout); HAL_StatusTypeDef HAL_SPI_Exchange_IT(SPI_HandleTypeDef *hspi, uint8_t TransmitBytes[], uint8_t ReceiveBytes[], uint32_t Size); -void HAL_SPI_Set_Clock_Divider(SPI_HandleTypeDef *hspi, uint8_t clockDiv); -void HAL_SPI_Set_Clock_Mode(SPI_HandleTypeDef *hspi, uint8_t CLKPhase, uint8_t CLKPolarity); +void HAL_SPI_Set_Clock_Divider(SPI_HandleTypeDef *hspi); +void HAL_SPI_Set_Clock_Mode(SPI_HandleTypeDef *hspi); /** * @brief Разрешить прерывания в соответствии с маской. diff --git a/cores/arduino/mik32/hal/peripherals/Source/mik32_hal_spi.c b/cores/arduino/mik32/hal/peripherals/Source/mik32_hal_spi.c index e70587e..41da68c 100644 --- a/cores/arduino/mik32/hal/peripherals/Source/mik32_hal_spi.c +++ b/cores/arduino/mik32/hal/peripherals/Source/mik32_hal_spi.c @@ -287,17 +287,14 @@ HAL_StatusTypeDef HAL_SPI_Init(SPI_HandleTypeDef *hspi) * * @param hspi указатель на структуру SPI_HandleTypeDef, которая содержит * информацию о конфигурации для модуля SPI. - * @param clockDiv делитель частоты в пределах от SPI_BAUDRATE_DIV4 до SPI_BAUDRATE_DIV256 */ -void HAL_SPI_Set_Clock_Divider(SPI_HandleTypeDef *hspi, uint8_t clockDiv) +void HAL_SPI_Set_Clock_Divider(SPI_HandleTypeDef *hspi) { uint32_t config = hspi->Instance->CONFIG; HAL_SPI_Disable(hspi); - hspi->Init.BaudRateDiv = clockDiv; config &= ~(0b111 << SPI_CONFIG_BAUD_RATE_DIV_S); // очистить config |= (hspi->Init.BaudRateDiv << SPI_CONFIG_BAUD_RATE_DIV_S); // установить новое hspi->Instance->CONFIG = config; // сохранить конфигурацию - HAL_SPI_Enable(hspi); } /** @@ -305,24 +302,15 @@ void HAL_SPI_Set_Clock_Divider(SPI_HandleTypeDef *hspi, uint8_t clockDiv) * * @param hspi указатель на структуру SPI_HandleTypeDef, которая содержит * информацию о конфигурации для модуля SPI. - * @param CLKPhase фаза тактирующего сигнала: - * 1 - тактовая частота SPI неактивна вне слова, - * 0 - тактовая частота SPI активна вне слова - * @param CLKPolarity полярность тактирующего сигнала - * 1 - тактовый сигнал удерживается на высоком уровне, - * 0 - тактовый сигнал удерживается на низком уровне */ -void HAL_SPI_Set_Clock_Mode(SPI_HandleTypeDef *hspi, uint8_t CLKPhase, uint8_t CLKPolarity) +void HAL_SPI_Set_Clock_Mode(SPI_HandleTypeDef *hspi) { uint32_t config = hspi->Instance->CONFIG; HAL_SPI_Disable(hspi); - hspi->Init.CLKPhase = CLKPhase; - hspi->Init.CLKPolarity = CLKPolarity; config &= ~((1 << SPI_CONFIG_CLK_PH_S) | (1 << SPI_CONFIG_CLK_POL_S)); // очистить config |= ((hspi->Init.CLKPhase << SPI_CONFIG_CLK_PH_S) | (hspi->Init.CLKPolarity << SPI_CONFIG_CLK_POL_S)); // установить новые значения hspi->Instance->CONFIG = config; // сохранить конфигурацию - HAL_SPI_Enable(hspi); } /** diff --git a/libraries/SPI/src/SPI.cpp b/libraries/SPI/src/SPI.cpp index 10a9270..ad30a09 100644 --- a/libraries/SPI/src/SPI.cpp +++ b/libraries/SPI/src/SPI.cpp @@ -2,10 +2,11 @@ #include "mik32_hal_spi.h" SPI_HandleTypeDef hspi; + bool newConfig = false; bool isInited = false; uint32_t currentSpeed = 0; -int8_t currentDataOrder = -1; +int8_t currentDataOrder = MSBFIRST; int8_t currentDataMode = -1; static uint8_t reverse_bits(uint8_t byte); @@ -31,16 +32,10 @@ void SPISettings::spiUpdateSettings(uint32_t speedMaximum, uint8_t dataOrder, ui } // if break didn't call in cycle, it will be the greatest divRegVal (and divider) - // update config - hspi.Instance = SPI_1; - hspi.Init.SPI_Mode = HAL_SPI_MODE_MASTER; // only master mode + // update params in struct hspi.Init.CLKPhase = dataMode & 0b00000001; hspi.Init.CLKPolarity = (dataMode & 0b00000010)>>1; - hspi.Init.ThresholdTX = 4; hspi.Init.BaudRateDiv = divRegVal; - hspi.Init.Decoder = SPI_DECODER_NONE; - hspi.Init.ManualCS = SPI_MANUALCS_ON; - hspi.Init.ChipSelect = SPI_CS_NONE; currentSpeed = speedMaximum; currentDataOrder = dataOrder; @@ -51,18 +46,27 @@ void SPISettings::spiUpdateSettings(uint32_t speedMaximum, uint8_t dataOrder, ui // ------------------------------------------------------------------ // - SPIClass SPI; bool SPIClass::spiInUse = false; uint8_t SPIClass::interruptMode = 0; uint8_t SPIClass::interruptMask = 0; -#define PAD_GET_PIN_CONFIG(port, pin) (((PAD_CONFIG->port) & (0b11<<(2*pin))) >> (2*pin)) - void SPIClass::begin() { spi_onBegin(); + // set constant parameters in spi struct + hspi.Instance = SPI_1; + hspi.Init.SPI_Mode = HAL_SPI_MODE_MASTER; // only master mode used + hspi.Init.ThresholdTX = 4; + hspi.Init.Decoder = SPI_DECODER_NONE; + hspi.Init.ManualCS = SPI_MANUALCS_ON; + hspi.Init.ChipSelect = SPI_CS_NONE; + // adjustable parameters default values as in SPISettings() + hspi.Init.BaudRateDiv = SPI_CLOCK_DIV8; + hspi.Init.CLKPhase = SPI_MODE0 & 0b00000001; + hspi.Init.CLKPolarity = (SPI_MODE0 & 0b00000010)>>1; + spiInUse = true; } @@ -242,27 +246,44 @@ void SPIClass::endTransaction(void) // ------------------------------------ // void SPIClass::setBitOrder(uint8_t bitOrder) { - currentDataOrder = bitOrder; + if (spiInUse) + currentDataOrder = bitOrder; + else + ErrorMsgHandler("SPI.setBitOrder():SPI.begin() need to be called first"); } void SPIClass::setDataMode(uint8_t dataMode) { - // ClkPhase ClkPolarity - HAL_SPI_Set_Clock_Mode(&hspi, (dataMode&0b00000001), (dataMode&0b00000010)>>1); + if (spiInUse) + { + hspi.Init.CLKPhase = (dataMode&0b00000001); + hspi.Init.CLKPolarity = (dataMode&0b00000010)>>1; + HAL_SPI_Set_Clock_Mode(&hspi); + currentDataMode = dataMode; + } + else + ErrorMsgHandler("SPI.setDataMode():SPI.begin() need to be called first"); } void SPIClass::setClockDivider(uint8_t clockDiv) { - // if divider is valid - if ((clockDiv == SPI_CLOCK_DIV4) || (clockDiv == SPI_CLOCK_DIV8) || - (clockDiv == SPI_CLOCK_DIV16) || (clockDiv == SPI_CLOCK_DIV32) || - (clockDiv == SPI_CLOCK_DIV64) || (clockDiv == SPI_CLOCK_DIV128) || - (clockDiv == SPI_CLOCK_DIV256)) + if (spiInUse) { - HAL_SPI_Set_Clock_Divider(&hspi, clockDiv); + // if divider is valid + if ((clockDiv == SPI_CLOCK_DIV4) || (clockDiv == SPI_CLOCK_DIV8) || + (clockDiv == SPI_CLOCK_DIV16) || (clockDiv == SPI_CLOCK_DIV32) || + (clockDiv == SPI_CLOCK_DIV64) || (clockDiv == SPI_CLOCK_DIV128) || + (clockDiv == SPI_CLOCK_DIV256)) + { + hspi.Init.BaudRateDiv = clockDiv; + currentSpeed = F_CPU >> (clockDiv+1); + HAL_SPI_Set_Clock_Divider(&hspi); + } + else + ErrorMsgHandler("SPI.setClockDivider(): Invalid clock devider"); } else - ErrorMsgHandler("SPI.setClockDivider(): Invalid clock devider"); + ErrorMsgHandler("SPI.setClockDivider():SPI.begin() need to be called first"); } static uint8_t reverse_bits(uint8_t byte)