UdonLibrary 1.0.0
機械システム研究部 C++ ライブラリ
読み取り中…
検索中…
一致する文字列を見つけられません
CanBusSpiPico.hpp
[詳解]
1//
2// CAN通信 Raspberry Pi Pico用バスクラス (SPI経由)
3//
4// Copyright (c) 2022-2024 udonrobo
5//
6
7#pragma once
8
9#include <SPI.h>
10
11#include "ICanBus.hpp"
12#include "CanUtility.hpp"
13
15#include <Udon/Thirdparty/pico_mcp2515/mcp2515.h>
17#include <deque>
18
19namespace Udon
20{
23 : public ICanBus
24 {
25 public:
27 struct Config
28 {
29 spi_inst_t* channel = spi_default; // SPI チャンネル (spi0, spi1)
30 uint8_t cs = PICO_DEFAULT_SPI_CSN_PIN; // チップセレクトピン
31 uint8_t mosi = PICO_DEFAULT_SPI_TX_PIN; // MOSIピン (TX)
32 uint8_t miso = PICO_DEFAULT_SPI_RX_PIN; // MISOピン (RX)
33 uint8_t sck = PICO_DEFAULT_SPI_SCK_PIN; // クロックピン
34 uint8_t interrupt = 20; // 受信割り込みピン
35
36 uint32_t spiClock = 1'000'000; // SPIクロック周波数 [Hz]
37
38 uint32_t transmitInterval = 5; // 送信間隔 [ms]
39 uint32_t transmitTimeout = 100; // 送信タイムアウト時間 [ms]
40 uint32_t receiveTimeout = 100; // 受信タイムアウト時間 [ms]
41 CAN_SPEED canBaudrate = CAN_1000KBPS; // CAN通信速度
42 CAN_CLOCK mcpClock = MCP_16MHZ; // トランシーバー動作クロック周波数 [Hz]
43 };
44
47 CanBusSpi(const Config& config);
48
52 void begin();
53
56 void update();
57
59 void end();
60
62 explicit operator bool() const;
63
65 void show() const;
66
71 CanTxNode* createTx(uint32_t id, size_t length) override;
72
77 CanRxNode* createRx(uint32_t id, size_t length) override;
78
79
80 private:
81 Config config;
82
83 MCP2515 bus;
84
85 constexpr static uint32_t SingleFrameSize = 8;
86
87 std::deque<CanTxNode> txNodes;
88 std::deque<CanRxNode> rxNodes;
89
91
92 uint32_t transmitMs = 0;
93 uint32_t receiveMs = 0;
94
95 void onReceive();
96
97 void onTransmit();
98
100 bool txTimeout() const;
101
103 bool rxTimeout() const;
104 };
105} // namespace Udon
106
107#include "Impl/CanBusSpiPico.hpp"
Raspberry Pi Pico用バスクラス
Definition CanBusSpiPico.hpp:24
CanTxNode * createTx(uint32_t id, size_t length) override
バスに送信ノードを追加
Definition CanBusSpiPico.hpp:184
void begin()
通信開始
Definition CanBusSpiPico.hpp:23
void show() const
バスの状態を表示する
Definition CanBusSpiPico.hpp:132
void update()
バス更新
Definition CanBusSpiPico.hpp:121
CanBusSpi(const Config &config)
コンストラクタ
Definition CanBusSpiPico.hpp:13
CanRxNode * createRx(uint32_t id, size_t length) override
バスに受信ノードを参加させる
Definition CanBusSpiPico.hpp:200
void end()
通信終了
Definition CanBusSpiPico.hpp:93
CANバス管理クラス インターフェース
Definition ICanBus.hpp:49
疑似可変長配列コンテナ
Definition StaticVector.hpp:22
Definition Bit.hpp:12
設定
Definition CanBusSpiPico.hpp:28
uint32_t spiClock
Definition CanBusSpiPico.hpp:36
uint32_t transmitInterval
Definition CanBusSpiPico.hpp:38
uint8_t miso
Definition CanBusSpiPico.hpp:32
CAN_SPEED canBaudrate
Definition CanBusSpiPico.hpp:41
uint8_t sck
Definition CanBusSpiPico.hpp:33
uint32_t receiveTimeout
Definition CanBusSpiPico.hpp:40
CAN_CLOCK mcpClock
Definition CanBusSpiPico.hpp:42
spi_inst_t * channel
Definition CanBusSpiPico.hpp:29
uint8_t mosi
Definition CanBusSpiPico.hpp:31
uint8_t cs
Definition CanBusSpiPico.hpp:30
uint32_t transmitTimeout
Definition CanBusSpiPico.hpp:39
uint8_t interrupt
Definition CanBusSpiPico.hpp:34
CAN受信ノード
Definition ICanBus.hpp:28
CAN送信ノード
Definition ICanBus.hpp:17