Arduino Core for STM32  1.0
HardwareSPI.h
Go to the documentation of this file.
1 
15 #ifndef _SPI_H_INCLUDED
16 #define _SPI_H_INCLUDED
17 
18 #include "HardwareCRC.h"
19 
20 //Includes
21 #if defined(STM32F103xB)
22 //#include "stm32f1xx_hal.h"
23 
24 #define IS_SPI_INSTANCE_ON_APB1(_instance_) ((_instance_) == SPI2)
25 #define IS_SPI_INSTANCE_ON_APB2(_instance_) ((_instance_) == SPI1)
26 
27 #elif defined(STM32F031x6) || defined(STM32F070xB) || defined(STM32F070x6) || defined(STM32F030x6)
28 //#include "stm32f0xx_hal.h"
29 
30 //#define IS_SPI_INSTANCE_ON_APB2(_instance_)
31 #define IS_SPI_INSTANCE_ON_APB1(_instance_) ((_instance_) == SPI1)
32 
33 #elif defined(STM32L031xx)
34 //#include "stm32l0xx_hal.h"
35 
36 //#define IS_SPI_INSTANCE_ON_APB1(_instance_)
37 #define IS_SPI_INSTANCE_ON_APB2(_instance_) ((_instance_) == SPI1)
38 
39 #elif defined(STM32L432xx)
40 //#include "stm32l4xx_hal.h"
41 
42 #define IS_SPI_INSTANCE_ON_APB1(_instance_) ((_instance_) == SPI3)
43 #define IS_SPI_INSTANCE_ON_APB2(_instance_) ((_instance_) == SPI1)
44 
45 #else
46 #error "Definitions for your MCU are not defined."
47 #endif
48 
49 #if defined(HAL_SPI_MODULE_ENABLED) || defined(DOXYGEN_FORCED)
50 
55 #define SPI_HAS_TRANSACTION 1
56 
61 #define SPI_CLOCK_DIV2 SPI_BAUDRATEPRESCALER_2
62 #define SPI_CLOCK_DIV4 SPI_BAUDRATEPRESCALER_4
63 #define SPI_CLOCK_DIV8 SPI_BAUDRATEPRESCALER_8
64 #define SPI_CLOCK_DIV16 SPI_BAUDRATEPRESCALER_16
65 #define SPI_CLOCK_DIV32 SPI_BAUDRATEPRESCALER_32
66 #define SPI_CLOCK_DIV64 SPI_BAUDRATEPRESCALER_64
67 #define SPI_CLOCK_DIV128 SPI_BAUDRATEPRESCALER_128
68 #define SPI_CLOCK_DIV256 SPI_BAUDRATEPRESCALER_256
69 
86 const uint8_t SPI_MODE0 = 0x00;
87 const uint8_t SPI_MODE1 = 0x01;
88 const uint8_t SPI_MODE2 = 0x10;
89 const uint8_t SPI_MODE3 = 0x11;
90 
98 #define SPI_MASTER SPI_MODE_MASTER
99 #define SPI_SLAVE SPI_MODE_SLAVE
100 
110 typedef enum{
112  SPI_OK = HAL_OK,
114  SPI_ERR = HAL_ERROR,
116  SPI_BUSY_ERR = HAL_BUSY,
118  SPI_TIMEOUT = HAL_TIMEOUT,
125 
126 }SPI_Status;
127 
134 typedef enum{
136  SPI_ERROR_NONE = HAL_SPI_ERROR_NONE,
138  SPI_ERROR_MODF = HAL_SPI_ERROR_MODF,
140  SPI_ERROR_CRC = HAL_SPI_ERROR_CRC,
142  SPI_ERROR_OVR = HAL_SPI_ERROR_OVR,
143 #ifdef HAL_SPI_ERROR_FRE
144 
145  SPI_ERROR_FRE = HAL_SPI_ERROR_FRE,
146 #endif
147 
148  SPI_ERROR_DMA = HAL_SPI_ERROR_DMA,
150  SPI_ERROR_FLAG = HAL_SPI_ERROR_FLAG,
152  SPI_ERROR_ABORT = HAL_SPI_ERROR_ABORT,
154 
160 typedef enum{
171 
172 
181 class SPISettings {
182 public:
184  SPISettings(uint32_t clock, uint8_t bitOrder, uint8_t dataMode) :_clock(clock), _bitOrder(bitOrder), _dataMode(dataMode){}
185  uint32_t _clock;
186  uint8_t _bitOrder;
187  uint8_t _dataMode;
188 };
189 
220 class HardwareSPI {
221 public:
225  HardwareSPI(SPI_HandleTypeDef &hspi);
226 
230  ~HardwareSPI();
231 
244  bool begin(SPI_InitTypeDef &initStruct);
245 
251  bool begin();
252 
257  bool end();
258  //End of SPIInitMethods
260 
271  bool isSending(){
272  return _hspi->State == HAL_SPI_STATE_BUSY_TX || _hspi->State == HAL_SPI_STATE_BUSY_TX_RX;
273  }
274 
279  bool isReceiving(){
280  return _hspi->State == HAL_SPI_STATE_BUSY_RX || _hspi->State == HAL_SPI_STATE_BUSY_TX_RX;
281  }
282 
288  return (_hspi->State == HAL_SPI_STATE_BUSY_TX_RX);
289  }
290 
295  inline bool isTransacting(){
296  return _hspi->State == HAL_SPI_STATE_BUSY_TX || _hspi->State == HAL_SPI_STATE_BUSY_TX_RX || _hspi->State == HAL_SPI_STATE_BUSY_RX;
297  }
298 
303  bool instanceExists(void){
304  return (&_hspi != NULL) && (IS_SPI_ALL_INSTANCE(_hspi->Instance));
305  }
306 
307 
308  //End of SPIStateMethods
310 
324  bool connectDMAtoRx(DMA_HandleTypeDef &DMA_handle);
325 
333  bool connectDMAtoTx(DMA_HandleTypeDef &DMA_handle);
334 
340  bool disconnectDMAfromRx();
341 
347  bool disconnectDMAfromTx();
348 
353  bool isDMAconnectedToRx(void);
354 
359  bool isDMAconnectedToTx(void);
360 
366  uint32_t getSPIClockFreq(void);
367 
375  bool setMode(uint32_t mode);
376 
382  uint32_t getMode();
383 
394  bool setHwCS(bool HardwareCS, bool OutputCS = true);
395 
400  bool isHwCS();
401 
406  bool isHwOutputCS();
407 
414  bool setBitOrder(uint8_t bitOrder);
415 
420  uint8_t getBitOrder();
421 
436  bool setDataMode(uint8_t dataMode);
437 
448  uint8_t getDataMode();
449 
458  bool setFrequency(uint32_t freq);
459 
464  uint32_t getFrequency();
465 
473  bool setClockDivider(uint32_t clockDiv);
474 
479  uint32_t getClockDivider();
480 
489  bool setDataBits(uint16_t bits);
490 
495  uint16_t getDataBits();
496 
504  bool enableTImode(bool enable);
505 
510  bool isTImodeEnabled();
511 
519  bool enableCRC(bool enable);
520 
525  bool isCRCenabled();
526 
533  bool setCRClength(SPI_CRCLength length);
534 
540 
549  bool setCRCPolynomial(uint32_t polynomial);
550 
555  uint32_t getCRCPolynomial();
556 
563  void setTimeout(uint32_t Timeout);
564 
569  uint32_t getTimeout();
570  //End of SPISettingMethods
572 
590  virtual SPI_Status beginTransaction(SPISettings settings);
591 
596  void flushRX();
597 
603  bool flush();
604  //End of SPITransactionInitMethods
606 
636  virtual uint16_t transfer(uint16_t data, bool lastByte = false);
637 
645  virtual uint16_t transfer16(uint16_t data, bool lastByte = false);
646 
654  virtual uint32_t transfer32(uint32_t data, bool lastByte = false);
655 
665  virtual bool transfer(void *buf, uint16_t count, bool lastByte = false);
666 
674  virtual bool write(uint16_t data, bool lastByte = false);
675 
683  virtual bool write16(uint16_t data, bool lastByte = false);
684 
692  virtual bool write32(uint32_t data, bool lastByte = false);
693 
701  virtual uint16_t receive(bool lastByte = false);
702 
710  virtual uint16_t receive16(bool lastByte = false);
711 
719  virtual uint32_t receive32(bool lastByte = false);
720 
730  virtual bool writeBytes(const uint8_t * data, uint32_t size, bool lastByte = false);
731 
742  virtual bool writeBytesNonBlocking(const uint8_t * data, uint32_t size, bool lastByte = false);
743 
754  virtual bool transferBytes(const uint8_t * out, uint8_t * in, uint32_t size, bool lastByte = false);
755 
767  virtual bool transferBytesNonBlocking(const uint8_t * out, uint8_t * in, uint32_t size, bool lastByte = false);
768 
778  virtual bool receiveBytes(uint8_t * data, uint32_t size, bool lastByte = false);
779 
790  virtual bool receiveBytesNonBlocking(uint8_t * data, uint32_t size, bool lastByte = false);
791  //End of SPITransactionMethods
793 
803  virtual SPI_Status endTransaction(void);
804  //End of SPITransactionInitMethods
806 
807 
817  bool isFullDuplex();
818 
823  bool isRxEnabled();
824 
829  bool isTxEnabled();
830 
834  operator bool() const
835  {
836  return (&_hspi != NULL) && (IS_SPI_ALL_INSTANCE(_hspi->Instance));
837  }
838 
843  inline bool available(){
844  return __HAL_SPI_GET_FLAG(_hspi, SPI_FLAG_RXNE);
845  }
846 
851  inline bool hasError(void)
852  {
853  return _hspi->ErrorCode != HAL_SPI_ERROR_NONE;
854  }
855 
861  inline SPI_ErrorCode getError(void){
862  return (SPI_ErrorCode)_hspi->ErrorCode;
863  }
864 
870  inline void clearError(uint32_t clearMask = 0xFFFFFFFFUL){
871  _hspi->ErrorCode = (_hspi->ErrorCode & (~clearMask));
872  }
873 
879  return transactionError;
880  }
881  //End of SPIStateMethods
883 
895  inline void setWriteDoneCallback(void (* WriteDoneCallback_)() ){ WriteDoneCallback = WriteDoneCallback_; }
896 
901  inline void setTransferDoneCallback(void (* TransferDoneCallback_)() ){ TransferDoneCallback = TransferDoneCallback_; }
902 
907  inline void setReceiveDoneCallback(void (* ReceiveDoneCallback_)() ){ ReceiveDoneCallback = ReceiveDoneCallback_; }
908 
913  inline void setWriteHalfCallback(void (* WriteHalfCallback_)() ){ WriteHalfCallback = WriteHalfCallback_; }
914 
919  inline void setTransferHalfCallback(void (* TransferHalfCallback_)() ){ TransferHalfCallback = TransferHalfCallback_; }
920 
925  inline void setReceiveHalfCallback(void (* ReceiveHalfCallback_)() ){ ReceiveHalfCallback = ReceiveHalfCallback_; }
926 
931  inline void setErrorCallback(void (* ErrorCallback_)(SPI_ErrorCode) ){ ErrorCallback = ErrorCallback_; }
932 
937  static inline void handleWriteDoneCallback(SPI_TypeDef* instance);
938 
943  static inline void handleTransferDoneCallback(SPI_TypeDef* instance);
944 
949  static inline void handleReceiveDoneCallback(SPI_TypeDef* instance);
950 
955  static inline void handleWriteHalfCallback(SPI_TypeDef* instance);
956 
961  static inline void handleTransferHalfCallback(SPI_TypeDef* instance);
962 
967  static inline void handleReceiveHalfCallback(SPI_TypeDef* instance);
968 
973  static inline void handleErrorCallback(SPI_TypeDef* instance);
974  //End of SPICallbackMethods
976 
989  static uint32_t getSPIIndex(SPI_TypeDef* instance);
990 
995  static HardwareSPI** getSPIInstances(); //returns pointer to instances
996 
1001  static uint8_t getAvailableSPIsCount();
1002 
1007  SPI_HandleTypeDef& getHAL_SPI_Struct(){
1008  return *_hspi;
1009  }
1010  //End of SPIAdvancedMethods
1012 
1013 protected:
1017  SPI_HandleTypeDef *_hspi = NULL;
1018 
1022  uint32_t _startMillis = 0;
1023 
1027  uint32_t timeout = 1000;
1028 
1033 
1034  void (* WriteDoneCallback)() = NULL;
1035  void (* TransferDoneCallback)() = NULL;
1036  void (* ReceiveDoneCallback)() = NULL;
1037  void (* WriteHalfCallback)() = NULL;
1038  void (* TransferHalfCallback)() = NULL;
1039  void (* ReceiveHalfCallback)() = NULL;
1040  void (* ErrorCallback)(SPI_ErrorCode) = NULL;
1041 
1046 
1050  void inline clearCRCErrorFlag(){
1051  __HAL_SPI_CLEAR_CRCERRFLAG(_hspi);
1052  }
1053 
1057  void inline clearOVRErrorFlag(){
1058  __HAL_SPI_CLEAR_OVRFLAG(_hspi);
1059  }
1060 
1064  void inline clearMODFlag(){
1065  __HAL_SPI_CLEAR_MODFFLAG(_hspi);
1066  }
1067 
1071  void inline clearFREFlag(){
1072 #ifdef __HAL_SPI_CLEAR_FREFLAG
1073  __HAL_SPI_CLEAR_FREFLAG(_hspi);
1074 #endif
1075  }
1076 
1081  void addThisToInstArr();
1082 
1086  void removeThisFromInstArr();
1087 
1091  static HardwareSPI* instances[]; //There are stored pointers to all created instances of this class
1092 
1096  static uint8_t availableSPIsCount;
1097 };
1098 
1099 
1100 #if defined(STM32L432xx) || defined(DOXYGEN_FORCED)
1101 
1102 
1134 public:
1138  HardwareSPI_O(SPI_HandleTypeDef &hspi):HardwareSPI(hspi){
1139  }
1140 
1161  SPI_Status beginTransaction(SPISettings settings) override;
1162  //End of SPIOTransactionInitMethods
1164 
1198  uint16_t transfer(uint16_t data, bool lastByte = false) override;
1199 
1208  uint16_t transfer16(uint16_t data, bool lastByte = false) override;
1209 
1218  uint32_t transfer32(uint32_t data, bool lastByte = false) override;
1219 
1228  bool write(uint16_t data, bool lastByte = false) override;
1229 
1238  bool write16(uint16_t data, bool lastByte = false) override;
1239 
1248  bool write32(uint32_t data, bool lastByte = false) override;
1249 
1258  uint16_t receive(bool lastByte = false) override;
1259 
1268  uint16_t receive16(bool lastByte = false) override;
1269 
1278  uint32_t receive32(bool lastByte = false) override;
1279 
1291  bool transferBytes(const uint8_t * out, uint8_t * in, uint32_t size, bool lastByte = false) override;
1292 
1303  bool writeBytes(const uint8_t * data, uint32_t size, bool lastByte = false) override;
1304 
1315  bool receiveBytes(uint8_t * data, uint32_t size, bool lastByte = false) override;
1316 
1327  bool transfer(void *buf, uint16_t count, bool lastByte = false) override;
1328  //End of SPIOTransactionMethods
1330 
1331 
1343  SPI_Status endTransaction() override;
1344  //End of SPIOTransactionInitMethods
1346 
1347 
1348 private:
1352  bool transactionEnabled = false;
1353 
1358  bool receiveEnabled = false;
1359 
1364  bool transmitEnabled = false;
1365 
1369  bool receiveUsed = false;
1370 
1374  bool transmitUsed = false;
1375 
1376 #if (USE_SPI_CRC != 0U)
1377  bool SPI_isMasterAndNSSIsEnabled = false;
1378 #endif /* USE_SPI_CRC */
1379 
1380  HAL_StatusTypeDef SPI_EndRxTxTransaction(uint32_t Timeout, uint32_t Tickstart);
1381  HAL_StatusTypeDef SPI_EndRxTransaction(uint32_t Timeout, uint32_t Tickstart);
1382  HAL_StatusTypeDef SPI_WaitFifoStateUntilTimeout(uint32_t Fifo, uint32_t State, uint32_t Timeout, uint32_t Tickstart);
1383  HAL_StatusTypeDef SPI_WaitFlagStateUntilTimeout(uint32_t Flag, FlagStatus State, uint32_t Timeout, uint32_t Tickstart);
1384 };
1385 
1386 #endif // defined(STM32L432xx) || defined(DOXYGEN_FORCED)
1387 
1388 #endif //defined(HAL_SPI_MODULE_ENABLED) || defined(DOXYGEN_FORCED)
1389 #endif //_SPI_H_INCLUDED
HardwareSPI::setReceiveDoneCallback
void setReceiveDoneCallback(void(*ReceiveDoneCallback_)())
Sets callback function, that will be called when all data using receiveBytesNonBlocking() method were...
Definition: HardwareSPI.h:907
HardwareSPI::WriteHalfCallback
void(* WriteHalfCallback)()
Definition: HardwareSPI.h:1037
HardwareSPI::available
bool available()
Checks if any data are available in RX FIFO buffer.
Definition: HardwareSPI.h:843
HardwareSPI::timeout
uint32_t timeout
Timeout interval in ms.
Definition: HardwareSPI.h:1027
HardwareSPI::receive32
virtual uint32_t receive32(bool lastByte=false)
Receives data from SPI periphery.
Definition: HardwareSPI.cpp:943
HardwareSPI::handleWriteDoneCallback
static void handleWriteDoneCallback(SPI_TypeDef *instance)
Handles WriteDone callback function.
Definition: HardwareSPI.cpp:1151
HardwareSPI::getFrequency
uint32_t getFrequency()
Calculates SPI frequency from APB frequency and Clock Divider.
Definition: HardwareSPI.cpp:516
HardwareSPI::getCRCPolynomial
uint32_t getCRCPolynomial()
Gets CRC polynomial.
Definition: HardwareSPI.cpp:737
HardwareSPI::receiveBytesNonBlocking
virtual bool receiveBytesNonBlocking(uint8_t *data, uint32_t size, bool lastByte=false)
Receives data from SPI periphery in non-blocking mode using DMA or IT (interrupt) mode.
Definition: HardwareSPI.cpp:1091
HardwareSPI::isHwCS
bool isHwCS()
Gets, if Chip Select is handled by hardware.
Definition: HardwareSPI.cpp:338
HardwareSPI::getSPIIndex
static uint32_t getSPIIndex(SPI_TypeDef *instance)
Gets SPI instance index.
Definition: HardwareSPI.cpp:1313
HardwareSPI::getHAL_SPI_Struct
SPI_HandleTypeDef & getHAL_SPI_Struct()
Returns SPI structure, that is used for handling SPI.
Definition: HardwareSPI.h:1007
SPI_MODE0
const uint8_t SPI_MODE0
CPOL: 0 CPHA: 0.
Definition: HardwareSPI.h:86
HardwareSPI::beginTransaction
virtual SPI_Status beginTransaction(SPISettings settings)
Sets some settings to SPI periphery before transaction.
Definition: HardwareSPI.cpp:348
HardwareSPI::transfer
virtual uint16_t transfer(uint16_t data, bool lastByte=false)
SPI transfer is based on a simultaneous send and receive data.
Definition: HardwareSPI.cpp:755
HardwareSPI::write16
virtual bool write16(uint16_t data, bool lastByte=false)
Sends data using SPI periphery.
Definition: HardwareSPI.cpp:865
HardwareSPI::begin
bool begin()
Initialize SPI periphery and it's pins.
Definition: HardwareSPI.cpp:34
HardwareSPI::handleTransferDoneCallback
static void handleTransferDoneCallback(SPI_TypeDef *instance)
Handles TransferDone callback function.
Definition: HardwareSPI.cpp:1161
HardwareSPI::getSPIClockFreq
uint32_t getSPIClockFreq(void)
Gets periphery SPI Clock Frequency in Hz.
Definition: HardwareSPI.cpp:454
HardwareSPI::setClockDivider
bool setClockDivider(uint32_t clockDiv)
Sets SPI clock divider.
Definition: HardwareSPI.cpp:530
HardwareSPI_O
This class is for handling SPI periphery, but is more optimized for speed same as arduino SPI class.
Definition: HardwareSPI.h:1133
HardwareSPI::handleWriteHalfCallback
static void handleWriteHalfCallback(SPI_TypeDef *instance)
Handles WriteHalf callback function.
Definition: HardwareSPI.cpp:1182
SPI_ErrorCode
SPI_ErrorCode
Enumerations of SPI Hardware error codes.
Definition: HardwareSPI.h:134
HardwareSPI_O::write32
bool write32(uint32_t data, bool lastByte=false) override
Sends data using SPI periphery.
HardwareSPI::ReceiveDoneCallback
void(* ReceiveDoneCallback)()
Definition: HardwareSPI.h:1036
HardwareSPI::getError
SPI_ErrorCode getError(void)
Gets error, that happens during begin, end or transaction.
Definition: HardwareSPI.h:861
HardwareSPI_O::receiveBytes
bool receiveBytes(uint8_t *data, uint32_t size, bool lastByte=false) override
Receives data from SPI periphery in blocking mode.
HardwareSPI_O::write
bool write(uint16_t data, bool lastByte=false) override
Sends data using SPI periphery.
HardwareSPI::handleReceiveDoneCallback
static void handleReceiveDoneCallback(SPI_TypeDef *instance)
Handles ReceiveDone callback function.
Definition: HardwareSPI.cpp:1172
HardwareSPI::isSending
bool isSending()
Checks if data are sending or transferring right now using DMA or IT and if periphery is busy.
Definition: HardwareSPI.h:271
HardwareSPI::flush
bool flush()
Waits until DMA or IT (nonblocking transaction methods) are timed out and then aborts them.
Definition: HardwareSPI.cpp:1136
SPI_MODE1
const uint8_t SPI_MODE1
CPOL: 0 CPHA: 1.
Definition: HardwareSPI.h:87
SPISettings
Class, that holds SPI settings.
Definition: HardwareSPI.h:181
HardwareSPI::handleReceiveHalfCallback
static void handleReceiveHalfCallback(SPI_TypeDef *instance)
Handles ReceiveHalf callback function.
Definition: HardwareSPI.cpp:1202
HardwareSPI::endTransaction
virtual SPI_Status endTransaction(void)
This method don't have to be called at the end of the transaction when using HardwareSPI class,...
Definition: HardwareSPI.cpp:366
HardwareSPI::oldSettings
SPISettings oldSettings
Old SPI setting - to speed up begin transaction.
Definition: HardwareSPI.h:1032
HardwareSPI::transfer32
virtual uint32_t transfer32(uint32_t data, bool lastByte=false)
SPI transfer is based on a simultaneous send and receive data.
Definition: HardwareSPI.cpp:797
HardwareSPI::setTimeout
void setTimeout(uint32_t Timeout)
Sets timeout in milliseconds.
Definition: HardwareSPI.cpp:747
HardwareSPI::enableCRC
bool enableCRC(bool enable)
Enables CRC.
Definition: HardwareSPI.cpp:655
SPI_Status
SPI_Status
Enumerations of SPI status codes.
Definition: HardwareSPI.h:110
SPISettings::SPISettings
SPISettings(uint32_t clock, uint8_t bitOrder, uint8_t dataMode)
Definition: HardwareSPI.h:184
SPISettings::_dataMode
uint8_t _dataMode
Definition: HardwareSPI.h:187
SPI_ERROR_MODF
@ SPI_ERROR_MODF
MODF (mode fault) error.
Definition: HardwareSPI.h:138
HardwareSPI::receive16
virtual uint16_t receive16(bool lastByte=false)
Receives data from SPI periphery.
Definition: HardwareSPI.cpp:924
HardwareSPI::transferBytes
virtual bool transferBytes(const uint8_t *out, uint8_t *in, uint32_t size, bool lastByte=false)
Transfers data using SPI periphery in blocking mode, it is sending and receiving data simultaneously.
Definition: HardwareSPI.cpp:971
HardwareSPI::write
virtual bool write(uint16_t data, bool lastByte=false)
Sends data using SPI periphery.
Definition: HardwareSPI.cpp:849
HardwareSPI::flushRX
void flushRX()
Clears RX FIFO buffer.
Definition: HardwareSPI.cpp:1128
HardwareSPI::receiveBytes
virtual bool receiveBytes(uint8_t *data, uint32_t size, bool lastByte=false)
Receives data from SPI periphery in blocking mode.
Definition: HardwareSPI.cpp:1075
HardwareSPI::hasError
bool hasError(void)
Checks if instance has error.
Definition: HardwareSPI.h:851
HardwareSPI_O::endTransaction
SPI_Status endTransaction() override
Disables SPI periphery and checks or sends CRC if enabled.
HardwareSPI_O::write16
bool write16(uint16_t data, bool lastByte=false) override
Sends data using SPI periphery.
HardwareSPI::isRxEnabled
bool isRxEnabled()
Checks, if SPI periphery can receive data.
Definition: HardwareSPI.cpp:443
HardwareSPI::setFrequency
bool setFrequency(uint32_t freq)
Calculates SPI clock divider from frequency and sets it.
Definition: HardwareSPI.cpp:479
HardwareSPI::ErrorCallback
void(* ErrorCallback)(SPI_ErrorCode)
Definition: HardwareSPI.h:1040
SPISettings::_clock
uint32_t _clock
Definition: HardwareSPI.h:185
HardwareSPI::isTImodeEnabled
bool isTImodeEnabled()
Gets if TI mode is enabled.
Definition: HardwareSPI.cpp:646
HardwareSPI::setMode
bool setMode(uint32_t mode)
Sets Master or Slave mode.
Definition: HardwareSPI.cpp:297
HardwareSPI::setWriteHalfCallback
void setWriteHalfCallback(void(*WriteHalfCallback_)())
Sets callback function, that will be called when half of data using writeBytesNonBlocking() method we...
Definition: HardwareSPI.h:913
HardwareSPI_O::receive
uint16_t receive(bool lastByte=false) override
Receives data from SPI periphery.
HardwareSPI_O::writeBytes
bool writeBytes(const uint8_t *data, uint32_t size, bool lastByte=false) override
Sends data using SPI periphery in blocking mode.
HardwareSPI_O::receive32
uint32_t receive32(bool lastByte=false) override
Receives data from SPI periphery.
HardwareSPI::isCRCenabled
bool isCRCenabled()
Gets if CRC is enabled.
Definition: HardwareSPI.cpp:671
HardwareSPI::isTxEnabled
bool isTxEnabled()
Checks, if SPI periphery can transmit data.
Definition: HardwareSPI.cpp:448
HardwareSPI::WriteDoneCallback
void(* WriteDoneCallback)()
Definition: HardwareSPI.h:1034
HardwareSPI::writeBytes
virtual bool writeBytes(const uint8_t *data, uint32_t size, bool lastByte=false)
Sends data using SPI periphery in blocking mode.
Definition: HardwareSPI.cpp:1023
HardwareSPI::setHwCS
bool setHwCS(bool HardwareCS, bool OutputCS=true)
Sets if Chip Select pin is handled by hardware or by software (calling digitalWrite()).
Definition: HardwareSPI.cpp:327
HardwareSPI::getSPIInstances
static HardwareSPI ** getSPIInstances()
Gets array of all created SPI instances (just from this class, not SPI structure).
SPI_TIMEOUT
@ SPI_TIMEOUT
SPI timeout was reached.
Definition: HardwareSPI.h:118
SPI_ERR
@ SPI_ERR
Error, that happened during ending of transaction.
Definition: HardwareSPI.h:114
HardwareSPI::handleErrorCallback
static void handleErrorCallback(SPI_TypeDef *instance)
Handles Error callback function.
Definition: HardwareSPI.cpp:1212
SPI_ERROR_NONE
@ SPI_ERROR_NONE
No error.
Definition: HardwareSPI.h:136
HardwareSPI::writeBytesNonBlocking
virtual bool writeBytesNonBlocking(const uint8_t *data, uint32_t size, bool lastByte=false)
Sends data using SPI periphery using DMA or IT (interrupt) mode.
Definition: HardwareSPI.cpp:1039
SPI_OK
@ SPI_OK
Transaction was without known error.
Definition: HardwareSPI.h:112
HardwareSPI::isFullDuplex
bool isFullDuplex()
Check, if full duplex mode is enabled for this periphery.
Definition: HardwareSPI.cpp:438
HardwareSPI::HardwareSPI
HardwareSPI(SPI_HandleTypeDef &hspi)
Constructor.
Definition: HardwareSPI.cpp:21
SPI_ERROR_DMA
@ SPI_ERROR_DMA
DMA transfer error.
Definition: HardwareSPI.h:148
HardwareSPI::clearFREFlag
void clearFREFlag()
Clears FRE flag from interrupt register.
Definition: HardwareSPI.h:1071
HardwareSPI::instances
static HardwareSPI * instances[]
Array of all created SPI instances (just from this class, not SPI structure).
Definition: HardwareSPI.h:1091
HardwareSPI::getMode
uint32_t getMode()
Gets, if periphery mode is Master or Slave.
Definition: HardwareSPI.cpp:309
HardwareSPI::removeThisFromInstArr
void removeThisFromInstArr()
Removes this instance from instances array.
Definition: HardwareSPI.cpp:1306
HardwareSPI_O::transfer32
uint32_t transfer32(uint32_t data, bool lastByte=false) override
SPI transfer is based on a simultaneous send and receive data.
SPI_CRC_DATAWIDTH
@ SPI_CRC_DATAWIDTH
CRC size will be automatically aligned to data width, but data width have to be set to 8 or 16.
Definition: HardwareSPI.h:165
HardwareSPI::enableTImode
bool enableTImode(bool enable)
Enables or disabled TI mode.
Definition: HardwareSPI.cpp:624
HardwareSPI::isDMAconnectedToTx
bool isDMAconnectedToTx(void)
Checks if DMA channel is connected to SPI Tx and can be used for data writing/transferring.
Definition: HardwareSPI.cpp:289
HardwareSPI::isHwOutputCS
bool isHwOutputCS()
Gets, if Chip Select handled by hardware is set to output mode.
Definition: HardwareSPI.cpp:343
HardwareSPI::isReceiving
bool isReceiving()
Checks if data are receiving or transferring right now using DMA or IT and if periphery is busy.
Definition: HardwareSPI.h:279
HardwareSPI::availableSPIsCount
static uint8_t availableSPIsCount
Available SPI instances count.
Definition: HardwareSPI.h:1096
HardwareSPI::end
bool end()
Deinitialization and disabling SPI periphery, it can be used for "sleep mode".
Definition: HardwareSPI.cpp:52
HardwareSPI::getCRClength
SPI_CRCLength getCRClength()
Gets CRC length.
Definition: HardwareSPI.cpp:714
HardwareSPI::isTransacting
bool isTransacting()
Checks if data are sending, receiving, transferring right now using DMA or IT and if periphery is bus...
Definition: HardwareSPI.h:295
HardwareSPI::getDataMode
uint8_t getDataMode()
Gets, what data mode is set.
Definition: HardwareSPI.cpp:399
HardwareSPI::isTransfering
bool isTransfering()
Checks if data are transferring right now using DMA or IT and if periphery is busy.
Definition: HardwareSPI.h:287
HardwareSPI
This class is for handling SPI periphery.
Definition: HardwareSPI.h:220
HardwareSPI::transfer16
virtual uint16_t transfer16(uint16_t data, bool lastByte=false)
SPI transfer is based on a simultaneous send and receive data.
Definition: HardwareSPI.cpp:776
HardwareSPI::disconnectDMAfromTx
bool disconnectDMAfromTx()
Disconnects DMA channel from SPI Tx.
Definition: HardwareSPI.cpp:267
HardwareSPI::setDataBits
bool setDataBits(uint16_t bits)
Sets SPI data width in bits.
Definition: HardwareSPI.cpp:550
SPI_BUSY_ERR
@ SPI_BUSY_ERR
SPI periphery is busy.
Definition: HardwareSPI.h:116
HardwareSPI_O::receive16
uint16_t receive16(bool lastByte=false) override
Receives data from SPI periphery.
SPI_MODE2
const uint8_t SPI_MODE2
CPOL: 1 CPHA: 0.
Definition: HardwareSPI.h:88
HardwareSPI_O::transferBytes
bool transferBytes(const uint8_t *out, uint8_t *in, uint32_t size, bool lastByte=false) override
Transfers data using SPI periphery in blocking mode, it is sending and receiving data simultaneously.
SPI_CRC_ERR
@ SPI_CRC_ERR
SPI CRC calculation error (see enableCRC())
Definition: HardwareSPI.h:124
HardwareSPI::getAvailableSPIsCount
static uint8_t getAvailableSPIsCount()
Gets all available SPIs instances count.
SPISettings::_bitOrder
uint8_t _bitOrder
Definition: HardwareSPI.h:186
HardwareSPI::setTransferDoneCallback
void setTransferDoneCallback(void(*TransferDoneCallback_)())
Sets callback function, that will be called when all data using transferBytesNonBlocking() method wer...
Definition: HardwareSPI.h:901
HardwareSPI::setErrorCallback
void setErrorCallback(void(*ErrorCallback_)(SPI_ErrorCode))
Sets callback function, that will be called when an error has occurred.
Definition: HardwareSPI.h:931
SPI_CRCLength
SPI_CRCLength
Enumerations of SPI CRC lengths.
Definition: HardwareSPI.h:160
HardwareSPI::isDMAconnectedToRx
bool isDMAconnectedToRx(void)
Checks if DMA channel is connected to SPI Rx and can be used for data receiving/transferring.
Definition: HardwareSPI.cpp:280
HardwareSPI::connectDMAtoTx
bool connectDMAtoTx(DMA_HandleTypeDef &DMA_handle)
Use this method to connect DMA channel to SPI Tx programmatically.
Definition: HardwareSPI.cpp:163
SPI_ERROR_FLAG
@ SPI_ERROR_FLAG
Error on RXNE/TXE/BSY/FTLVL/FRLVL Flag.
Definition: HardwareSPI.h:150
HardwareSPI::clearCRCErrorFlag
void clearCRCErrorFlag()
Clears CRC error flag from interrupt register.
Definition: HardwareSPI.h:1050
HardwareSPI::transactionError
SPI_Status transactionError
Last transaction status.
Definition: HardwareSPI.h:1045
HardwareSPI::setBitOrder
bool setBitOrder(uint8_t bitOrder)
Sets bit order to LSB or MSB.
Definition: HardwareSPI.cpp:415
HardwareSPI::setCRCPolynomial
bool setCRCPolynomial(uint32_t polynomial)
Sets CRC polynomial.
Definition: HardwareSPI.cpp:723
HardwareSPI::instanceExists
bool instanceExists(void)
Checks if SPI instance exists.
Definition: HardwareSPI.h:303
HardwareSPI::setReceiveHalfCallback
void setReceiveHalfCallback(void(*ReceiveHalfCallback_)())
Sets callback function, that will be called when half of data using receiveBytesNonBlocking() method ...
Definition: HardwareSPI.h:925
HardwareSPI::addThisToInstArr
void addThisToInstArr()
Writes new class instance to array of all timer instances.
Definition: HardwareSPI.cpp:1300
HardwareCRC.h
This file contains class, that provides hardware CRC calculation.
HardwareSPI::lastTransactionStatus
virtual SPI_Status lastTransactionStatus()
Checks last transaction status.
Definition: HardwareSPI.h:878
HardwareSPI::receive
virtual uint16_t receive(bool lastByte=false)
Receives data from SPI periphery.
Definition: HardwareSPI.cpp:908
SPISettings::SPISettings
SPISettings()
Definition: HardwareSPI.h:183
HardwareSPI::setDataMode
bool setDataMode(uint8_t dataMode)
Sets data mode.
Definition: HardwareSPI.cpp:372
HardwareSPI::write32
virtual bool write32(uint32_t data, bool lastByte=false)
Sends data using SPI periphery.
Definition: HardwareSPI.cpp:884
HardwareSPI::clearMODFlag
void clearMODFlag()
Clears MOD flag from interrupt register.
Definition: HardwareSPI.h:1064
HardwareSPI::TransferDoneCallback
void(* TransferDoneCallback)()
Definition: HardwareSPI.h:1035
SPI_CRC_2BYTES
@ SPI_CRC_2BYTES
CRC will be 16 bits wide.
Definition: HardwareSPI.h:169
SPI_CRC_1BYTE
@ SPI_CRC_1BYTE
CRC will be 8 bits wide.
Definition: HardwareSPI.h:167
MSBFIRST
#define MSBFIRST
Most Significant Bit First.
Definition: wirish.h:1012
HardwareSPI::_hspi
SPI_HandleTypeDef * _hspi
Pointer to SPI handle structure.
Definition: HardwareSPI.h:1017
HardwareSPI::getDataBits
uint16_t getDataBits()
Gets set data width in bits.
Definition: HardwareSPI.cpp:613
HardwareSPI::connectDMAtoRx
bool connectDMAtoRx(DMA_HandleTypeDef &DMA_handle)
Use this method to connect DMA channel to SPI Rx programmatically.
Definition: HardwareSPI.cpp:75
HardwareSPI::ReceiveHalfCallback
void(* ReceiveHalfCallback)()
Definition: HardwareSPI.h:1039
SPI_ERROR_OVR
@ SPI_ERROR_OVR
OVR (overrun) error.
Definition: HardwareSPI.h:142
HardwareSPI::setCRClength
bool setCRClength(SPI_CRCLength length)
Sets CRC length.
Definition: HardwareSPI.cpp:676
HardwareSPI::handleTransferHalfCallback
static void handleTransferHalfCallback(SPI_TypeDef *instance)
Handles TransferHalf callback function.
Definition: HardwareSPI.cpp:1192
HardwareSPI::disconnectDMAfromRx
bool disconnectDMAfromRx()
Disconnects DMA channel from SPI Rx.
Definition: HardwareSPI.cpp:252
HardwareSPI::setWriteDoneCallback
void setWriteDoneCallback(void(*WriteDoneCallback_)())
Sets callback function, that will be called when all data using writeBytesNonBlocking() method were s...
Definition: HardwareSPI.h:895
HardwareSPI::clearError
void clearError(uint32_t clearMask=0xFFFFFFFFUL)
Gets error, that happens during begin, end or transaction.
Definition: HardwareSPI.h:870
HardwareSPI::getClockDivider
uint32_t getClockDivider()
Gets clock divider.
Definition: HardwareSPI.cpp:545
SPI_ERROR_ABORT
@ SPI_ERROR_ABORT
Error during SPI Abort procedure.
Definition: HardwareSPI.h:152
HardwareSPI::TransferHalfCallback
void(* TransferHalfCallback)()
Definition: HardwareSPI.h:1038
HardwareSPI::clearOVRErrorFlag
void clearOVRErrorFlag()
Clears OVR error flag from interrupt register.
Definition: HardwareSPI.h:1057
HardwareSPI_O::HardwareSPI_O
HardwareSPI_O(SPI_HandleTypeDef &hspi)
Constructor.
Definition: HardwareSPI.h:1138
HardwareSPI::setTransferHalfCallback
void setTransferHalfCallback(void(*TransferHalfCallback_)())
Sets callback function, that will be called when half of data using transferBytesNonBlocking() method...
Definition: HardwareSPI.h:919
HardwareSPI::_startMillis
uint32_t _startMillis
Start time of transferring/receiving/sending data non-blocking.
Definition: HardwareSPI.h:1022
HardwareSPI::getBitOrder
uint8_t getBitOrder()
Gets, if bit order is set to LSB or MSB.
Definition: HardwareSPI.cpp:430
HardwareSPI::~HardwareSPI
~HardwareSPI()
Destructor.
Definition: HardwareSPI.cpp:25
HardwareSPI_O::beginTransaction
SPI_Status beginTransaction(SPISettings settings) override
Enables SPI periphery and sets some settings.
HardwareSPI::transferBytesNonBlocking
virtual bool transferBytesNonBlocking(const uint8_t *out, uint8_t *in, uint32_t size, bool lastByte=false)
Transfers data using SPI periphery using DMA or IT (interrupt) mode, it is sending and receiving data...
Definition: HardwareSPI.cpp:987
SPI_MODE3
const uint8_t SPI_MODE3
CPOL: 1 CPHA: 1.
Definition: HardwareSPI.h:89
HardwareSPI_O::transfer16
uint16_t transfer16(uint16_t data, bool lastByte=false) override
SPI transfer is based on a simultaneous send and receive data.
HardwareSPI::getTimeout
uint32_t getTimeout()
Gets timeout in milliseconds.
Definition: HardwareSPI.cpp:751
SPI_GEN_ERR
@ SPI_GEN_ERR
SPI generic error.
Definition: HardwareSPI.h:120
HardwareSPI_O::transfer
uint16_t transfer(uint16_t data, bool lastByte=false) override
SPI transfer is based on a simultaneous send and receive data.
SPI_ERR_LOCKED
@ SPI_ERR_LOCKED
SPI periphery is locked already.
Definition: HardwareSPI.h:122
SPI_ERROR_CRC
@ SPI_ERROR_CRC
CRC error.
Definition: HardwareSPI.h:140