фикс для spi от Огънеꙗръ

This commit is contained in:
khristolyubov 2024-08-20 20:39:53 +07:00
parent 11141eb44d
commit 7920df9d13
2 changed files with 68 additions and 5 deletions

View File

@ -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,6 +329,66 @@ 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;

View File

@ -15,6 +15,7 @@
#define _SPI_H_INCLUDED
#include <Arduino.h>
#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;