tutrcos
読み取り中…
検索中…
一致する文字列を見つけられません
spi.hpp
[詳解]
1#pragma once
2
3#include "main.h"
4
5#include <cstddef>
6#include <cstdint>
7#include <mutex>
8
9#include "tutrcos/core.hpp"
10#include "tutrcos/utility.hpp"
11
12namespace tutrcos {
13namespace peripheral {
14
15class SPI {
16public:
17 SPI(SPI_HandleTypeDef *hspi) : hspi_{hspi} {}
18
19 ~SPI() { TUTRCOS_VERIFY(HAL_SPI_Abort(hspi_) == HAL_OK); }
20
21 bool transmit(const uint8_t *data, size_t size, uint32_t timeout) {
22 std::lock_guard lock{mtx_};
23 if (HAL_SPI_Transmit_IT(hspi_, data, size) != HAL_OK) {
24 return false;
25 }
26 uint32_t start = core::Kernel::get_ticks();
27 while (hspi_->State != HAL_SPI_STATE_READY) {
28 uint32_t elapsed = core::Kernel::get_ticks() - start;
29 if (elapsed >= timeout) {
30 return false;
31 }
33 }
34 return true;
35 }
36
37 bool receive(uint8_t *data, size_t size, uint32_t timeout) {
38 std::lock_guard lock{mtx_};
39 if (HAL_SPI_Receive_IT(hspi_, data, size) != HAL_OK) {
40 return false;
41 }
42 uint32_t start = core::Kernel::get_ticks();
43 while (hspi_->State != HAL_SPI_STATE_READY) {
44 uint32_t elapsed = core::Kernel::get_ticks() - start;
45 if (elapsed >= timeout) {
46 return false;
47 }
49 }
50 return true;
51 }
52
53 bool transmit_receive(const uint8_t *tx_data, uint8_t *rx_data, size_t size,
54 uint32_t timeout) {
55 std::lock_guard lock{mtx_};
56 if (HAL_SPI_TransmitReceive_IT(hspi_, tx_data, rx_data, size) != HAL_OK) {
57 return false;
58 }
59 uint32_t start = core::Kernel::get_ticks();
60 while (hspi_->State != HAL_SPI_STATE_READY) {
61 uint32_t elapsed = core::Kernel::get_ticks() - start;
62 if (elapsed >= timeout) {
63 return false;
64 }
66 }
67 return true;
68 }
69
70 SPI_HandleTypeDef *get_hal_handle() { return hspi_; }
71
72private:
73 SPI_HandleTypeDef *hspi_;
74 core::Mutex mtx_;
75};
76
77} // namespace peripheral
78} // namespace tutrcos
static uint32_t get_ticks()
Definition kernel.hpp:14
Definition mutex.hpp:12
static void delay(uint32_t ticks)
Definition thread.hpp:32
Definition spi.hpp:15
bool receive(uint8_t *data, size_t size, uint32_t timeout)
Definition spi.hpp:37
~SPI()
Definition spi.hpp:19
bool transmit_receive(const uint8_t *tx_data, uint8_t *rx_data, size_t size, uint32_t timeout)
Definition spi.hpp:53
SPI(SPI_HandleTypeDef *hspi)
Definition spi.hpp:17
bool transmit(const uint8_t *data, size_t size, uint32_t timeout)
Definition spi.hpp:21
SPI_HandleTypeDef * get_hal_handle()
Definition spi.hpp:70
Definition kernel.hpp:7
#define TUTRCOS_VERIFY(expr)
Definition utility.hpp:16