libxr 1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
stm32_spi.cpp
1#include "stm32_spi.hpp"
2
3#ifdef HAL_SPI_MODULE_ENABLED
4
5using namespace LibXR;
6
7STM32SPI *STM32SPI::map[STM32_SPI_NUMBER] = {nullptr};
8
9stm32_spi_id_t STM32_SPI_GetID(SPI_TypeDef *addr)
10{
11 if (addr == nullptr)
12 { // NOLINT
13 return stm32_spi_id_t::STM32_SPI_ID_ERROR;
14 }
15#ifdef SPI1
16 else if (addr == SPI1)
17 { // NOLINT
18 return stm32_spi_id_t::STM32_SPI1;
19 }
20#endif
21#ifdef SPI2
22 else if (addr == SPI2)
23 { // NOLINT
24 return stm32_spi_id_t::STM32_SPI2;
25 }
26#endif
27#ifdef SPI3
28 else if (addr == SPI3)
29 { // NOLINT
30 return stm32_spi_id_t::STM32_SPI3;
31 }
32#endif
33#ifdef SPI4
34 else if (addr == SPI4)
35 { // NOLINT
36 return stm32_spi_id_t::STM32_SPI4;
37 }
38#endif
39#ifdef SPI5
40 else if (addr == SPI5)
41 { // NOLINT
42 return stm32_spi_id_t::STM32_SPI5;
43 }
44#endif
45#ifdef SPI6
46 else if (addr == SPI6)
47 { // NOLINT
48 return stm32_spi_id_t::STM32_SPI6;
49 }
50#endif
51#ifdef SPI7
52 else if (addr == SPI7)
53 { // NOLINT
54 return stm32_spi_id_t::STM32_SPI7;
55 }
56#endif
57#ifdef SPI8
58 else if (addr == SPI8)
59 { // NOLINT
60 return stm32_spi_id_t::STM32_SPI8;
61 }
62#endif
63 else
64 {
65 return stm32_spi_id_t::STM32_SPI_ID_ERROR;
66 }
67}
68
69extern "C" void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi)
70{
71 STM32SPI *spi = STM32SPI::map[STM32_SPI_GetID(hspi->Instance)];
72
73 if (!spi->mem_read_)
74 {
75 memcpy(spi->read_buff_.addr_, spi->dma_buff_rx_.addr_, spi->read_buff_.size_);
76 }
77 else
78 {
79 uint8_t *rx_dma_buff = reinterpret_cast<uint8_t *>(spi->dma_buff_rx_.addr_);
80 memcpy(spi->read_buff_.addr_, rx_dma_buff + 1, spi->read_buff_.size_);
81 }
82
83 spi->rw_op_.UpdateStatus(true, ErrorCode::OK);
84}
85
86extern "C" void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)
87{
88 STM32SPI *spi = STM32SPI::map[STM32_SPI_GetID(hspi->Instance)];
89 spi->rw_op_.UpdateStatus(false, ErrorCode::FAILED);
90}
91
92#endif
void UpdateStatus(bool in_isr, Args &&...args)
Updates operation status based on type.
Definition libxr_rw.hpp:205
LibXR Color Control Library / LibXR终端颜色控制库
constexpr auto min(T1 a, T2 b) -> typename std::common_type< T1, T2 >::type
计算两个数的最小值