Initial commit
This commit is contained in:
113
Core/Src/AMS_CAN.c
Normal file
113
Core/Src/AMS_CAN.c
Normal file
@ -0,0 +1,113 @@
|
||||
/*
|
||||
* AMS_CAN.c
|
||||
*
|
||||
* Created on: Mar 19, 2022
|
||||
* Author: jasper
|
||||
*/
|
||||
|
||||
#include "AMS_CAN.h"
|
||||
|
||||
#include "BQ_Abstraction_Layer.h"
|
||||
#include "TMP144.h"
|
||||
|
||||
static CAN_HandleTypeDef* handle_ams;
|
||||
static CAN_HandleTypeDef* handle_car;
|
||||
|
||||
void ams_can_init(CAN_HandleTypeDef* ams_handle, CAN_HandleTypeDef* car_handle) {
|
||||
handle_ams = ams_handle;
|
||||
handle_car = car_handle;
|
||||
|
||||
// Configure filters
|
||||
CAN_FilterTypeDef filter_car;
|
||||
filter_car.FilterBank = 14;
|
||||
filter_car.FilterMode = CAN_FILTERMODE_IDMASK;
|
||||
filter_car.FilterScale = CAN_FILTERSCALE_32BIT;
|
||||
filter_car.FilterIdHigh = CAN_ID_AMS_SLAVE_HEARTBEAT_BASE >> 16;
|
||||
filter_car.FilterIdLow = CAN_ID_AMS_SLAVE_HEARTBEAT_BASE & 0xFFFF;
|
||||
filter_car.FilterMaskIdHigh = 0xFFFF;
|
||||
filter_car.FilterMaskIdLow = 0xFF00;
|
||||
filter_car.FilterFIFOAssignment = CAN_RX_FIFO0;
|
||||
filter_car.FilterActivation = ENABLE;
|
||||
filter_car.SlaveStartFilterBank = 14;
|
||||
if (HAL_CAN_ConfigFilter(handle_car, &filter_car) != HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
// Start peripheral
|
||||
if (HAL_CAN_Start(handle_ams) != HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
if (HAL_CAN_Start(handle_car) != HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
// Activate RX notifications
|
||||
if (HAL_CAN_ActivateNotification(handle_ams, CAN_IT_RX_FIFO0_MSG_PENDING) != HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
if (HAL_CAN_ActivateNotification(handle_car, CAN_IT_RX_FIFO0_MSG_PENDING | CAN_IT_ERROR | CAN_IT_LAST_ERROR_CODE) != HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
}
|
||||
|
||||
static int cb_triggered = 0;
|
||||
|
||||
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *handle) {
|
||||
static CAN_RxHeaderTypeDef header;
|
||||
static uint8_t data[8];
|
||||
cb_triggered = 1;
|
||||
|
||||
if (HAL_CAN_GetRxMessage(handle, CAN_RX_FIFO0, &header, data) != HAL_OK) {
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
if (handle == handle_ams) {
|
||||
ams_can_handle_ams_msg(&header, data);
|
||||
} else if (handle == handle_car) {
|
||||
ams_can_handle_car_msg(&header, data);
|
||||
} else {
|
||||
Error_Handler();
|
||||
}
|
||||
}
|
||||
|
||||
void ams_can_handle_ams_msg(CAN_RxHeaderTypeDef* header, uint8_t* data) {
|
||||
|
||||
}
|
||||
|
||||
void ams_can_handle_car_msg(CAN_RxHeaderTypeDef* header, uint8_t* data) {
|
||||
|
||||
}
|
||||
|
||||
void ams_can_send_heartbeat() {
|
||||
static CAN_TxHeaderTypeDef header;
|
||||
static uint8_t data[8];
|
||||
static uint8_t SLAVE_ID = 0;
|
||||
|
||||
header.IDE = CAN_ID_STD;
|
||||
header.DLC = 8;
|
||||
header.RTR = CAN_RTR_DATA;
|
||||
header.TransmitGlobalTime = DISABLE;
|
||||
|
||||
for (int i = 0; i < N_CELLS / 2; i++) {
|
||||
header.StdId = CAN_ID_AMS_SLAVE_HEARTBEAT_BASE | (SLAVE_ID) << 4 | i;
|
||||
uint16_t v1 = cell_voltages[i * 2];
|
||||
uint16_t v2 = cell_voltages[i * 2 + 1];
|
||||
data[0] = v1 >> 8;
|
||||
data[1] = v1 & 0xFF;
|
||||
data[2] = v2 >> 8;
|
||||
data[3] = v2 & 0xFF;
|
||||
uint16_t t1 = temperatures[i * 2];
|
||||
uint16_t t2 = temperatures[i * 2 + 1];
|
||||
data[4] = t1 >> 8;
|
||||
data[5] = t1 & 0xFF;
|
||||
data[6] = t2 >> 8;
|
||||
data[7] = t2 & 0xFF;
|
||||
uint32_t mailbox;
|
||||
HAL_StatusTypeDef status;
|
||||
if ((status = HAL_CAN_AddTxMessage(handle_ams, &header, data, &mailbox)) != HAL_OK) {
|
||||
Error_Handler();
|
||||
} else {
|
||||
HAL_Delay(100);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user