From c4f33ec9a937d48551a7c29b39009ddc99564e31 Mon Sep 17 00:00:00 2001 From: Oskar Date: Sun, 30 Mar 2025 10:47:13 +0200 Subject: [PATCH] Add CAN send logic and DIO mapping --- Software/Core/Inc/adc.h | 2 +- Software/Core/Inc/gpio.h | 14 +++++ Software/Core/Inc/mappings_o.h | 5 +- Software/Core/Src/main.c | 96 +++++++++++++++++++++++++++++++--- 4 files changed, 106 insertions(+), 11 deletions(-) diff --git a/Software/Core/Inc/adc.h b/Software/Core/Inc/adc.h index 9ca60dc..3bfbcbd 100644 --- a/Software/Core/Inc/adc.h +++ b/Software/Core/Inc/adc.h @@ -35,7 +35,7 @@ extern "C" { extern ADC_HandleTypeDef hadc1; /* USER CODE BEGIN Private defines */ - +#define NUM_ADC_PINS 16 /* USER CODE END Private defines */ void MX_ADC1_Init(void); diff --git a/Software/Core/Inc/gpio.h b/Software/Core/Inc/gpio.h index 8ba7de1..e706c76 100644 --- a/Software/Core/Inc/gpio.h +++ b/Software/Core/Inc/gpio.h @@ -34,6 +34,20 @@ extern "C" { /* USER CODE BEGIN Private defines */ +#define NUM_DIO_PINS 6 + +static struct { + GPIO_TypeDef* port; + uint16_t pin; +} DIO_PIN_MAP[NUM_DIO_PINS] = { +/* 0 */ { .port = D1_IC_GPIO_Port, .pin = D1_IC_Pin}, +/* 1 */ { .port = D2_GPIO_Port, .pin = D2_Pin}, +/* 2 */ { .port = D3_GPIO_Port, .pin = D3_Pin}, +/* 3 */ { .port = D4_IC_GPIO_Port, .pin = D4_IC_Pin}, +/* 4 */ { .port = D5_GPIO_Port, .pin = D5_Pin}, +/* 5 */ { .port = D6_GPIO_Port, .pin = D6_Pin}, +}; + /* USER CODE END Private defines */ void MX_GPIO_Init(void); diff --git a/Software/Core/Inc/mappings_o.h b/Software/Core/Inc/mappings_o.h index 4cca9db..d8aacdb 100644 --- a/Software/Core/Inc/mappings_o.h +++ b/Software/Core/Inc/mappings_o.h @@ -72,11 +72,12 @@ typedef struct { can_signal_t signals[9]; } can_pkt_t; +#define NUM_TX_PKT 4 #define ADQ (1<<12) #ifdef SN_FRONT -static can_pkt_t CAN_SIGNAL_MAP[4] { +static can_pkt_t CAN_SIGNAL_MAP[NUM_TX_PKT] = { { .can_id = 0x0D1, .dlc = 3, .num_signals = 7, .period = 100, .signals = { { .type = DIN, .channel = R5, .start = 0, .length = 1, .factor = 1., .name = "LS L" }, @@ -117,7 +118,7 @@ static can_pkt_t CAN_SIGNAL_MAP[4] { #ifdef SN_REAR -static can_pkt_t CAN_SIGNAL_MAP[4] { +static can_pkt_t CAN_SIGNAL_MAP[NUM_TX_PKT] = { { .can_id = 0x0D2, .dlc = 7, .num_signals = 9, .period = 100, .signals = { { .type = DIN, .channel = L9, .start = 0, .length = 1, .factor = 1., .name = "ExtTSOn" }, diff --git a/Software/Core/Src/main.c b/Software/Core/Src/main.c index 124cd13..72ce814 100644 --- a/Software/Core/Src/main.c +++ b/Software/Core/Src/main.c @@ -27,7 +27,7 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ - +#include "mappings_o.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -49,7 +49,8 @@ /* USER CODE BEGIN PV */ /* Declare buffer in D1 domain SRAM */ -static uint16_t adc_values[16]; +static uint16_t adc_values[NUM_ADC_PINS]; +static uint8_t dio_values[NUM_DIO_PINS]; /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ @@ -112,27 +113,106 @@ int main(void) Error_Handler(); } - if (HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_values, 16) != HAL_OK) + if (HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_values, NUM_ADC_PINS) != HAL_OK) { Error_Handler(); } HAL_TIM_Base_Start(&htim6); + // CAN TX PREP + + FDCAN_TxHeaderTypeDef txHeader; + + // Prep the tx frame + txHeader.ErrorStateIndicator = FDCAN_ESI_PASSIVE; + txHeader.BitRateSwitch = FDCAN_BRS_OFF; + txHeader.FDFormat = FDCAN_CLASSIC_CAN; + txHeader.TxEventFifoControl = FDCAN_NO_TX_EVENTS; + txHeader.IdType = FDCAN_STANDARD_ID; + txHeader.Identifier = 0x0; + txHeader.TxFrameType = FDCAN_DATA_FRAME; + txHeader.DataLength = 8; + + if (HAL_FDCAN_ActivateNotification(&hfdcan1, FDCAN_IT_RX_FIFO0_NEW_MESSAGE, 0) != HAL_OK) { + Error_Handler(); + + if (HAL_FDCAN_ConfigGlobalFilter(&hfdcan1, FDCAN_REJECT, FDCAN_REJECT, + FDCAN_REJECT_REMOTE, FDCAN_REJECT_REMOTE) != HAL_OK) + Error_Handler(); + + // TODO: Add Filters and Rx Handler + + if (HAL_FDCAN_Start(&hfdcan1) != HAL_OK) + Error_Handler(); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ - while (1) + for (unsigned int mscounter = 0; 1; mscounter++) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ - HAL_GPIO_WritePin(STATUS_G_GPIO_Port, STATUS_G_Pin, GPIO_PIN_SET); - HAL_Delay(500); - HAL_GPIO_WritePin(STATUS_G_GPIO_Port, STATUS_G_Pin, GPIO_PIN_RESET); - HAL_Delay(500); + for (int di; di < NUM_DIO_PINS; di++) { + dio_values[di] = HAL_GPIO_ReadPin( + DIO_PIN_MAP[di].port, + DIO_PIN_MAP[di].pin + ); + } + + for (int pi; pi < NUM_TX_PKT; pi++) { + + can_pkt_t* pktinfo = &(CAN_SIGNAL_MAP[pi]); + + if (mscounter % pktinfo->period == 0) { + + txHeader.Identifier = pktinfo->can_id; + txHeader.DataLength = pktinfo->dlc; + uint64_t txData = 0; + + for (int si; si < pktinfo->num_signals; si++) { + + can_signal_t* signal = &(pktinfo->signals[si]); + uint16_t value = 0; + switch (signal->type) { + case DIN: + value = dio_values[signal->channel]; + break; + + case AIN: + value = signal->factor * adc_values[signal->channel]; + break; + + case FIN: + /* NYI */ + break; + + default: + break; + } + + uint16_t mask = 0xFFFF >> (16 - signal->length); + txData |= ((uint64_t) (value & mask)) << (signal->start); + + } + + if (HAL_FDCAN_AddMessageToTxFifoQ(&hfdcan1, &txHeader, (uint8_t*) txData) != HAL_OK) + Error_Handler(); + + } + + if (mscounter >= 500) { + mscounter = 0; + HAL_GPIO_TogglePin(STATUS_G_GPIO_Port, STATUS_G_Pin); + } + + } + + // TODO: Move all this into a 1kHz timer callback! + HAL_Delay(1); + } /* USER CODE END 3 */ }