libxr 1.0
Want to be the best embedded framework
Loading...
Searching...
No Matches
stm32_i2c.cpp
1#include "stm32_i2c.hpp"
2
3#ifdef HAL_I2C_MODULE_ENABLED
4
5using namespace LibXR;
6
7STM32I2C *STM32I2C::map[STM32_I2C_NUMBER] = {nullptr};
8
9stm32_i2c_id_t STM32_I2C_GetID(I2C_TypeDef *hi2c)
10{ // NOLINT
11 if (hi2c == nullptr)
12 {
13 return stm32_i2c_id_t::STM32_I2C_ID_ERROR;
14 }
15#ifdef I2C1
16 else if (hi2c == I2C1)
17 { // NOLINT
18 return stm32_i2c_id_t::STM32_I2C1;
19 }
20#endif
21#ifdef I2C2
22 else if (hi2c == I2C2)
23 { // NOLINT
24 return stm32_i2c_id_t::STM32_I2C2;
25 }
26#endif
27#ifdef I2C3
28 else if (hi2c == I2C3)
29 { // NOLINT
30 return stm32_i2c_id_t::STM32_I2C3;
31 }
32#endif
33#ifdef I2C4
34 else if (hi2c == I2C4)
35 { // NOLINT
36 return stm32_i2c_id_t::STM32_I2C4;
37 }
38#endif
39#ifdef I2C5
40 else if (hi2c == I2C5)
41 { // NOLINT
42 return stm32_i2c_id_t::STM32_I2C5;
43 }
44#endif
45#ifdef I2C6
46 else if (hi2c == I2C6)
47 { // NOLINT
48 return stm32_i2c_id_t::STM32_I2C6;
49 }
50#endif
51#ifdef I2C7
52 else if (hi2c == I2C7)
53 { // NOLINT
54 return stm32_i2c_id_t::STM32_I2C7;
55 }
56#endif
57#ifdef I2C8
58 else if (hi2c == I2C8)
59 { // NOLINT
60 return stm32_i2c_id_t::STM32_I2C8;
61 }
62#endif
63 return stm32_i2c_id_t::STM32_I2C_ID_ERROR;
64}
65
66extern "C" void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
67{
68 STM32I2C *i2c = STM32I2C::map[STM32_I2C_GetID(hi2c->Instance)];
69 if (i2c)
70 {
71 memcpy(i2c->read_buff_.addr_, i2c->dma_buff_.addr_, i2c->read_buff_.size_);
72 i2c->read_op_.UpdateStatus(true, ErrorCode::OK);
73 }
74}
75
76extern "C" void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
77{
78 STM32I2C *i2c = STM32I2C::map[STM32_I2C_GetID(hi2c->Instance)];
79 if (i2c)
80 {
81 i2c->write_op_.UpdateStatus(true, ErrorCode::OK);
82 }
83}
84
85extern "C" void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c)
86{
87 STM32I2C *i2c = STM32I2C::map[STM32_I2C_GetID(hi2c->Instance)];
88 if (i2c)
89 {
90 i2c->write_op_.UpdateStatus(true, ErrorCode::OK);
91 }
92}
93
94extern "C" void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c)
95{
96 STM32I2C *i2c = STM32I2C::map[STM32_I2C_GetID(hi2c->Instance)];
97 if (i2c)
98 {
99 memcpy(i2c->read_buff_.addr_, i2c->dma_buff_.addr_, i2c->read_buff_.size_);
100 i2c->read_op_.UpdateStatus(true, ErrorCode::OK);
101 }
102}
103
104extern "C" void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
105{
106 STM32I2C *i2c = STM32I2C::map[STM32_I2C_GetID(hi2c->Instance)];
107
108 if (i2c)
109 {
110 if (i2c->read_)
111 {
112 i2c->read_op_.UpdateStatus(false, ErrorCode::FAILED);
113 }
114 else
115 {
116 i2c->write_op_.UpdateStatus(false, ErrorCode::FAILED);
117 }
118 }
119}
120
121#endif
void UpdateStatus(bool in_isr, Args &&...args)
Updates operation status based on type.
Definition libxr_rw.hpp:207
LibXR Color Control Library / LibXR终端颜色控制库
Definition esp_gpio.hpp:8
constexpr auto min(T1 a, T2 b) -> typename std::common_type< T1, T2 >::type
计算两个数的最小值