Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ports/stm32/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -429,7 +429,7 @@ endif

ifeq ($(MCU_SERIES),$(filter $(MCU_SERIES),f0 f4 f7))
HAL_SRC_C += $(addprefix $(STM32LIB_HAL_BASE)/Src/stm32$(MCU_SERIES)xx_, hal_can.c)
else ifeq ($(MCU_SERIES),$(filter $(MCU_SERIES),g0 g4 h7))
else ifeq ($(MCU_SERIES),$(filter $(MCU_SERIES),g0 g4 h7 n6))
HAL_SRC_C += $(addprefix $(STM32LIB_HAL_BASE)/Src/stm32$(MCU_SERIES)xx_, hal_fdcan.c)
else ifeq ($(MCU_SERIES),$(filter $(MCU_SERIES),l4))
HAL_SRC_C += $(addprefix $(STM32LIB_HAL_BASE)/Src/Legacy/stm32$(MCU_SERIES)xx_, hal_can.c)
Expand Down
9 changes: 9 additions & 0 deletions ports/stm32/boards/OPENMV_N6/mpconfigboard.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,15 @@
#define MICROPY_HW_SPI4_MISO (pyb_pin_SPI4_MISO)
#define MICROPY_HW_SPI4_MOSI (pyb_pin_SPI4_MOSI)

// FDCAN bus
#define MICROPY_HW_CAN1_NAME "FDCAN1"
#define MICROPY_HW_CAN1_TX (pyb_pin_CAN1_TX)
#define MICROPY_HW_CAN1_RX (pyb_pin_CAN1_RX)
// Support is not yet added for FDCAN CAN3 (see fdcan.c for details)
// #define MICROPY_HW_CAN3_NAME "FDCAN3"
// #define MICROPY_HW_CAN3_TX (pyb_pin_CAN3_TX)
// #define MICROPY_HW_CAN3_RX (pyb_pin_CAN3_RX)

// USER is pulled high, and pressing the button makes the input go low.
#define MICROPY_HW_USRSW_PIN (pyb_pin_BUTTON)
#define MICROPY_HW_USRSW_PULL (GPIO_NOPULL)
Expand Down
4 changes: 4 additions & 0 deletions ports/stm32/boards/OPENMV_N6/pins.csv
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ SPI2_CS,PA11
SPI2_SCK,PA12
UART4_RX,PA11
UART4_TX,PA12
CAN1_RX,PA11
CAN1_TX,PA12
P3,PA11
P2,PA12
,PA13
Expand Down Expand Up @@ -92,6 +94,8 @@ SPI4_CS,PE11
SPI4_SCK,PE12
P15,PE11
P16,PE12
CAN3_TX,PE11
CAN3_RX,PE12
I2C4_SCL,PE13
I2C4_SDA,PE14
,PE15
Expand Down
8 changes: 4 additions & 4 deletions ports/stm32/boards/stm32n657_af.csv
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ PortA,PA5 , , , ,
PortA,PA8 , , , , , , , , , , , , , , , , ,ADC12_INP5
PortA,PA9 , , , , , , , , , , , , , , , , ,ADC12_INP10
PortA,PA10, , , , , , , , , , , , , , , , ,ADC12_INP11/ADC12_INN10
PortA,PA11, , , , , ,SPI2_NSS ,CAN1_RXFD , ,UART4_RX , , , , , , , ,ADC12_INP12/ADC12_INN11
PortA,PA12, , , , , ,SPI2_SCK ,CAN1_TXFD , ,UART4_TX , , , , , , , ,ADC12_INP13/ADC12_INN12
PortA,PA11, , , , , ,SPI2_NSS ,CAN1_RX , ,UART4_RX , , , , , , , ,ADC12_INP12/ADC12_INN11
PortA,PA12, , , , , ,SPI2_SCK ,CAN1_TX , ,UART4_TX , , , , , , , ,ADC12_INP13/ADC12_INN12
PortB,PB4 , , , , , , , , , , , ,SDMMC2_D3 , , , , ,
PortB,PB6 , , , , , ,SPI4_MISO , ,TIM15_CH1 , , , , , , , , ,
PortB,PB7 , , , , , ,SPI4_MOSI , ,TIM15_CH2 , , , , , , , , ,
Expand All @@ -36,8 +36,8 @@ PortE,PE5 , , , ,
PortE,PE6 , , , , , , , ,USART1_RX , , , , , , , , ,
PortE,PE7 , , , , , , , , ,UART7_RX , , , , , , , ,
PortE,PE8 , , , , , , , , ,UART7_TX , , , , , , , ,
PortE,PE11, , , , , ,SPI4_NSS ,CAN3_TXFD , , , , , , , , , ,
PortE,PE12, , , , , ,SPI4_SCK ,CAN3_RXFD , , , , , , , , , ,
PortE,PE11, , , , , ,SPI4_NSS ,CAN3_TX , , , , , , , , , ,
PortE,PE12, , , , , ,SPI4_SCK ,CAN3_RX , , , , , , , , , ,
PortE,PE13, , , , ,I2C4_SCL , , , , , , , , , , , ,
PortE,PE14, , , , ,I2C4_SDA , , , , , , , , , , , ,
PortE,PE15, , , , , ,SPI5_SCK , , , , , , , , , , ,
Expand Down
4 changes: 2 additions & 2 deletions ports/stm32/can.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
#if defined(STM32G4)
#define CAN_HW_MAX_STD_FILTER 28
#define CAN_HW_MAX_EXT_FILTER 8
#elif defined(STM32H7)
#elif defined(STM32H7) || defined(STM32N6)
// The RAM filtering section is configured for 64 x 1 word elements for 11-bit standard
// identifiers, and 31 x 2 words elements for 29-bit extended identifiers.
// The total number of words reserved for the filtering per FDCAN instance is 126 words.
Expand Down Expand Up @@ -123,7 +123,7 @@ typedef struct {
unsigned rx_fifo1_pending;
} can_counters_t;

#if defined(STM32H7)
#if defined(STM32H7) || defined(STM32N6)
#define CAN_TX_QUEUE_LEN 16
#else
// FDCAN STM32G4, bxCAN
Expand Down
33 changes: 23 additions & 10 deletions ports/stm32/fdcan.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,17 +53,22 @@
#define FDCAN_IT_RX_FULL_MASK (FDCAN_IT_RX_FIFO0_FULL | FDCAN_IT_RX_FIFO1_FULL)
#define FDCAN_IT_RX_MESSAGE_LOST_MASK (FDCAN_IT_RX_FIFO0_MESSAGE_LOST | FDCAN_IT_RX_FIFO1_MESSAGE_LOST)

#if defined(STM32H7)
// adaptations for H7 to G4 naming convention in HAL
#if defined(STM32H7) || defined(STM32N6)
// adaptations for H7/N6 to G4 naming convention in HAL
#define FDCAN_IT_GROUP_RX_FIFO0 (FDCAN_ILS_RF0NL | FDCAN_ILS_RF0FL | FDCAN_ILS_RF0LL)
#if defined(STM32H7)
#define FDCAN_IT_GROUP_BIT_LINE_ERROR (FDCAN_ILS_EPE | FDCAN_ILS_ELOE)
#define FDCAN_IT_GROUP_PROTOCOL_ERROR (FDCAN_ILS_ARAE | FDCAN_ILS_PEDE | FDCAN_ILS_PEAE | FDCAN_ILS_WDIE | FDCAN_ILS_BOE | FDCAN_ILS_EWE)
#else
#define FDCAN_IT_GROUP_BIT_LINE_ERROR (FDCAN_ILS_EPL | FDCAN_ILS_ELOL)
#define FDCAN_IT_GROUP_PROTOCOL_ERROR (FDCAN_ILS_ARAL | FDCAN_ILS_PEDL | FDCAN_ILS_PEAL | FDCAN_ILS_WDIL | FDCAN_ILS_BOL | FDCAN_ILS_EWL)
#endif
#define FDCAN_IT_GROUP_RX_FIFO1 (FDCAN_ILS_RF1NL | FDCAN_ILS_RF1FL | FDCAN_ILS_RF1LL)

// The dedicated Message RAM should be 2560 words, but the way it's defined in stm32h7xx_hal_fdcan.c
// as (SRAMCAN_BASE + FDCAN_MESSAGE_RAM_SIZE - 0x4U) limits the usable number of words to 2559 words.
#define FDCAN_MESSAGE_RAM_SIZE (2560 - 1)
#endif // STM32H7
#endif // STM32H7 || STM32N6

#if defined(STM32G4)
// These HAL APIs are not implemented for STM32G4, so we implement them here...
Expand Down Expand Up @@ -132,6 +137,11 @@ bool can_init(CAN_HandleTypeDef *can, int can_id, can_tx_mode_t tx_mode, uint32_
init->NominalTimeSeg1 = bs1; // NominalTimeSeg1 = Propagation_segment + Phase_segment_1
init->NominalTimeSeg2 = bs2;

init->DataPrescaler = 1;
init->DataSyncJumpWidth = 1;
init->DataTimeSeg1 = 1;
init->DataTimeSeg2 = 1;

init->AutoRetransmission = ENABLE;
init->TransmitPause = DISABLE;
init->ProtocolException = ENABLE;
Expand All @@ -141,12 +151,8 @@ bool can_init(CAN_HandleTypeDef *can, int can_id, can_tx_mode_t tx_mode, uint32_

#if defined(STM32G4)
init->ClockDivider = FDCAN_CLOCK_DIV1;
init->DataPrescaler = 1;
init->DataSyncJumpWidth = 1;
init->DataTimeSeg1 = 1;
init->DataTimeSeg2 = 1;
init->TxFifoQueueMode = fifo_queue_mode;
#elif defined(STM32H7)
#elif defined(STM32H7) || defined(STM32N6)
// The dedicated FDCAN RAM is 2560 32-bit words and shared between the FDCAN instances.
// To support 2 FDCAN instances simultaneously, the Message RAM is divided in half by
// setting the second FDCAN memory offset to half the RAM size. With this configuration,
Expand Down Expand Up @@ -185,11 +191,12 @@ bool can_init(CAN_HandleTypeDef *can, int can_id, can_tx_mode_t tx_mode, uint32_
// 2 words header + 16 words data field (to support up to 64 bytes of data).
// The total number of words reserved for the Rx FIFOs per FDCAN instance is 864 words.
init->RxBuffersNbr = 0;
init->RxBufferSize = FDCAN_DATA_BYTES_64;
init->RxFifo0ElmtsNbr = 24;
init->RxFifo0ElmtSize = FDCAN_DATA_BYTES_64;
init->RxFifo1ElmtsNbr = 24;
init->RxFifo1ElmtSize = FDCAN_DATA_BYTES_64;
#endif // STM32H7
#endif // STM32H7 || STM32N6

const machine_pin_obj_t *pins[2];

Expand Down Expand Up @@ -316,7 +323,9 @@ void can_clearfilter(FDCAN_HandleTypeDef *can, uint32_t f, bool is_extid) {

uint32_t can_get_source_freq(void) {
// Find CAN kernel clock
#if defined(STM32H7)
#if defined(STM32N6)
return HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_FDCAN);
#elif defined(STM32H7)
switch (__HAL_RCC_GET_FDCAN_SOURCE()) {
case RCC_FDCANCLKSOURCE_HSE:
return HSE_VALUE;
Expand Down Expand Up @@ -362,7 +371,11 @@ static void encode_datalength(CanTxMsgTypeDef *txmsg) {
size_t len_bytes = txmsg->DataLength;
for (mp_uint_t i = 0; i < MP_ARRAY_SIZE(DLCtoBytes); i++) {
if (len_bytes <= DLCtoBytes[i]) {
#if defined(STM32N6)
txmsg->DataLength = i;
#else
txmsg->DataLength = (i << 16);
#endif
return;
}
}
Expand Down
Loading
Loading