111 lines
3.7 KiB
C
111 lines
3.7 KiB
C
/*
|
|
* CAN_Communication.c
|
|
*
|
|
* Created on: 24. April, 2024
|
|
* Author: nived
|
|
*/
|
|
#include "CAN_Communication.h"
|
|
#include "Channel_Control.h"
|
|
#include "Current_Monitoring.h"
|
|
|
|
rx_status_frame rxstate = {};
|
|
volatile uint8_t canmsg_received = 0;
|
|
extern PortExtenderGPIO EN_Ports;
|
|
extern CurrentMeasurements current_measurements_adc_val;
|
|
|
|
void can_init(CAN_HandleTypeDef* hcan) {
|
|
ftcan_init(hcan);
|
|
ftcan_add_filter(0x00, 0x00); // No Filter
|
|
}
|
|
|
|
void can_sendloop() {
|
|
static uint8_t additionaltxcouter = 0;
|
|
|
|
uint8_t status_data[7];
|
|
status_data[0] = EN_Ports.porta.porta;
|
|
status_data[1] = EN_Ports.portb.portb;
|
|
status_data[2] = rxstate.tsacfans;
|
|
status_data[3] = rxstate.radiatorfans;
|
|
status_data[4] = rxstate.pwmaggregat;
|
|
status_data[5] = rxstate.pwmpumps;
|
|
status_data[6] = 0xFF ^ rxstate.checksum;
|
|
ftcan_transmit(TX_STATUS_MSG_ID, status_data, 7);
|
|
|
|
uint8_t data[8];
|
|
return;
|
|
if (additionaltxcouter < 4) {
|
|
switch (additionaltxcouter) {
|
|
case 0:
|
|
|
|
data[0] = current_measurements_adc_val.always_on >> 8;
|
|
data[1] = current_measurements_adc_val.always_on & 0xFF;
|
|
data[2] = current_measurements_adc_val.misc >> 8;
|
|
data[3] = current_measurements_adc_val.misc & 0xFF;
|
|
data[4] = current_measurements_adc_val.inverter >> 8;
|
|
data[5] = current_measurements_adc_val.inverter & 0xFF;
|
|
data[6] = current_measurements_adc_val.shutdown_circuit >> 8;
|
|
data[7] = current_measurements_adc_val.shutdown_circuit & 0xFF;
|
|
ftcan_transmit(CUR_CHANNELS_1_ID, data, 8);
|
|
|
|
break;
|
|
case 1:
|
|
|
|
data[0] = current_measurements_adc_val.fans >> 8;
|
|
data[1] = current_measurements_adc_val.fans & 0xFF;
|
|
data[2] = current_measurements_adc_val.pumps >> 8;
|
|
data[3] = current_measurements_adc_val.pumps & 0xFF;
|
|
data[4] = current_measurements_adc_val.aggregat >> 8;
|
|
data[5] = current_measurements_adc_val.aggregat & 0xFF;
|
|
data[6] = current_measurements_adc_val.steering >> 8;
|
|
data[7] = current_measurements_adc_val.steering & 0xFF;
|
|
ftcan_transmit(CUR_CHANNELS_2_ID, data, 8);
|
|
|
|
break;
|
|
case 2:
|
|
|
|
data[0] = current_measurements_adc_val.ebsvalve_1 >> 8;
|
|
data[1] = current_measurements_adc_val.ebsvalve_1 & 0xFF;
|
|
data[2] = current_measurements_adc_val.ebsvalve_2 >> 8;
|
|
data[3] = current_measurements_adc_val.ebsvalve_2 & 0xFF;
|
|
data[4] = current_measurements_adc_val.modevalve_1 >> 8;
|
|
data[5] = current_measurements_adc_val.modevalve_1 & 0xFF;
|
|
data[6] = current_measurements_adc_val.modevalve_2 >> 8;
|
|
data[7] = current_measurements_adc_val.modevalve_2 & 0xFF;
|
|
ftcan_transmit(CUR_CHANNELS_3_ID, data, 8);
|
|
|
|
break;
|
|
case 3:
|
|
|
|
data[0] = current_measurements_adc_val.sensorbox >> 8;
|
|
data[1] = current_measurements_adc_val.sensorbox & 0xFF;
|
|
data[2] = current_measurements_adc_val.servicebrake >> 8;
|
|
data[3] = current_measurements_adc_val.servicebrake & 0xFF;
|
|
data[4] = current_measurements_adc_val.servos >> 8;
|
|
data[5] = current_measurements_adc_val.servos & 0xFF;
|
|
data[6] = current_measurements_adc_val.shutdown_circuit >> 8;
|
|
data[7] = current_measurements_adc_val.shutdown_circuit & 0xFF;
|
|
ftcan_transmit(CUR_CHANNELS_4_ID, data, 8);
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
additionaltxcouter++;
|
|
} else {
|
|
additionaltxcouter = 0;
|
|
}
|
|
}
|
|
|
|
void ftcan_msg_received_cb(uint16_t id, size_t datalen, const uint8_t* data) {
|
|
canmsg_received = 1;
|
|
if ((id == RX_STATUS_MSG_ID) && (datalen == 7)) {
|
|
rxstate.iostatus.porta.porta = data[0];
|
|
rxstate.iostatus.portb.portb = data[1];
|
|
rxstate.radiatorfans = data[2];
|
|
rxstate.tsacfans = data[3];
|
|
rxstate.pwmaggregat = data[4];
|
|
rxstate.pwmpumps = data[5];
|
|
rxstate.checksum = data[6];
|
|
}
|
|
}
|