-
-
Notifications
You must be signed in to change notification settings - Fork 21
/
i2c_base.hpp
148 lines (131 loc) · 4.59 KB
/
i2c_base.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#pragma once
//=========================================================================//
/*! @file
@brief I2C 制御ベースクラス @n
@author 平松邦仁 ([email protected])
@copyright Copyright (C) 2021, 2022 Kunihito Hiramatsu @n
Released under the MIT license @n
https://github.com/hirakuni45/RX/blob/master/LICENSE
*/
//=========================================================================//
#include <cstdint>
#include <functional>
#include "common/format.hpp"
namespace device {
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief I2C base クラス(iica_io、si2c_io、sci_i2c_io 共通)
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
struct i2c_base {
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief 送信、受信関数型
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
typedef std::function<void(void)> FUNC_TYPE;
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief 速度タイプ型 @n
※簡易 I2C では誤差が大きい。 @n
※設定出来ない速度の場合、初期化で失敗する。
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
enum class SPEED : uint32_t {
_50K = 50'000, ///< 50K b.p.s.
STANDARD = 100'000, ///< 100K b.p.s. (Standard mode)
_100K = 100'000, ///< 100K b.p.s. (Even STANDARD)
_150K = 150'000, ///< 150K b.p.s.
_200K = 200'000, ///< 200K b.p.s.
_250K = 250'000, ///< 250K b.p.s.
_300K = 300'000, ///< 300K b.p.s.
_350K = 350'000, ///< 350K b.p.s.
_400K = 400'000, ///< 400K b.p.s.
FAST = 400'000, ///< 400K b.p.s.
FAST_PLUS = 1'000'000 ///< 1M b.p.s.
};
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief 動作モード型
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
enum class MODE : uint8_t {
MASTER, ///< マスターモード
SLAVE, ///< スレーブモード
};
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief ノイズ・フィルター型
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
enum class NF : uint8_t {
PH1 = 0b000, ///< フェーズ1段
PH2 = 0b001, ///< フェーズ2段
PH3 = 0b010, ///< フェーズ3段
PH4 = 0b011, ///< フェーズ4段
NONE = 0b100, ///< 無し
};
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
/*!
@brief I2C エラー型
*/
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//
#ifdef ERROR // こんな一般的名称を大域変数で定義する大馬鹿避け
#undef ERROR
#endif
enum class ERROR : uint8_t {
NONE, ///< エラー無し
BUFF_SIZE, ///< バッファサイズを超えた転送
START, ///< スタート(初期化)
BUS_OPEN, ///< バス・オープン
ADDRESS, ///< アドレス転送
ACK, ///< ACK エラー
SEND_DATA, ///< 送信データ転送
RECV_DATA, ///< 受信データ転送
END, ///< 終了
STOP, ///< ストップ・コンディション
CLOCK_DIVIDE ///< クロック分周器の制限によるエラー
};
ERROR error_;
i2c_base() noexcept : error_(ERROR::NONE) { }
//-----------------------------------------------------------------//
/*!
@brief I2C のエラー文字列の取得
@return エラー文字列
*/
//-----------------------------------------------------------------//
const char* get_error_str() const noexcept
{
switch(error_) {
case ERROR::START:
return "Start";
case ERROR::BUS_OPEN:
return "BUS Open";
case ERROR::ADDRESS:
return "Address";
case ERROR::ACK:
return "ACK";
case ERROR::SEND_DATA:
return "Send data";
case ERROR::RECV_DATA:
return "Recv data";
case ERROR::END:
return "End";
case ERROR::STOP:
return "Stop";
case ERROR::CLOCK_DIVIDE:
return "Clock divide";
default:
break;
}
return "Other";
}
//-----------------------------------------------------------------//
/*!
@brief 最終エラーの取得
@return エラー・タイプ
*/
//-----------------------------------------------------------------//
auto get_last_error() const noexcept { return error_; }
};
}