17
17
#include < modm/processing/protothread.hpp>
18
18
#include < modm/driver/can/mcp2515.hpp>
19
19
20
- #define SENDER 1
21
-
22
20
// Set the log level
23
21
#undef MODM_LOG_LEVEL
24
22
#define MODM_LOG_LEVEL modm::log::DEBUG
@@ -36,27 +34,28 @@ using SpiMaster = SpiMaster1;
36
34
37
35
// Default filters to receive any extended CAN frame
38
36
FLASH_STORAGE (uint8_t canFilter[]) = {
39
- MCP2515_FILTER_EXTENDED (0 ), // Filter 0
40
- MCP2515_FILTER_EXTENDED (0 ), // Filter 1
37
+ MCP2515_FILTER_EXTENDED (0 ), // Filter 0
38
+ MCP2515_FILTER_EXTENDED (0 ), // Filter 1
41
39
42
- MCP2515_FILTER_EXTENDED (0 ), // Filter 2
43
- MCP2515_FILTER_EXTENDED (0 ), // Filter 3
44
- MCP2515_FILTER_EXTENDED (0 ), // Filter 4
45
- MCP2515_FILTER_EXTENDED (0 ), // Filter 5
40
+ MCP2515_FILTER (0 ), // Filter 2
41
+ MCP2515_FILTER (0 ), // Filter 3
42
+ MCP2515_FILTER (0 ), // Filter 4
43
+ MCP2515_FILTER (0 ), // Filter 5
46
44
47
- MCP2515_FILTER_EXTENDED (0 ), // Mask 0
48
- MCP2515_FILTER_EXTENDED (0 ), // Mask 1
45
+ MCP2515_MASK_EXTENDED (0 ), // Mask 0
46
+ MCP2515_MASK (0 ), // Mask 1
49
47
};
50
48
51
49
modm::Mcp2515<SpiMaster, Cs, Int> mcp2515;
52
50
53
- class MyTask : modm::pt::Protothread
51
+ class CanThread : modm::pt::Protothread
54
52
{
55
53
public:
56
- MyTask () :
57
- message_{0x1337 },
58
- i_{0 },
59
- j_{0 }
54
+ CanThread () :
55
+ message_{},
56
+ wait_{1s},
57
+ i{0 },
58
+ j{0 }
60
59
{}
61
60
62
61
bool
@@ -65,75 +64,77 @@ class MyTask : modm::pt::Protothread
65
64
PT_BEGIN ();
66
65
67
66
MODM_LOG_INFO << " Initializing mcp2515 ..." << modm::endl;
68
- // Configure MCP2515 and set the filters
69
- initialized_ = mcp2515.initialize <8_MHz, 500_kbps>();
70
- MODM_LOG_INFO << " Success: " << initialized_ << modm::endl;
67
+ // Configure MCP2515
68
+ while (!mcp2515.initialize <8_MHz, 500_kbps>()){
69
+ PT_WAIT_UNTIL (wait_.isExpired ());
70
+ wait_.restart ();
71
+ }
72
+ // / Set filters of MCP2515
73
+ MODM_LOG_INFO << " Setting filters of mcp2515 ..." << modm::endl;
71
74
mcp2515.setFilter (modm::accessor::asFlash (canFilter));
72
75
MODM_LOG_INFO << " Running ... " << modm::endl;
73
- #if SENDER == 0
74
- while (initialized_)
76
+ while (true )
75
77
{
76
78
// receive messages
77
79
if (mcp2515.isMessageAvailable ())
78
80
{
79
81
MODM_LOG_INFO << " Message Available ... " << modm::endl;
80
82
mcp2515.getMessage (message_);
81
- for (i_ = 0 ; i_ < message_.length ; ++i_){
82
- MODM_LOG_INFO << modm::hex<< " 0x" << message_.data [i_];
83
+ MODM_LOG_INFO << " Received message: " << modm::hex << message_.identifier << modm::endl;
84
+ for (i = 0 ; i < message_.length ; ++i){
85
+ MODM_LOG_INFO << modm::hex<< " 0x" << message_.data [i];
83
86
}
84
87
MODM_LOG_INFO << modm::endl;
85
- MODM_LOG_INFO << " Received message [" << j_ << " ]: " << modm::hex << message_.identifier << modm::endl;
86
- j_+=1 ;
87
88
MODM_LOG_INFO << modm::endl;
88
89
}
89
- PT_CALL (mcp2515.update ());
90
- }
91
- #else
92
- while (initialized_)
93
- {
94
- wait_.restart (1000ms);
95
- PT_WAIT_UNTIL (wait_.isExpired ());
96
- message_.length = 2 ;
97
- message_.data [0 ] = i_++;
98
- message_.data [1 ] = i_++;
99
- MODM_LOG_INFO << " Sending Message ... " << modm::endl;
100
- for (j_ = 0 ; j_ < message_.length ; ++j_){
101
- MODM_LOG_INFO << modm::hex<< " 0x" << message_.data [j_];
90
+
91
+ if (wait_.isExpired ())
92
+ {
93
+ wait_.restart (1000ms);
94
+ message_.identifier = 0xAA ;
95
+ message_.length = 2 ;
96
+ message_.data [0 ] = 13 ;
97
+ message_.data [1 ] = 37 ;
98
+ MODM_LOG_INFO << " Sending Message ... " << modm::endl;
99
+ for (j = 0 ; j < message_.length ; ++j){
100
+ MODM_LOG_INFO << modm::hex<< " 0x" << message_.data [j];
101
+ }
102
+ MODM_LOG_INFO << modm::endl;
103
+ MODM_LOG_INFO << " Success: " << mcp2515.sendMessage (message_) << modm::endl;
102
104
}
103
- MODM_LOG_INFO << modm::endl;
104
- mcp2515. sendMessage (message_);
105
+
106
+ // / process internal mcp2515 queues
105
107
PT_CALL (mcp2515.update ());
108
+ PT_YIELD ();
106
109
}
107
- #endif
108
110
109
111
PT_END ();
110
112
}
111
113
112
114
private:
113
115
modm::can::Message message_;
114
- bool initialized_;
115
116
modm::ShortTimeout wait_;
116
- uint8_t i_, j_ ;
117
+ uint8_t i, j ;
117
118
};
118
119
119
- MyTask task ;
120
+ CanThread canThread ;
120
121
121
122
int
122
123
main ()
123
124
{
124
125
Board::initialize ();
125
126
126
- MODM_LOG_INFO << " Hello " << modm::endl;
127
+ MODM_LOG_INFO << " Mcp2515 Example " << modm::endl;
127
128
// Initialize SPI interface and the other pins
128
129
// needed by the MCP2515
129
130
SpiMaster::connect<Miso::Miso, Mosi::Mosi, Sck::Sck>();
130
131
// / we initialize a higher baud rate then n the avr example, dunnow hats the mcp2515 is capable
131
132
// / of
132
- SpiMaster::initialize<Board::SystemClock, 20_MHz >();
133
+ SpiMaster::initialize<Board::SystemClock, 10_MHz >();
133
134
Cs::setOutput ();
134
135
Int::setInput (Gpio::InputType::PullUp);
135
136
136
137
while (true ) {
137
- task .run ();
138
+ canThread .run ();
138
139
}
139
140
}
0 commit comments