Files
CAN-IO/Test2/Core/Src/haltech.c
v0stap bd00d0025d test
2026-04-03 16:34:46 +02:00

225 lines
5.9 KiB
C

/*
* mazda_can.c
*
* Created on: Mar 17, 2022
* Author: v0stap
*/
/*
* app.c
*
* Created on: Jul 25, 2020
* Author: v0stap
*/
//int AVIsendCANAddress = 0x2C0;
//int DPIsendCANAddress1 = 0x2C2;
//int DPIsendCANAddress2 = 0x2C4;
//int DPOrxCANAddress1 = 0x2D0;
//int DPOrxCANAddress2 = 0x2D2;
//int KeepAliveCANAddress = 0x2C6;
#include "main.h"
void Haltech_App_Init(void) {
// configure TIM2 to 1uS / tick timer
// setup CCR interrupt happen after sturtup delay is over
}
void Haltech_App(uint32_t id) {
if (CAN_RX_Rdy) {
var.can_timeout = 0;
CAN_Read_Msg(&CAN_RX_Msg);
Haltech_Write_Digital(&CAN_RX_Msg);
}
if (var.can_timeout > 2) {
}
if (CAN_TX_Rdy) {
if (var.Send_Data_IRQ) {
if (var.Send_Data_IRQ == 4)
Haltech_Send_Keap_Alive(id + 6);
else if (var.Send_Data_IRQ == 3)
Haltech_Send_Analog(id);
else if (var.Send_Data_IRQ == 2)
Haltech_Send_Digital1(id + 2);
else if (var.Send_Data_IRQ == 1)
Haltech_Send_Digital2(id + 4);
var.Send_Data_IRQ--;
}
}
}
void Haltech_Send_Analog(uint32_t id) {
Get_Analog_Var();
CAN_TX_Msg.id = id;
CAN_TX_Msg.frame = DATA_FRAME;
CAN_TX_Msg.format = EXTD_FORMAT;
CAN_TX_Msg.data[0] = (uint8_t) var.avi[0];
CAN_TX_Msg.data[1] = (uint8_t) (var.avi[0] >> 8);
CAN_TX_Msg.data[2] = (uint8_t) var.avi[1];
CAN_TX_Msg.data[3] = (uint8_t) (var.avi[1] >> 8);
CAN_TX_Msg.data[4] = (uint8_t) var.avi[2];
CAN_TX_Msg.data[5] = (uint8_t) (var.avi[2] >> 8);
CAN_TX_Msg.data[6] = (uint8_t) var.avi[3];
CAN_TX_Msg.data[7] = (uint8_t) (var.avi[3] >> 8);
CAN_TX_Msg.lenght = 8;
CAN_Send_Msg(&CAN_TX_Msg);
}
void Haltech_Send_Digital1(uint32_t id) {
if (var.tim1_timeout > 2) {
NVIC_DisableIRQ(TIM1_CC_IRQn);
if (GPIO_READ_PIN(GPIOB, GPIO_PIN_15)) {
var.dvi_dt[0] = 0xff00;
var.dvi_fr[0] = 0;
} else {
var.dvi_dt[0] = 0;
var.dvi_fr[0] = 0;
}
NVIC_EnableIRQ(TIM1_CC_IRQn);
}
if (var.tim2_timeout > 2) {
NVIC_DisableIRQ(TIM2_IRQn);
if (GPIO_READ_PIN(GPIOB, GPIO_PIN_3)) {
var.dvi_dt[1] = 0xff00;
var.dvi_fr[1] = 0;
} else {
var.dvi_dt[1] = 0;
var.dvi_fr[1] = 0;
}
NVIC_EnableIRQ(TIM2_IRQn);
}
CAN_TX_Msg.id = id;
CAN_TX_Msg.frame = DATA_FRAME;
CAN_TX_Msg.format = EXTD_FORMAT;
CAN_TX_Msg.data[0] = (uint8_t) (var.dvi_dt[0]);
CAN_TX_Msg.data[1] = (uint8_t) (var.dvi_dt[0] >> 8);
CAN_TX_Msg.data[2] = (uint8_t) (var.dvi_fr[0]);
CAN_TX_Msg.data[3] = (uint8_t) (var.dvi_fr[0] >> 8);
CAN_TX_Msg.data[4] = (uint8_t) (var.dvi_dt[1]);
CAN_TX_Msg.data[5] = (uint8_t) (var.dvi_dt[1] >> 8);
CAN_TX_Msg.data[6] = (uint8_t) (var.dvi_fr[1]);
CAN_TX_Msg.data[7] = (uint8_t) (var.dvi_fr[1] >> 8);
CAN_TX_Msg.lenght = 8;
CAN_Send_Msg(&CAN_TX_Msg);
}
void Haltech_Send_Digital2(uint32_t id) {
if (var.tim3_timeout > 2) {
var.dvi_dt[2] = 0xff00;
var.dvi_fr[2] = 0;
}
if (var.tim15_timeout > 2) {
NVIC_DisableIRQ(TIM15_IRQn);
if (GPIO_READ_PIN(GPIOB, GPIO_PIN_13)) {
var.dvi_dt[3] = 0xff00;
var.dvi_fr[3] = 0;
} else {
var.dvi_dt[3] = 0;
var.dvi_fr[3] = 0;
}
NVIC_EnableIRQ(TIM15_IRQn);
}
CAN_TX_Msg.id = id;
CAN_TX_Msg.frame = DATA_FRAME;
CAN_TX_Msg.format = EXTD_FORMAT;
CAN_TX_Msg.data[0] = (uint8_t) (var.dvi_dt[2]);
CAN_TX_Msg.data[1] = (uint8_t) (var.dvi_dt[2] >> 8);
CAN_TX_Msg.data[2] = (uint8_t) (var.dvi_fr[2]);
CAN_TX_Msg.data[3] = (uint8_t) (var.dvi_fr[2] >> 8);
CAN_TX_Msg.data[4] = (uint8_t) (var.dvi_dt[3]);
CAN_TX_Msg.data[5] = (uint8_t) (var.dvi_dt[3] >> 8);
CAN_TX_Msg.data[6] = (uint8_t) (var.dvi_fr[3]);
CAN_TX_Msg.data[7] = (uint8_t) (var.dvi_fr[3] >> 8);
CAN_TX_Msg.lenght = 8;
CAN_Send_Msg(&CAN_TX_Msg);
}
void Haltech_Send_Keap_Alive(uint32_t id) {
CAN_TX_Msg.id = id;
CAN_TX_Msg.frame = DATA_FRAME;
CAN_TX_Msg.format = EXTD_FORMAT;
CAN_TX_Msg.data[0] = 0X10;
CAN_TX_Msg.data[1] = 0x09;
CAN_TX_Msg.data[2] = 0x0a;
CAN_TX_Msg.data[3] = 0x00;
CAN_TX_Msg.data[4] = 0x00;
CAN_TX_Msg.lenght = 5;
CAN_Send_Msg(&CAN_TX_Msg);
}
void Haltech_Write_Digital(can_msg_typedef *section) {
uint16_t temp_dt = 0, temp_fr = 0;
if (section->id == 0x2D0) {
//printf("\n Digital1");
temp_fr = section->data[0] + (section->data[1] << 8);
temp_dt = section->data[2] + (section->data[3] << 8);
if (temp_fr != var.dvo_fr[0]) {
var.dvo_fr[0] = temp_fr;
TIM14->PSC = var.dvo_fr[0];
}
if (temp_dt != var.dvo_dt[0]) {
if (temp_dt < 1000) {
var.dvo_dt[0] = temp_dt;
TIM14->CCR1 = var.dvo_dt[0];
} else {
var.dvo_dt[0] = 1000;
TIM14->CCR1 = var.dvo_dt[0];
}
}
temp_fr = section->data[4] + (section->data[5] << 8);
temp_dt = section->data[6] + (section->data[7] << 8);
if (temp_fr != var.dvo_fr[1]) {
var.dvo_fr[1] = temp_fr;
TIM16->PSC = var.dvo_fr[1];
}
if (temp_dt != var.dvo_dt[1]) {
if (temp_dt < 1000) {
var.dvo_dt[1] = temp_dt;
TIM16->CCR1 = var.dvo_dt[1];
} else {
var.dvo_dt[1] = 1000;
TIM16->CCR1 = var.dvo_dt[1];
}
}
} else if (section->id == 0x2D2) {
temp_fr = section->data[0] + (section->data[1] << 8);
temp_dt = section->data[2] + (section->data[3] << 8);
if (temp_fr != var.dvo_fr[2]) {
var.dvo_fr[2] = temp_fr;
TIM17->PSC = var.dvo_fr[2];
}
if (temp_dt != var.dvo_dt[2]) {
if (temp_dt < 1000) {
var.dvo_dt[2] = temp_dt;
TIM17->CCR1 = var.dvo_dt[2];
} else {
var.dvo_dt[2] = 1000;
TIM17->CCR1 = var.dvo_dt[2];
}
}
temp_fr = section->data[4] + (section->data[5] << 8);
temp_dt = section->data[6] + (section->data[7] << 8);
if (temp_fr != var.dvo_fr[3]) {
var.dvo_fr[3] = temp_fr;
TIM7->PSC = var.dvo_fr[3];
}
if (temp_dt != var.dvo_dt[3]) {
if (temp_dt < 1000) {
var.dvo_dt[3] = temp_dt;
//todo
} else {
var.dvo_dt[3] = 1000;
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET);
}
}
} else {
//TODO Eror
printf("\n Digital Error");
}
}