инициализация структуры spi перенесена в spi.begin, т.к. до этого функции-сеттеры зависали при попытке поработать с элементами этой структуры. Сами сеттеры тоже немного изменены
This commit is contained in:
parent
63e718e83f
commit
63217147e5
@ -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 Разрешить прерывания в соответствии с маской.
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -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,16 +246,28 @@ void SPIClass::endTransaction(void)
|
||||
// ------------------------------------ //
|
||||
void SPIClass::setBitOrder(uint8_t 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 (spiInUse)
|
||||
{
|
||||
// if divider is valid
|
||||
if ((clockDiv == SPI_CLOCK_DIV4) || (clockDiv == SPI_CLOCK_DIV8) ||
|
||||
@ -259,11 +275,16 @@ void SPIClass::setClockDivider(uint8_t clockDiv)
|
||||
(clockDiv == SPI_CLOCK_DIV64) || (clockDiv == SPI_CLOCK_DIV128) ||
|
||||
(clockDiv == SPI_CLOCK_DIV256))
|
||||
{
|
||||
HAL_SPI_Set_Clock_Divider(&hspi, clockDiv);
|
||||
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():SPI.begin() need to be called first");
|
||||
}
|
||||
|
||||
static uint8_t reverse_bits(uint8_t byte)
|
||||
{
|
||||
|
||||
Loading…
Reference in New Issue
Block a user