forked from gary/BCU
2
0
Fork 0
BCU/app/stm32fxxx_app/protocol/protocol_can_bcu.c

699 lines
20 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "kit_data.h"
#include "bsp_can.h"
#include "bsp_eeprom.h"
#include "bmu_manager.h"
#include "iso_check.h"
#include "version_manager.h"
#include "soc_calculate.h"
#include "sop_calculate.h"
#include "fault_manager.h"
#include "hv_adc_manager.h"
#include "eeprom_manager.h"
#include "dido_manager.h"
#include "statistic_manager.h"
#include "run_status.h"
#include "bmu_manager.h"
#include "protocol_comm.h"
//BCU广播报文1
void bcu_send_0x18010000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
uint8_t tmp_8u,status;
static uint8_t heart_bit = 0;
switch(bms_get_run_status())
{
case kRunStatus_Init:
status = 0;
break;
case kRunStatus_Standby:
status = 1;
break;
case kRunStatus_Chg:
status = 2;
break;
case kRunStatus_Dis:
status = 3;
default:
break;
}
//电池组总电压
tmp_16u = bms_get_statistic_data(kStatisticData_TotalVolt);
WRITE_LT_INT16U(buf, len, tmp_16u);
//电池组充/放电总电流
tmp_16u = bms_get_current() + 32000;
WRITE_LT_INT16U(buf, len, tmp_16u);
//电池模块SOC
tmp_8u = (uint8_t )(bms_get_soc()/100);
WRITE_LT_INT8U(buf, len, tmp_8u);
//电池模块SOH
tmp_8u = (uint8_t)(bms_get_soh()/100);
WRITE_LT_INT8U(buf, len, tmp_8u);
//BMS工作状态
tmp_8u = status;
WRITE_LT_INT8U(buf, len, tmp_8u);
//BMS心跳
tmp_8u = heart_bit++;
WRITE_LT_INT8U(buf, len, tmp_8u);
bsp_can_ext_data_sync_send(can, 0x18010000, buf, len);
}
//BCU广播报文2
void bcu_send_0x18020000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//电池总容量
tmp_16u = get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full);
WRITE_LT_INT16U(buf, len, tmp_16u);
//电池剩余容量
tmp_16u = (uint32_t)bms_get_soc()*get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)/10000;;
WRITE_LT_INT16U(buf, len, tmp_16u);
//系统额定电量
tmp_16u = get_eeprom_data(kEep_RatedCapacity, kEepromDataType_Full)*get_eeprom_data(kEep_RatedTotalVolt, kEepromDataType_Full)/10000;
WRITE_LT_INT16U(buf, len, tmp_16u);
//预留
WRITE_LT_INT16U(buf, len, 0);
bsp_can_ext_data_sync_send(can, 0x18020000, buf, len);
}
//BCU广播报文3
void bcu_send_0x18030000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//在线电池总数
tmp_16u = bms_get_statistic_data(kStatisticData_OnlineCellNum);
WRITE_LT_INT16U(buf, len, tmp_16u);
//在线温感总数
tmp_16u = get_eeprom_data(kEep_TempNum, kEepromDataType_Full);
WRITE_LT_INT16U(buf, len, tmp_16u);
//循环次数
tmp_16u = bms_get_cycle();
WRITE_LT_INT16U(buf, len, tmp_16u);
//预留
tmp_16u = 0;
WRITE_LT_INT16U(buf, len, tmp_16u);
bsp_can_ext_data_sync_send(can, 0x18030000, buf, len);
}
//BCU广播报文4
void bcu_send_0x18040000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//最大允许充电电流
tmp_16u = bms_get_sop_data(kSopData_ChgCur);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最大允许放电电流
tmp_16u = bms_get_sop_data(kSopData_DisCur);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最大允许充电功率
tmp_16u = bms_get_sop_data(kSopData_ChgCur) * bms_get_statistic_data(kStatisticData_TotalVolt) / 10000;
WRITE_LT_INT16U(buf, len, tmp_16u);
//最大允许放电功率
tmp_16u = get_eeprom_data(kEep_DisLTVoltLTAlarm1, kEepromDataType_Full);
WRITE_LT_INT16U(buf, len, tmp_16u);
bsp_can_ext_data_sync_send(can, 0x18040000, buf, len);
}
//BCU广播报文5
void bcu_send_0x18050000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//最高单体电压
tmp_16u = bms_get_statistic_data(kStatisticData_MaxVolt);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低单体电压
tmp_16u = bms_get_statistic_data(kStatisticData_MinVolt);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最大压差
tmp_16u = bms_get_statistic_data(kStatisticData_VoltDiff);
WRITE_LT_INT16U(buf, len, tmp_16u);
//平均电压
tmp_16u = bms_get_statistic_data(kStatisticData_AvgVolt);
WRITE_LT_INT16U(buf, len, tmp_16u);
bsp_can_ext_data_sync_send(can, 0x18050000, buf, len);
}
//BCU广播报文6
void bcu_send_0x18060000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//最高单体温度
tmp_16u = bms_get_statistic_data(kStatisticData_MaxTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低单体温度
tmp_16u = bms_get_statistic_data(kStatisticData_MinTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
//单体温差
tmp_16u = bms_get_statistic_data(kStatisticData_TempDiff);
WRITE_LT_INT16U(buf, len, tmp_16u);
//平均温度
tmp_16u = bms_get_statistic_data(kStatisticData_AvgTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
bsp_can_ext_data_sync_send(can, 0x1806FF00, buf, len);
}
//BCU广播报文7
void bcu_send_0x18070000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint8_t tmp_8u;
//最高单体电压从机序号
tmp_8u = bms_get_statistic_data(kStatisticData_MaxVoltBmuIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//最高单体电压电池序号
tmp_8u = bms_get_statistic_data(kStatisticData_MaxVoltIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//最低单体电压从机序号
tmp_8u = bms_get_statistic_data(kStatisticData_MinVoltBmuIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//最低单体电压电池序号
tmp_8u = bms_get_statistic_data(kStatisticData_MinVoltIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//最高单体温度从机序号
tmp_8u = bms_get_statistic_data(kStatisticData_MaxTempBmuIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//最高单体温度温感序号
tmp_8u = bms_get_statistic_data(kStatisticData_MaxTempIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//最低单体温度从机序号
tmp_8u = bms_get_statistic_data(kStatisticData_MinTempBmuIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//最低单体温度温感序号
tmp_8u = bms_get_statistic_data(kStatisticData_MinTempIdx) + 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
bsp_can_ext_data_sync_send(can, 0x18070000, buf, len);
}
#include "signal_manager.h"
//BCU广播报文8
void bcu_send_0x18080000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint8_t tmp_8u;
//故障最高等级
tmp_8u = bms_get_max_fault_level();
WRITE_LT_INT8U(buf, len, tmp_8u);
//断继电器故障
tmp_8u = (bms_get_fault_relay_off_bit() != 0);
WRITE_LT_INT8U(buf, len, tmp_8u);
//禁充标志
tmp_8u = (bms_get_signal(kSignalIdx_ForbidChg) == kSignalStatus_High);
WRITE_LT_INT8U(buf, len, tmp_8u);
//禁放标志
tmp_8u = (bms_get_signal(kSignalIdx_ForbidDis) == kSignalStatus_High);
WRITE_LT_INT8U(buf, len, tmp_8u);
WRITE_LT_INT32U(buf, len, 0);
bsp_can_ext_data_sync_send(can, 0x18080000, buf, len);
}
void bcu_can_receive(CanMsg *msg, can_dev_e can)
{
uint8_t code = 0,value = 0;
if(msg->id.value == 0x181CFFF4)
{
code = msg->data.byte[0];
value = msg->data.byte[1];
if(code == 1)
{
bsp_eeprom_save_data(kEep_ChgDisChangeBasis_RelayOnOffMode, value,kEepromDataType_Low);
}
if(code == 0 && get_eeprom_data(kEep_ChgDisChangeBasis_RelayOnOffMode, kEepromDataType_Low) == kRunCtrl_Cmd)
{
bms_set_circuit_cmd_status((CircuitStatus)value);
}
}
}
void bcu_can_send(uint32_t base_time,can_dev_e can)
{
static uint32_t dly = 0;
dly += base_time;
if((dly % 100) == 0)
{
dly = 0;
bcu_send_0x18010000(can);
bcu_send_0x18020000(can);
bcu_send_0x18030000(can);
bcu_send_0x18040000(can);
bcu_send_0x18050000(can);
bcu_send_0x18060000(can);
bcu_send_0x18070000(can);
bcu_send_0x18080000(can);
}
}
void protocol_can_bcu_init(can_dev_e can)
{
protocol_can_set_call(can, bcu_can_receive, bcu_can_send,NULL);
}
/*********************pylon can*********************/
/*********************pylon can*********************/
/*********************pylon can*********************/
void bcu_send_0x42100000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
uint8_t tmp_8u;
//电池组总电压
tmp_16u = bms_get_statistic_data(kStatisticData_TotalVolt);
WRITE_LT_INT16U(buf, len, tmp_16u);
//电池组充/放电总电流
tmp_16u = bms_get_current();
WRITE_LT_INT16U(buf, len, tmp_16u);
//主控温度--我们点表中没有,用单体平均温度替代
tmp_16u = bms_get_statistic_data(kStatisticData_AvgTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
//电池模块SOC
tmp_8u = (uint8_t )(bms_get_soc()/100);
WRITE_LT_INT8U(buf, len, tmp_8u);
//电池模块SOH
tmp_8u = (uint8_t)(bms_get_soh()/100);
WRITE_LT_INT8U(buf, len, tmp_8u);
bsp_can_ext_data_sync_send(can, 0x42100000, buf, len);
}
void bcu_send_0x42200000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//充电截止电压
tmp_16u = get_eeprom_data(kEep_ChgHTVoltHTAlarm1, kEepromDataType_Full);
WRITE_LT_INT16U(buf, len, tmp_16u);
//放点截止电压
tmp_16u = get_eeprom_data(kEep_DisLTVoltHTAlarm1, kEepromDataType_Full);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最大充电电流
tmp_16u = bms_get_sop_data(kSopData_ChgCur);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最大放电电流
tmp_16u = bms_get_sop_data(kSopData_DisCur);
WRITE_LT_INT16U(buf, len, tmp_16u);
bsp_can_ext_data_sync_send(can, 0x42200000, buf, len);
}
void bcu_send_0x42300000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//最高单体电池电压
tmp_16u = bms_get_statistic_data(kStatisticData_MaxVolt);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低单体电池电压
tmp_16u = bms_get_statistic_data(kStatisticData_MinVolt);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最高单体电池电压编号
tmp_16u = bms_get_statistic_data(kStatisticData_MaxVoltIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低单体电池电压编号
tmp_16u = bms_get_statistic_data(kStatisticData_MinVoltIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
bsp_can_ext_data_sync_send(can, 0x42300000, buf, len);
}
void bcu_send_0x42400000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//最高单体电池温度
tmp_16u = bms_get_statistic_data(kStatisticData_MaxTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低单体电池温度
tmp_16u = bms_get_statistic_data(kStatisticData_MinTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最高单体电池温度编号
tmp_16u = bms_get_statistic_data(kStatisticData_MaxTempIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低单体电池温度编号
tmp_16u = bms_get_statistic_data(kStatisticData_MinTempIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
bsp_can_ext_data_sync_send(can, 0x42400000, buf, len);
}
void bcu_send_0x42500000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
uint8_t tmp_8u, status;
uint16_t temp_second;
uint16_t temp_third;
/* 基本状态
pylon bluesun
0 休眠 初始化
1 充电 待机
2 放电 充电
3 搁置 放电
*/
switch(bms_get_run_status())
{
case kRunStatus_Standby:
status = 0;
break;
case kRunStatus_Chg:
status = 1;
break;
case kRunStatus_Dis:
status = 2;
break;
case kRunStatus_PwrOff:
status = 3;
default:
break;
}
//基本状态
tmp_8u = status;
WRITE_LT_INT8U(buf, len, tmp_8u);
//循环周期
tmp_16u = bms_get_cycle();
WRITE_LT_INT16U(buf, len, tmp_16u);
//故障--无
tmp_8u = 0;
WRITE_LT_INT8U(buf, len, tmp_8u);
//告警--二三级放入告警中
//每个告警的位的位置需要测一下
temp_second = set_bit_based_on_source_pylon(status, kFaultLevel_Second);
temp_third = set_bit_based_on_source_pylon(status, kFaultLevel_Third);
tmp_16u = temp_second | temp_third;
WRITE_LT_INT16U(buf, len, tmp_16u);
//保护--一级放入保护中
//每个告警的位的位置需要测一下
tmp_16u = set_bit_based_on_source_pylon(status, kFaultLevel_First);
WRITE_LT_INT16U(buf, len, tmp_16u);
bsp_can_ext_data_sync_send(can, 0x42500000, buf, len);
}
void bcu_send_0x42600000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//最高电池模块电压--无,用单体平均电压×16代替
tmp_16u = bms_get_statistic_data(kStatisticData_AvgVolt) * 16;
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低电池模块电压--无用单体平均电压×16代替
tmp_16u = bms_get_statistic_data(kStatisticData_AvgVolt) * 16;
WRITE_LT_INT16U(buf, len, tmp_16u);
//最高电池模块电压编号--无,用单体从机号代替
tmp_16u = bms_get_statistic_data(kStatisticData_MaxVoltBmuIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低电池模块电压编号--无,用单体从机号代替
tmp_16u = bms_get_statistic_data(kStatisticData_MinVoltBmuIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
bsp_can_ext_data_sync_send(can, 0x42600000, buf, len);
}
void bcu_send_0x42700000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
//最高电池模块温度--无,用最高单体温度代替
tmp_16u = bms_get_statistic_data(kStatisticData_MaxTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低电池模块温度--无,用最低单体温度代替
tmp_16u = bms_get_statistic_data(kStatisticData_MinTemp);
WRITE_LT_INT16U(buf, len, tmp_16u);
//最高电池模块温度编号--无,用单体从机号代替
tmp_16u = bms_get_statistic_data(kStatisticData_MaxTempBmuIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
//最低电池模块温度编号--无,用单体从机号代替
tmp_16u = bms_get_statistic_data(kStatisticData_MinTempBmuIdx) + 1;
WRITE_LT_INT16U(buf, len, tmp_16u);
bsp_can_ext_data_sync_send(can, 0x42700000, buf, len);
}
void bcu_send_0x42800000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
uint8_t tmp_8u;
uint16_t bms_stu = 0;
if(bms_get_run_status() == kRunStatus_Init)
{
bms_stu = 0;
}
else if(bms_get_run_status() == kRunStatus_Standby)
{
bms_stu |= 0x1;
}
else if(bms_get_run_status() == kRunStatus_Chg)
{
bms_stu |= 0x2;
}
else if(bms_get_run_status() == kRunStatus_Dis)
{
bms_stu |= 0x3;
}
if(bms_get_signal(kSignalIdx_ForbidChg) == kSignalStatus_High)
{
bms_stu |= 0x10;
}
if(bms_get_signal(kSignalIdx_ForbidDis) == kSignalStatus_High)
{
bms_stu |= 0x20;
}
//禁止充电标志
if ((bms_stu & 0x10) >> 4 == 1)
{
tmp_8u = 0xAA;
}
else
{
tmp_8u = 0;
}
WRITE_LT_INT8U(buf, len, tmp_8u);
//禁止放电标志
if ((bms_stu & 0x10) >> 5 == 1)
{
tmp_8u = 0xAA;
}
else
{
tmp_8u = 0;
}
WRITE_LT_INT8U(buf, len, tmp_8u);
//预留
tmp_16u = 0;
WRITE_LT_INT16U(buf, len, tmp_16u);
//预留
tmp_16u = 0;
WRITE_LT_INT16U(buf, len, tmp_16u);
//预留
tmp_16u = 0;
WRITE_LT_INT16U(buf, len, tmp_16u);
bsp_can_ext_data_sync_send(can, 0x42800000, buf, len);
}
void bcu_send_0x73100000(can_dev_e can)
{
uint8_t len = 0, buf[8];
uint16_t tmp_16u;
uint8_t tmp_8u;
//Hardware Version
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//预留
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//硬件版本-V
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//硬件版本-R
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//软件版本-V主版本Major
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//软件版本-V子版本Minor
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//开发主版本
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
//开发子版本
tmp_8u = 1;
WRITE_LT_INT8U(buf, len, tmp_8u);
bsp_can_ext_data_sync_send(can, 0x73100000, buf, len);
}
void bcu_can_send_pylon(uint32_t base_time,can_dev_e can)
{
static uint32_t dly = 0;
dly += base_time;
if((dly % 100) == 0)
{
dly = 0;
bcu_send_0x42100000(can);
bcu_send_0x42200000(can);
bcu_send_0x42300000(can);
bcu_send_0x42400000(can);
bcu_send_0x42500000(can);
bcu_send_0x42600000(can);
bcu_send_0x42700000(can);
bcu_send_0x42800000(can);
bcu_send_0x73100000(can);
}
}
uint16_t set_bit_based_on_source_pylon(uint8_t status, FaultLevel alarmLevel)
{
uint16_t tmp_16u = 0;
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , alarmLevel), 0)) //一级总压过压--电池组充电高压保护
{
if (status == 1)
{
KIT_SET_BIT_MASK_32(tmp_16u, 3);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 0, tmp_16u, 3);
}
}
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , alarmLevel), 1)) //一级总压欠压--电池组放电低压保护
{
if (status == 2)
{
KIT_SET_BIT_MASK_32(tmp_16u, 2);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 1, tmp_16u, 2);
}
}
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , alarmLevel), 2)) //一级单体过压--电池单体高压保护
{
KIT_SET_BIT_MASK_32(tmp_16u, 1);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 2, tmp_16u, 1);
}
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , alarmLevel), 3)) //一级单体欠压--电池单体低压保护
{
KIT_SET_BIT_MASK_32(tmp_16u, 0);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 3, tmp_16u, 0);
}
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , alarmLevel), 4)) //一级单体过温--充电高温保护 && 放电高温保护
{
if (status == 1)
{
KIT_SET_BIT_MASK_32(tmp_16u, 5);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 4, tmp_16u, 5);
}
else if (status == 2)
{
KIT_SET_BIT_MASK_32(tmp_16u, 7);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 4, tmp_16u, 7);
}
}
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , alarmLevel), 5)) //一级单体低温--充电低温保护 && 放电低温保护
{
if (status == 1)
{
KIT_SET_BIT_MASK_32(tmp_16u, 4);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 5, tmp_16u, 4);
}
else if (status == 2)
{
KIT_SET_BIT_MASK_32(tmp_16u, 6);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 5, tmp_16u, 6);
}
}
if (KIT_GET_BIT_32(bms_get_fault_single_bit(0 , alarmLevel), 8)) //一级电流过大--电池组充电过流保护 && 电池组放电过流保护
{
if (status == 1)
{
KIT_SET_BIT_MASK_32(tmp_16u, 8);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 8, tmp_16u, 8);
}
else if (status == 2)
{
KIT_SET_BIT_MASK_32(tmp_16u, 9);
//tmp_16u = set_bit_based_on_source_pylon(bms_get_fault_single_bit(0 , kFaultLevel_First), 8, tmp_16u, 9);
}
}
return tmp_16u;
}
//pylon接收函数休眠和唤醒控制充电放电命令
void bcu_can_receive_pylon(CanMsg *msg, can_dev_e can)
{
uint8_t code = 0,value = 0, statusChg = 0, statusDischg = 0;
if(msg->id.value == 0x620)
{
code = msg->data.byte[0];
if(code == 0x55)
{
//控制设备进入休眠状态,断开总正总负继电器
bms_crtl_do_status(kDoType_Positive, kDoCtrlStatus_Off, 100);
bms_crtl_do_status(kDoType_Negative, kDoCtrlStatus_Off, 100);
}
else if (code == 0xAA)
{
//控制设备退出休眠状态,闭合总正总负继电器
bms_crtl_do_status(kDoType_Positive, kDoCtrlStatus_On, 100);
bms_crtl_do_status(kDoType_Negative, kDoCtrlStatus_On, 100);
}
}
if(msg->id.value == 0x621)
{
statusChg = msg->data.byte[0];
statusDischg = msg->data.byte[1];
if(statusChg == 0xAA)
{
//充电命令,闭合总正总负继电器
bms_crtl_do_status(kDoType_Positive, kDoCtrlStatus_On, 100);
bms_crtl_do_status(kDoType_Negative, kDoCtrlStatus_On, 100);
}
else if (statusDischg == 0xAA)
{
//放电命令,闭合总正总负继电器
bms_crtl_do_status(kDoType_Positive, kDoCtrlStatus_On, 100);
bms_crtl_do_status(kDoType_Negative, kDoCtrlStatus_On, 100);
}
}
}
void protocol_pylon_can_init(can_dev_e can)
{
protocol_can_set_call(can, bcu_can_receive_pylon, bcu_can_send_pylon, NULL);
}