-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathxl2515_driver.h
More file actions
335 lines (292 loc) · 13.7 KB
/
Copy pathxl2515_driver.h
File metadata and controls
335 lines (292 loc) · 13.7 KB
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
// xl2515_driver.h
// XL2515 CAN Controller Driver for RP2350
#ifndef XL2515_DRIVER_H
#define XL2515_DRIVER_H
#include <stdint.h>
#include <stdbool.h>
#include "hardware/spi.h"
#include "hardware/gpio.h"
#include "pico/time.h"
// ============================================================================
// フレームタイプの定義
// ============================================================================
typedef enum {
FRAME_TYPE_DATA = 0, // 通常のデータフレーム
FRAME_TYPE_REMOTE = 1, // リモートリクエストフレーム
FRAME_TYPE_ERROR = 2 // エラーフレーム
} frame_type_t;
// ============================================================================
// SavvyCAN互換のCANフレーム構造体
// ============================================================================
typedef struct {
// 必須フィールド
uint32_t id; // CAN ID (11 or 29-bit)
uint8_t data[8]; // ペイロード(最大8バイト)
uint8_t len; // データ長(0-8)
uint8_t bus; // バス番号
// フラグ
bool is_extended; // true = 29-bit, false = 11-bit
bool isReceived; // true = 受信, false = 送信
// タイムスタンプ(マイクロ秒単位)
uint64_t timestamp;
// フレーム制御
frame_type_t frame_type;
// オプション(分析・デバッグ用)
uint64_t timedelta; // 前フレームからの差分
uint32_t frameCount; // 出現カウント
} can_frame_t;
// ============================================================================
// 初期化マクロ
// ============================================================================
// 送信フレームの初期化
#define CAN_FRAME_INIT_TX(frame, can_id, is_ext, data_len) \
do { \
(frame).id = (can_id); \
(frame).len = (data_len); \
(frame).bus = 0; \
(frame).is_extended = (is_ext); \
(frame).isReceived = false; \
(frame).frame_type = FRAME_TYPE_DATA; \
(frame).timestamp = time_us_64(); \
(frame).timedelta = 0; \
(frame).frameCount = 1; \
} while(0)
// 受信フレームの初期化
#define CAN_FRAME_INIT_RX(frame) \
do { \
(frame).id = 0; \
(frame).len = 0; \
(frame).bus = 0; \
(frame).is_extended = false; \
(frame).isReceived = true; \
(frame).frame_type = FRAME_TYPE_DATA; \
(frame).timestamp = time_us_64(); \
(frame).timedelta = 0; \
(frame).frameCount = 1; \
} while(0)
// ============================================================================
// CANバッファサイズ
// ============================================================================
#define CAN_BUFFER_SIZE 128 // CAN フレームバッファサイズ(高速CAN対応)
// ============================================================================
// ハードウェアピン定義(Waveshare RP2350-CAN公式配線)
// ============================================================================
#define XL2515_SPI_PORT spi1 // SPI ポート
#define XL2515_MISO_PIN 12 // GPIO 12
#define XL2515_MOSI_PIN 11 // GPIO 11
#define XL2515_SCK_PIN 10 // GPIO 10
#define XL2515_CS_PIN 9 // GPIO 9
#define XL2515_INT_PIN 8 // GPIO 8 (割り込みピン)
#define XL2515_SPI_FREQ 10000000 // SPI Frequency 10 MHz
// ============================================================================
// XL2515 レジスタアドレス(Waveshare公式デモと完全一致)
// ============================================================================
// 制御レジスタ
#define XL2515_REG_CANCTRL 0x0F // CANコントロール/オペレーションモード
#define XL2515_REG_CANSTAT 0x0E // CANステータス
#define XL2515_REG_CANINTE 0x2B // 割り込み有効化
#define XL2515_REG_CANINTF 0x2C // 割り込みフラグ
#define XL2515_REG_CNF1 0x2A // ビットレート設定1
#define XL2515_REG_CNF2 0x29 // ビットレート設定2
#define XL2515_REG_CNF3 0x28 // ビットレート設定3
#define XL2515_REG_EFLG 0x2D // エラーフラグ
// 受信フィルタ(Filter 0-5)
#define XL2515_REG_RXF0SIDH 0x00 // RXF0 標準ID High
#define XL2515_REG_RXF0SIDL 0x01 // RXF0 標準ID Low
#define XL2515_REG_RXF0EID8 0x02 // RXF0 拡張ID 8bit
#define XL2515_REG_RXF0EID0 0x03 // RXF0 拡張ID 0bit
// 受信マスク(Mask 0-1)
#define XL2515_REG_RXM0SIDH 0x20 // RXM0 標準ID High
#define XL2515_REG_RXM0SIDL 0x21 // RXM0 標準ID Low
#define XL2515_REG_RXM0EID8 0x22 // RXM0 拡張ID 8bit
#define XL2515_REG_RXM0EID0 0x23 // RXM0 拡張ID 0bit
#define XL2515_REG_RXM1SIDH 0x24 // RXM1 標準ID High
#define XL2515_REG_RXM1SIDL 0x25 // RXM1 標準ID Low
#define XL2515_REG_RXM1EID8 0x26 // RXM1 拡張ID 8bit
#define XL2515_REG_RXM1EID0 0x27 // RXM1 拡張ID 0bit
// 送信バッファ0
#define XL2515_REG_TXB0CTRL 0x30 // TXB0 コントロール
#define XL2515_REG_TXB0SIDH 0x31 // TXB0 標準ID High
#define XL2515_REG_TXB0SIDL 0x32 // TXB0 標準ID Low
#define XL2515_REG_TXB0EID8 0x33 // TXB0 拡張ID 8bit
#define XL2515_REG_TXB0EID0 0x34 // TXB0 拡張ID 0bit
#define XL2515_REG_TXB0DLC 0x35 // TXB0 データ長
#define XL2515_REG_TXB0DATA 0x36 // TXB0 データ開始 (D0-D7: 0x36-0x3D)
#define XL2515_REG_TXB0D0 0x36 // TXB0 データバイト 0
#define XL2515_REG_TXB0D1 0x37 // TXB0 データバイト 1
#define XL2515_REG_TXB0D2 0x38 // TXB0 データバイト 2
#define XL2515_REG_TXB0D3 0x39 // TXB0 データバイト 3
#define XL2515_REG_TXB0D4 0x3A // TXB0 データバイト 4
#define XL2515_REG_TXB0D5 0x3B // TXB0 データバイト 5
#define XL2515_REG_TXB0D6 0x3C // TXB0 データバイト 6
#define XL2515_REG_TXB0D7 0x3D // TXB0 データバイト 7
// 送信バッファ1
#define XL2515_REG_TXB1CTRL 0x40 // TXB1 コントロール
#define XL2515_REG_TXB1SIDH 0x41 // TXB1 標準ID High
#define XL2515_REG_TXB1DLC 0x45 // TXB1 データ長
#define XL2515_REG_TXB1DATA 0x46 // TXB1 データ開始
// 送信バッファ2
#define XL2515_REG_TXB2CTRL 0x50 // TXB2 コントロール
#define XL2515_REG_TXB2SIDH 0x51 // TXB2 標準ID High
#define XL2515_REG_TXB2DLC 0x55 // TXB2 データ長
#define XL2515_REG_TXB2DATA 0x56 // TXB2 データ開始
// 受信バッファ0
#define XL2515_REG_RXB0CTRL 0x60 // RXB0 コントロール
#define XL2515_REG_RXB0SIDH 0x61 // RXB0 標準ID High
#define XL2515_REG_RXB0SIDL 0x62 // RXB0 標準ID Low
#define XL2515_REG_RXB0EID8 0x63 // RXB0 拡張ID 8bit
#define XL2515_REG_RXB0EID0 0x64 // RXB0 拡張ID 0bit
#define XL2515_REG_RXB0DLC 0x65 // RXB0 データ長
#define XL2515_REG_RXB0DATA 0x66 // RXB0 データ開始 (D0-D7: 0x66-0x6D)
#define XL2515_REG_RXB0D0 0x66 // RXB0 データバイト 0
#define XL2515_REG_RXB0D1 0x67 // RXB0 データバイト 1
#define XL2515_REG_RXB0D2 0x68 // RXB0 データバイト 2
#define XL2515_REG_RXB0D3 0x69 // RXB0 データバイト 3
#define XL2515_REG_RXB0D4 0x6A // RXB0 データバイト 4
#define XL2515_REG_RXB0D5 0x6B // RXB0 データバイト 5
#define XL2515_REG_RXB0D6 0x6C // RXB0 データバイト 6
#define XL2515_REG_RXB0D7 0x6D // RXB0 データバイト 7
// 受信バッファ1
#define XL2515_REG_RXB1CTRL 0x70 // RXB1 コントロール
#define XL2515_REG_RXB1SIDH 0x71 // RXB1 標準ID High
#define XL2515_REG_RXB1DLC 0x75 // RXB1 データ長
#define XL2515_REG_RXB1DATA 0x76 // RXB1 データ開始
// 後方互換性のためのエイリアス
#define XL2515_REG_MODE XL2515_REG_CANCTRL // オペレーションモード
#define XL2515_REG_INTF XL2515_REG_CANINTF // 割り込みフラグ
#define XL2515_REG_TX0ID XL2515_REG_TXB0SIDH // 送信バッファ0 ID
#define XL2515_REG_TX0DLC XL2515_REG_TXB0DLC // 送信バッファ0 DLC
#define XL2515_REG_RX0ID XL2515_REG_RXB0SIDH // 受信バッファ0 ID
#define XL2515_REG_RX0DLC XL2515_REG_RXB0DLC // 受信バッファ0 DLC
// ============================================================================
// XL2515 SPI コマンド
// ============================================================================
#define XL2515_CMD_RESET 0xC0 // リセット
#define XL2515_CMD_READ 0x03 // レジスタ読み込み
#define XL2515_CMD_WRITE 0x02 // レジスタ書き込み
#define XL2515_CMD_BIT_MODIFY 0x05 // ビット修正
#define XL2515_CMD_LOAD_TX 0x40 // 送信バッファロード
#define XL2515_CMD_RTS 0x80 // 送信リクエスト
// ============================================================================
// オペレーションモード
// ============================================================================
typedef enum {
XL2515_OPMODE_CONFIG = 0x80, // 設定モード
XL2515_OPMODE_LISTEN = 0x60, // リッスンモード
XL2515_OPMODE_LOOPBACK = 0x40, // ループバックモード
XL2515_OPMODE_SLEEP = 0x20, // スリープモード
XL2515_OPMODE_NORMAL = 0x00 // 通常モード
} xl2515_opmode_t;
// ============================================================================
// ボーレート設定
// ============================================================================
typedef enum {
XL2515_BAUD_5K = 0, // 5 kbps
XL2515_BAUD_10K = 1, // 10 kbps
XL2515_BAUD_20K = 2, // 20 kbps
XL2515_BAUD_50K = 3, // 50 kbps
XL2515_BAUD_100K = 4, // 100 kbps
XL2515_BAUD_125K = 5, // 125 kbps
XL2515_BAUD_250K = 6, // 250 kbps
XL2515_BAUD_500K = 7, // 500 kbps (デフォルト)
XL2515_BAUD_800K = 8, // 800 kbps
XL2515_BAUD_1000K = 9 // 1000 kbps
} xl2515_baud_t;
// ============================================================================
// 関数プロトタイプ
// ============================================================================
/**
* XL2515ドライバの初期化
* @return true: 成功, false: 失敗
*/
bool xl2515_init(void);
/**
* XL2515をリセット
* @return true: 成功, false: 失敗
*/
bool xl2515_reset(void);
/**
* オペレーションモードを設定
* @param mode: 設定するモード
* @return true: 成功, false: 失敗
*/
bool xl2515_set_mode(xl2515_opmode_t mode);
/**
* CANボーレートを設定
* @param baud: ボーレート設定値
* @return true: 成功, false: 失敗
*/
bool xl2515_set_baud(xl2515_baud_t baud);
/**
* CANフレームを送信
* @param frame: 送信するフレーム
* @return true: 成功, false: 失敗
*/
bool xl2515_send(const can_frame_t *frame);
/**
* CANフレームを受信
* @param frame: 受信したフレームを格納するポインタ
* @return true: フレーム受信, false: 受信なし
*/
bool xl2515_receive(can_frame_t *frame);
/**
* 受信割り込みフラグをクリア
* @return true: 成功, false: 失敗
*/
bool xl2515_clear_rx_flag(void);
/**
* 送信割り込みフラグをクリア
* @return true: 成功, false: 失敗
*/
bool xl2515_clear_tx_flag(void);
// ============================================================================
// 割り込み関連関数
// ============================================================================
/**
* 受信データの有無を割り込みフラグでチェック
* @return true: 受信データあり, false: なし
* @note xl2515_receive()呼び出し前にこの関数でチェック可能
*/
bool xl2515_has_data(void);
/**
* 割り込みフラグをクリア
* @note 受信データ処理後に呼び出す
*/
void xl2515_clear_data_flag(void);
// ============================================================================
// 低レベルSPI関数
// ============================================================================
/**
* XL2515レジスタを読み込む
* @param reg: レジスタアドレス
* @return 読み込んだ値
*/
uint8_t xl2515_read_reg(uint8_t reg);
/**
* XL2515レジスタに書き込む
* @param reg: レジスタアドレス
* @param value: 書き込む値
*/
void xl2515_write_reg(uint8_t reg, uint8_t value);
/**
* XL2515レジスタのビットを修正
* @param reg: レジスタアドレス
* @param mask: マスク
* @param value: 新しい値
*/
void xl2515_modify_bit(uint8_t reg, uint8_t mask, uint8_t value);
/**
* 複数バイトを読み込む
* @param reg: 開始レジスタアドレス
* @param buffer: バッファポインタ
* @param length: バイト数
*/
void xl2515_read_buffer(uint8_t reg, uint8_t *buffer, uint8_t length);
/**
* 複数バイトを書き込む
* @param reg: 開始レジスタアドレス
* @param buffer: バッファポインタ
* @param length: バイト数
*/
void xl2515_write_buffer(uint8_t reg, const uint8_t *buffer, uint8_t length);
#endif // XL2515_DRIVER_H