From 7920df9d1328bac20ab4cd2c086ad09729594b92 Mon Sep 17 00:00:00 2001 From: khristolyubov Date: Tue, 20 Aug 2024 20:39:53 +0700 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=20=D0=B4=D0=BB=D1=8F?= =?UTF-8?q?=20spi=20=D0=BE=D1=82=20=D0=9E=D0=B3=D1=8A=D0=BD=D0=B5=EA=99=97?= =?UTF-8?q?=D1=80=D1=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libraries/SPI/src/SPI.cpp | 69 ++++++++++++++++++++++++++++++++++++--- libraries/SPI/src/SPI.h | 4 +++ 2 files changed, 68 insertions(+), 5 deletions(-) diff --git a/libraries/SPI/src/SPI.cpp b/libraries/SPI/src/SPI.cpp index 7a28066..e510b44 100644 --- a/libraries/SPI/src/SPI.cpp +++ b/libraries/SPI/src/SPI.cpp @@ -1,5 +1,4 @@ #include "SPI.h" -#include "mik32_hal_spi.h" SPI_HandleTypeDef hspi; bool newConfig = false; @@ -205,7 +204,7 @@ uint8_t SPIClass::transfer(uint8_t data) data = reverse_bits(data); // send and recieve data - HAL_StatusTypeDef SPI_Status = HAL_SPI_Exchange(&hspi, &data, &rxByte, 1, SPI_TIMEOUT_DEFAULT*2); + HAL_StatusTypeDef SPI_Status = exchange(&hspi, &data, &rxByte, 1, SPI_TIMEOUT_DEFAULT*2); if (SPI_Status != HAL_OK) HAL_SPI_ClearError(&hspi); @@ -237,7 +236,7 @@ uint16_t SPIClass::transfer16(uint16_t data) } // send and recieve data - HAL_StatusTypeDef SPI_Status = HAL_SPI_Exchange(&hspi, buf, buf, 2, SPI_TIMEOUT_DEFAULT*2); + HAL_StatusTypeDef SPI_Status = exchange(&hspi, buf, buf, 2, SPI_TIMEOUT_DEFAULT*2); if (SPI_Status != HAL_OK) HAL_SPI_ClearError(&hspi); @@ -268,7 +267,7 @@ void SPIClass::transfer(void *buf, size_t count) } // send and recieve data using the same buffer - HAL_StatusTypeDef SPI_Status = HAL_SPI_Exchange(&hspi, (uint8_t*)buf, (uint8_t*)buf, count, SPI_TIMEOUT_DEFAULT*2); + HAL_StatusTypeDef SPI_Status = exchange(&hspi, (uint8_t*)buf, (uint8_t*)buf, count, SPI_TIMEOUT_DEFAULT*2); if (SPI_Status != HAL_OK) HAL_SPI_ClearError(&hspi); @@ -330,10 +329,70 @@ void SPIClass::setClockDivider(uint8_t clockDiv) } } +HAL_StatusTypeDef SPIClass::exchange(SPI_HandleTypeDef *hspi, uint8_t TransmitBytes[], uint8_t ReceiveBytes[], uint32_t DataSize, uint32_t Timeout) +{ + uint32_t txallowed = 1; + HAL_StatusTypeDef error_code = HAL_OK; + uint32_t timeout_counter = 0; + + hspi->ErrorCode = HAL_SPI_ERROR_NONE; + hspi->pRxBuffPtr = (uint8_t *)ReceiveBytes; + hspi->RxCount = DataSize; + hspi->pTxBuffPtr = (uint8_t *)TransmitBytes; + hspi->TxCount = DataSize; + + hspi->Instance->TX_THR = 1; + + /* Включить SPI если выключено */ + if (!(hspi->Instance->ENABLE & SPI_ENABLE_M)) + { + __HAL_SPI_ENABLE(hspi); + } + + while ((hspi->TxCount > 0) || (hspi->RxCount > 0)) + { + /* Проверка флага TX_FIFO_NOT_FULL */ + if ((hspi->Instance->INT_STATUS & SPI_INT_STATUS_TX_FIFO_NOT_FULL_M) && (hspi->TxCount > 0) && (txallowed == 1)) + { + hspi->Instance->TXDATA = *(hspi->pTxBuffPtr); + hspi->pTxBuffPtr++; + hspi->TxCount--; + /* Следующие данные - прием (Rx). Tx не разрешен */ + txallowed = 0; + } + + /* Ожидание когда установится флаг RX_FIFO_NOT_EMPTY */ + if ((hspi->Instance->INT_STATUS & SPI_INT_STATUS_RX_FIFO_NOT_EMPTY_M) && (hspi->RxCount > 0)) + { + *(hspi->pRxBuffPtr) = hspi->Instance->RXDATA; + hspi->pRxBuffPtr++; + hspi->RxCount--; + /* Следующие данные - передача (Tx). Tx разрешается */ + txallowed = 1; + } + + if (((timeout_counter++) >= Timeout) || (Timeout == 0U)) + { + error_code = HAL_TIMEOUT; + goto error; + } + } + return error_code; + +error: + __HAL_SPI_DISABLE(hspi); + hspi->Instance->ENABLE |= SPI_ENABLE_CLEAR_TX_FIFO_M | SPI_ENABLE_CLEAR_RX_FIFO_M; /* Очистка буферов RX и TX */ + volatile uint32_t unused = hspi->Instance->INT_STATUS; /* Очистка флагов ошибок чтением */ + (void) unused; + + + return error_code; +} + static uint8_t reverse_bits(uint8_t byte) { byte = (byte & 0xF0) >> 4 | (byte & 0x0F) << 4; byte = (byte & 0xCC) >> 2 | (byte & 0x33) << 2; byte = (byte & 0xAA) >> 1 | (byte & 0x55) << 1; return byte; -} \ No newline at end of file +} diff --git a/libraries/SPI/src/SPI.h b/libraries/SPI/src/SPI.h index 109c3b1..89461bb 100644 --- a/libraries/SPI/src/SPI.h +++ b/libraries/SPI/src/SPI.h @@ -15,6 +15,7 @@ #define _SPI_H_INCLUDED #include +#include "mik32_hal_spi.h" // SPI_HAS_TRANSACTION means SPI has beginTransaction(), endTransaction(), // usingInterrupt(), and SPISetting(clock, bitOrder, dataMode) @@ -126,6 +127,9 @@ public: // This function is deprecated. New applications should use // beginTransaction() to configure SPI settings. void setClockDivider(uint8_t clockDiv); + + // A temporary function until this error is fixed in the HAL library + HAL_StatusTypeDef exchange(SPI_HandleTypeDef *hspi, uint8_t TransmitBytes[], uint8_t ReceiveBytes[], uint32_t DataSize, uint32_t Timeout); }; extern SPIClass SPI;