-
Notifications
You must be signed in to change notification settings - Fork 132
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[stm32] Add FDCAN support for H7 series
- Loading branch information
Showing
14 changed files
with
447 additions
and
61 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
/* | ||
* Copyright (c) 2020, Raphael Lehmann | ||
* | ||
* This file is part of the modm project. | ||
* | ||
* This Source Code Form is subject to the terms of the Mozilla Public | ||
* License, v. 2.0. If a copy of the MPL was not distributed with this | ||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||
*/ | ||
|
||
#include <modm/board.hpp> | ||
#include <modm/debug/logger.hpp> | ||
#include <modm/board.hpp> | ||
|
||
using namespace modm::literals; | ||
|
||
// Set the log level | ||
#undef MODM_LOG_LEVEL | ||
#define MODM_LOG_LEVEL modm::log::INFO | ||
|
||
int | ||
main() | ||
{ | ||
Board::initialize(); | ||
|
||
MODM_LOG_INFO << "CAN Test Program" << modm::endl; | ||
|
||
MODM_LOG_INFO << "Initializing Fdcan1..." << modm::endl; | ||
// Initialize Fdcan1 | ||
Fdcan1::connect<GpioA11::Rx, GpioA12::Tx>(Gpio::InputType::PullUp); | ||
Fdcan1::initialize<Board::SystemClock, 125_kbps, 1_pct, 500_kbps>(9); | ||
|
||
MODM_LOG_INFO << "Setting up Filter for Fdcan1..." << modm::endl; | ||
// Receive every extended id message | ||
Fdcan1::setExtendedFilter(0, Fdcan1::FilterConfig::Fifo0, | ||
modm::can::ExtendedIdentifier(0), | ||
modm::can::ExtendedMask(0)); | ||
|
||
MODM_LOG_INFO << "Initializing Fdcan2..." << modm::endl; | ||
// Initialize Fdcan2 | ||
Fdcan2::connect<GpioB5::Rx, GpioB6::Tx>(Gpio::InputType::PullUp); | ||
Fdcan2::initialize<Board::SystemClock, 125_kbps, 1_pct, 500_kbps>(12); | ||
|
||
MODM_LOG_INFO << "Setting up Filter for Fdcan2..." << modm::endl; | ||
// Receive every message | ||
Fdcan2::setExtendedFilter(0, Fdcan2::FilterConfig::Fifo0, | ||
modm::can::ExtendedIdentifier(0), | ||
modm::can::ExtendedMask(0)); | ||
|
||
// Send a message | ||
MODM_LOG_INFO << "Sending message on Fdcan1..." << modm::endl; | ||
modm::can::Message msg1(1, 1); | ||
msg1.setExtended(true); | ||
msg1.data[0] = 0x11; | ||
Fdcan1::sendMessage(msg1); | ||
|
||
// Send a message | ||
MODM_LOG_INFO << "Sending message on Fdcan2..." << modm::endl; | ||
msg1.data[0] = 0x22; | ||
Fdcan2::sendMessage(msg1); | ||
|
||
|
||
while (true) | ||
{ | ||
if (Fdcan1::isMessageAvailable()) | ||
{ | ||
MODM_LOG_INFO << "Fdcan1: Message is available..." << modm::endl; | ||
modm::can::Message message; | ||
Fdcan1::getMessage(message); | ||
MODM_LOG_INFO << message << modm::endl; | ||
} | ||
if (Fdcan2::isMessageAvailable()) | ||
{ | ||
MODM_LOG_INFO << "Fdcan2: Message is available..." << modm::endl; | ||
modm::can::Message message; | ||
Fdcan2::getMessage(message); | ||
MODM_LOG_INFO << message << modm::endl; | ||
} | ||
} | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
<library> | ||
<extends>modm:nucleo-h723zg</extends> | ||
<options> | ||
<option name="modm:build:build.path">../../../build/nucleo_h723zg/can</option> | ||
</options> | ||
<modules> | ||
<module>modm:debug</module> | ||
<module>modm:platform:can:1</module> | ||
<module>modm:platform:can:2</module> | ||
<module>modm:platform:can:3</module> | ||
<module>modm:build:scons</module> | ||
</modules> | ||
</library> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -23,6 +23,7 @@ | |
|
||
#include "can_bit_timings.hpp" | ||
#include "message_ram.hpp" | ||
#include "can_message_ram_config.hpp" | ||
|
||
namespace modm::platform | ||
{ | ||
|
@@ -33,18 +34,43 @@ namespace modm::platform | |
* a shared Message RAM memory and a configuration block. | ||
* The modules (FDCAN) are compliant with ISO 11898-1: 2015 (CAN protocol | ||
* specification version 2.0 part A, B) and CAN FD protocol specification version 1.0. | ||
* A 0.8 Kbyte Message RAM per FDCAN instance implements filters, receive FIFOs, | ||
* transmit event FIFOs and transmit FIFOs. | ||
* A Message RAM implements filters, receive FIFOs, transmit event FIFOs and | ||
* transmit FIFOs. The RAM is 0.8 Kbyte per FDCAN instance, except for the H7 | ||
* series, which has 10 Kbytes of total message RAM arbitrarily split between | ||
* FDCAN instances. | ||
* | ||
* This driver supports SW-managed/in-memory FIFOs which augment the hardware TX | ||
* and RX FIFOs. Note that the HW TX queue is set to "queue mode" (not "FIFO mode"). | ||
* This means CAN messages are popped from the in-memory FIFO in order of addition | ||
* but arbitrated according to ID priority within the HW queue. | ||
* | ||
* ## Filter | ||
%% if target["family"] == "h7" | ||
* Up to 28 filters can be defined for 11-bit IDs, up to 8 filters for 29-bit IDs. | ||
%% else | ||
* Up to 128 filters can be defined for 11-bit IDs, up to 64 filters for 29-bit IDs. | ||
* Space for these filters must be allocated in the message RAM via the parameters | ||
* described below. | ||
%% endif | ||
* The filter banks are not shared between the CAN instances. | ||
* | ||
* ## Configuration | ||
* You can set the buffer size using the `tx_buffer` and `rx_buffer` parameters. | ||
* You can set the in-memory (SW-managed) buffer size using the `tx_buffer` and | ||
* `rx_buffer` parameters. If set to 0, filling a HW FIFO will immediately drop | ||
* frames. | ||
* | ||
%% if target["family"] == "h7" | ||
* You can configure the message RAM space allocation as follows: | ||
* - `message_ram.standard_filter_count`: Maximum number of standard (11-bit ID) acceptance filters | ||
* - `message_ram.extended_filter_count`: Maximum number of extended (29-bit ID) acceptance filters | ||
* - `message_ram.rx_fifo_0_elements` and `message_ram.rx_fifo_1_elements`: | ||
* Number of received frames which can be queued by hardware in each RX FIFO | ||
* - `message_ram.tx_fifo_elements`: Number of frames pending transmit which can be queued in hardware | ||
* | ||
%% endif | ||
* @author Raphael Lehmann <[email protected]> | ||
* @author Christopher Durand <[email protected]> | ||
* @author Kaelin Laundry <[email protected]> | ||
* @ingroup modm_platform_can_{{ id }} | ||
*/ | ||
class Fdcan{{ id }} : public ::modm::Can | ||
|
@@ -74,7 +100,7 @@ public: | |
using ErrorCallback = void (*)(); | ||
|
||
private: | ||
using MessageRam = fdcan::MessageRam<{{ id - 1 }}>; | ||
using MessageRam = fdcan::MessageRam<{{ id - 1 }}, fdcan::Fdcan{{id}}MessageRamConfig, fdcan::Fdcan{{id}}MessageRamBaseWords>; | ||
|
||
static inline volatile ErrorCallback errorCallback_ = nullptr; | ||
|
||
|
46 changes: 46 additions & 0 deletions
46
src/modm/platform/can/stm32-fdcan/can_message_ram_config.hpp.in
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
/* | ||
* Copyright (c) 2024, Kaelin Laundry | ||
* | ||
* This file is part of the modm project. | ||
* | ||
* This Source Code Form is subject to the terms of the Mozilla Public | ||
* License, v. 2.0. If a copy of the MPL was not distributed with this | ||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||
*/ | ||
// ---------------------------------------------------------------------------- | ||
|
||
|
||
#ifndef MODM_STM32_FDCAN_MESSAGE_RAM_CONFIG_HPP | ||
#define MODM_STM32_FDCAN_MESSAGE_RAM_CONFIG_HPP | ||
|
||
namespace modm::platform::fdcan | ||
{ | ||
%% for instance in instances | ||
static constexpr MessageRamConfig Fdcan{{instance}}MessageRamConfig | ||
{ | ||
// TODO: support configuring message size on H7 (for better space utilization) | ||
.txBufferDataBytesMax = DataFieldSize::Bytes64, | ||
.rxBufferDataBytesMax = DataFieldSize::Bytes64, | ||
.rxFifo0DataBytesMax = DataFieldSize::Bytes64, | ||
.rxFifo1DataBytesMax = DataFieldSize::Bytes64, | ||
|
||
.standardFilterCount = {{message_ram_options["fdcan"+(instance|string)+".message_ram.standard_filter_count"]}}, | ||
.extendedFilterCount = {{message_ram_options["fdcan"+(instance|string)+".message_ram.extended_filter_count"]}}, | ||
.rxFifo0Elements = {{message_ram_options["fdcan"+(instance|string)+".message_ram.rx_fifo_0_elements"]}}, | ||
.rxFifo1Elements = {{message_ram_options["fdcan"+(instance|string)+".message_ram.rx_fifo_1_elements"]}}, | ||
.txEventFifoElements = 3, // Currently unused but must be allocated for non-H7 series fixed layout | ||
.txFifoElements = {{message_ram_options["fdcan"+(instance|string)+".message_ram.tx_fifo_elements"]}}, | ||
}; | ||
%% endfor | ||
|
||
|
||
%% for instance in instances | ||
%% if loop.first | ||
static constexpr uint32_t Fdcan{{instance}}MessageRamBaseWords = 0; | ||
%% else | ||
static constexpr uint32_t Fdcan{{instance}}MessageRamBaseWords = Fdcan{{instance-1}}MessageRamBaseWords + Fdcan{{instance-1}}MessageRamConfig.totalSectionWords(); | ||
%% endif | ||
%% endfor | ||
} // modm::platform::fdcan | ||
|
||
#endif // MODM_STM32_FDCAN_MESSAGE_RAM_CONFIG_HPP |
Oops, something went wrong.