forked from Elron_dev/elbear_arduino_bsp
фикс для spi от Огънеꙗръ
This commit is contained in:
parent
11141eb44d
commit
7920df9d13
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user