Commit 4f21b111 authored by 王佳伟's avatar 王佳伟

feat:替换CAN库

parent a712640a
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
#include "CAN_APP.h" #include "CAN_APP.h"
#include "CAN_Communication_Matrix.h" #include "CAN_Communication_Matrix.h"
#include "Analog_Signals.h" #include "Analog_Signals.h"
#include "RSCAN.h"
#include "Key.h"
uint8_t CrcCheckSum(uint8_t *data, uint8_t len) uint8_t CrcCheckSum(uint8_t *data, uint8_t len)
{ {
...@@ -30,166 +31,345 @@ uint8_t CrcCheckSum(uint8_t *data, uint8_t len) ...@@ -30,166 +31,345 @@ uint8_t CrcCheckSum(uint8_t *data, uint8_t len)
return crc; return crc;
} }
void Can_Write_Fun_APP(void)
{
}
void Can_Abort_Confirm(uint32_t Identifier, uint8_t TransferStatus)
{
}
void CAN_QuickTimer_Init(void)
{
}
void NODE_26D_SET_Confirm(void)
{
}
void Can_BusOff_Fun(void)
{
}
void Can_BusOffRecover(void)
{
}
void Can_Set_Buff_260(uint8_t CopyData [])
{
}
void Can_Set_Buff_280(uint8_t CopyData [])
{
}
void Can_Set_Buff_380(uint8_t CopyData []) void CAN_MSG_COUNTER_PLUS(void)
{ {
} }
uint8_t VSpeed = 0;
void Can_Set_Buff_385(uint8_t CopyData []) void Can_Set_Buff_200(uint8_t CopyData [])
{ {
uint8_t i = 0u;
uint32_t wtemp = 0u;
VSpeed = 0;
CANMsg220Union *pCANMsg;
} pCANMsg = (CANMsg220Union *)CopyData;
void Can_Set_Buff_52E(uint8_t CopyData []) if ( pCANMsg != ( void * )0 )
{ {
for ( i = 0u; i < 8u; i++ )
} {
pCANMsg->Msg [ i ] = 0u;
void Can_Set_Buff_69B(uint8_t CopyData []) }
{ }
switch(Check_Steps)
{
case 0:
VSpeed = 0;
break;
case 1:
VSpeed = 10;
break;
case 2:
VSpeed = 19;
break;
case 3:
VSpeed = 29;
break;
case 4:
VSpeed = 38;
break;
case 5:
VSpeed = 47;
break;
case 6:
VSpeed = 57;
break;
case 7:
VSpeed = 75;
break;
case 8:
VSpeed = 88;
break;
case 9:
VSpeed = 88;
break;
case 10:
VSpeed = 88;
break;
case 11:
VSpeed = 88;
break;
}
pCANMsg->Sig.Vspeeed = VSpeed;
} }
void Can_Set_Buff_481(uint8_t CopyData [])
void Can_Set_Buff_28A(uint8_t CopyData [])
{ {
uint8_t i = 0u;
uint32_t wtemp = 0u;
CANMsg481Union *pCANMsg;
} pCANMsg = (CANMsg481Union *)CopyData;
void Can_Set_Buff_2E1(uint8_t CopyData [])
{
} if ( pCANMsg != ( void * )0 )
void Can_Set_Buff_228(uint8_t CopyData []) {
{ for ( i = 0u; i < 8u; i++ )
{
pCANMsg->Msg [ i ] = 0u;
}
}
pCANMsg->Sig.Year = 1;
pCANMsg->Sig.Month = 1;
pCANMsg->Sig.Day = 1;
pCANMsg->Sig.Minute = 0;
pCANMsg->Sig.Second = 0;
pCANMsg->Sig.Hour = Hour;
} }
void Can_Set_Buff_211(uint8_t CopyData []) void Can_Set_Buff_020(uint8_t CopyData [])
{ {
uint8_t i = 0u;
uint32_t wtemp = 0u;
CANMsg020Union *pCANMsg;
} pCANMsg = (CANMsg020Union *)CopyData;
void Can_Set_Buff_341(uint8_t CopyData [])
{
} if ( pCANMsg != ( void * )0 )
void Can_Set_Buff_128(uint8_t CopyData []) {
{ for ( i = 0u; i < 8u; i++ )
{
pCANMsg->Msg [ i ] = 0u;
}
}
switch(Check_Steps)
{
case 0:
pCANMsg->Sig.Eletricity_H = 0;
pCANMsg->Sig.Eletricity_L = 0;
break;
case 1:
pCANMsg->Sig.Eletricity_H = 0;
pCANMsg->Sig.Eletricity_L = 0;
break;
case 2:
pCANMsg->Sig.Eletricity_H = 0;
pCANMsg->Sig.Eletricity_L = 0x96;
break;
case 3:
pCANMsg->Sig.Eletricity_H = 0x01;
pCANMsg->Sig.Eletricity_L = 0x5E;
break;
case 4:
pCANMsg->Sig.Eletricity_H = 0x02;
pCANMsg->Sig.Eletricity_L = 0x26;
break;
case 5:
pCANMsg->Sig.Eletricity_H = 0x02;
pCANMsg->Sig.Eletricity_L = 0xEE;
break;
case 6:
pCANMsg->Sig.Eletricity_H = 0x03;
pCANMsg->Sig.Eletricity_L = 0xE8;
break;
case 7:
pCANMsg->Sig.Eletricity_H = 0x02;
pCANMsg->Sig.Eletricity_L = 0xEE;
break;
case 8:
pCANMsg->Sig.Eletricity_H = 0x02;
pCANMsg->Sig.Eletricity_L = 0x26;
break;
case 9:
pCANMsg->Sig.Eletricity_H = 0x01;
pCANMsg->Sig.Eletricity_L = 0x5E;
break;
case 10:
pCANMsg->Sig.Eletricity_H = 0;
pCANMsg->Sig.Eletricity_L = 0x96;
break;
case 11:
pCANMsg->Sig.Eletricity_H = 0x03;
pCANMsg->Sig.Eletricity_L = 0xE8;
break;
} }
void Can_Set_Buff_24A(uint8_t CopyData [])
{
}
void Can_Set_Buff_35A(uint8_t CopyData [])
{
} }
void Can_Set_Buff_135(uint8_t CopyData []) void Can_Set_Buff_042(uint8_t CopyData [])
{ {
uint8_t i = 0u;
uint32_t wtemp = 0u;
CANMsg042Union *pCANMsg;
} pCANMsg = (CANMsg042Union *)CopyData;
void Can_Set_Buff_153(uint8_t CopyData [])
{
if ( pCANMsg != ( void * )0 )
{
for ( i = 0u; i < 8u; i++ )
{
pCANMsg->Msg [ i ] = 0u;
}
}
if(Tcs == 1)
{
pCANMsg->Sig.Tcs_mode = 1;
pCANMsg->Sig.Tcs_Control = 1;
}
else if(Tcs == 2)
{
pCANMsg->Sig.Tcs_Control = 1;
}
else
{
;
}
} }
void Can_Set_Buff_131(uint8_t CopyData [])
{
} void Can_Set_Buff_480(uint8_t CopyData [])
void Can_Set_Buff_139(uint8_t CopyData [])
{ {
uint8_t i = 0u;
uint32_t wtemp = 0u;
CANMsg480Union *pCANMsg;
} pCANMsg = (CANMsg480Union *)CopyData;
void Can_Set_Buff_431(uint8_t CopyData [])
{
if ( pCANMsg != ( void * )0 )
{
for ( i = 0u; i < 8u; i++ )
{
pCANMsg->Msg [ i ] = 0u;
}
}
pCANMsg->Sig.Signal_Gps = Signal_GPS;
pCANMsg->Sig.Signal_4g = Signal_4G;
} }
void Can_Set_Buff_5e0(uint8_t CopyData [])
{
} void Can_Set_Buff_280(uint8_t CopyData [])
void Can_Set_Buff_236(uint8_t CopyData [])
{ {
uint8_t i = 0u;
uint32_t wtemp = 0u;
CANMsg280Union *pCANMsg;
} pCANMsg = (CANMsg280Union *)CopyData;
void Can_Set_Buff_168(uint8_t CopyData []) if ( pCANMsg != ( void * )0 )
{ {
for ( i = 0u; i < 8u; i++ )
{
pCANMsg->Msg [ i ] = 0u;
}
}
if(Energy_recovery == 2)
{
pCANMsg->Sig.Energy_status = 1;
pCANMsg->Sig.Energy_recovery = 2;
pCANMsg->Sig.Side_bracket = 1;
}
else if(Energy_recovery == 1)
{
pCANMsg->Sig.Energy_status = 1;
pCANMsg->Sig.Energy_recovery = 1;
}
else if(Energy_recovery == 3)
{
pCANMsg->Sig.Energy_status = 1;
pCANMsg->Sig.Energy_recovery = 3;
}
else
{
;
}
if(Tcs == 1)
{
pCANMsg->Sig.Tcs_Status = 1;
}
} }
void Can_Set_Buff_0F6(uint8_t CopyData [])
{
} void Can_Set_Buff_202(uint8_t CopyData [])
void Can_Set_Buff_0E1(uint8_t CopyData [])
{ {
uint8_t i = 0u;
uint32_t wtemp = 0u;
CANMsg202Union *pCANMsg;
} pCANMsg = (CANMsg202Union *)CopyData;
void Can_Set_Buff_036(uint8_t CopyData [])
{
} if ( pCANMsg != ( void * )0 )
{
for ( i = 0u; i < 8u; i++ )
{
pCANMsg->Msg [ i ] = 0u;
}
}
if(Gear == 0)
{
pCANMsg->Sig.Gear = 0;
}
else if(Gear == 1)
{
pCANMsg->Sig.Gear = 1;
}
else if(Gear == 2)
{
pCANMsg->Sig.Gear = 2;
}
void Can_Set_Buff_0B6(uint8_t CopyData []) if(Cruiste == 1)
{ {
pCANMsg->Sig.Cruiste = 1;
}
if(Ready == 1)
{
pCANMsg->Sig.Ready = 1;
}
else if(Ready == 2)
{
pCANMsg->Sig.Ready = 2;
}
else if(Ready == 3 )
{
pCANMsg->Sig.Ready = 3;
}
if(Fault == 1)
{
pCANMsg->Sig.Fault = 1;
}
} }
void Can_Set_Buff_001(uint8_t CopyData [])
void Can_Set_Buff_320(uint8_t CopyData [])
{ {
uint8_t i = 0u;
uint32_t wtemp = 0u;
CANMsg001Union *pCANMsg;
} pCANMsg = (CANMsg001Union *)CopyData;
void Can_Set_Buff_152(uint8_t CopyData [])
{
if ( pCANMsg != ( void * )0 )
{
for ( i = 0u; i < 8u; i++ )
{
pCANMsg->Msg [ i ] = 0u;
}
}
if(Motor_hert == 1)
{
pCANMsg->Sig.Motor_hert = 1;
}
} }
void Can_Set_Buff_1A1(uint8_t CopyData []) void Can_Set_Buff_021(uint8_t CopyData [])
{ {
uint8_t i = 0u;
uint32_t wtemp = 0u;
CANMsg021Union *pCANMsg;
} pCANMsg = (CANMsg021Union *)CopyData;
void Can_Set_Buff_75F(uint8_t CopyData []) if ( pCANMsg != ( void * )0 )
{ {
} for ( i = 0u; i < 8u; i++ )
{
void Can_Set_Buff_389(uint8_t CopyData []) pCANMsg->Msg [ i ] = 0u;
{ }
}
if(Battery_temp == 1)
{
pCANMsg->Sig.Battery_temp = 1;
}
} }
#ifndef _CAN_APP_H_ #ifndef _CAN_APP_H_
#define _CAN_APP_H_ #define _CAN_APP_H_
void Can_Abort_All(void); #include "RSCAN.h"
void CAN_QuickTimer_Init(void);
void Can_Write_Fun_APP(void); typedef union
void Can_BusOff_Fun(void); {
uint8_t Msg [ 8 ];
struct
{
uint64_t :8;
uint64_t :8;
uint64_t Vspeeed :8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
} Sig;
} CANMsg220Union;
typedef union
{
uint8_t Msg [ 8 ];
struct
{
uint64_t Year :8;
uint64_t Month :8;
uint64_t Day :8;
uint64_t Hour :8;
uint64_t Minute :8;
uint64_t Second :8;
uint64_t :8;
uint64_t :8;
} Sig;
} CANMsg481Union;
typedef union
{
uint8_t Msg [ 8 ];
struct
{
uint64_t :8;
uint64_t :8;
uint64_t Eletricity_H:8;
uint64_t Eletricity_L:8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
} Sig;
} CANMsg020Union;
typedef union
{
uint8_t Msg [ 8 ];
struct
{
uint64_t :8;
uint64_t :8;
uint64_t TCS:4;
uint64_t :2;
uint64_t Tcs_mode:1;
uint64_t Tcs_Control:1;
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
} Sig;
} CANMsg042Union;
typedef union
{
uint8_t Msg [ 8 ];
struct
{
uint64_t Signal_4g:8;
uint64_t Signal_Gps:8;
uint64_t :6;
uint64_t Blooth_phone:1;
uint64_t Blooth_led:1;
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
} Sig;
} CANMsg480Union;
typedef union
{
uint8_t Msg [ 8 ];
struct
{
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t Energy_status:1;
uint64_t :2;
uint64_t Side_bracket:1;
uint64_t Tcs_Status:1;
uint64_t Energy_recovery:2;
uint64_t :1;
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
} Sig;
} CANMsg280Union;
typedef union
{
uint8_t Msg [ 8 ];
struct
{
uint64_t :2;
uint64_t Gear:2;
uint64_t :4;
uint64_t :4;
uint64_t Ready:2;
uint64_t Cruiste:1;
uint64_t :1;
uint64_t :2;
uint64_t Fault:1;
uint64_t :5;
uint64_t Range:8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
} Sig;
} CANMsg202Union;
typedef union
{
uint8_t Msg [ 8 ];
struct
{
uint64_t :8;
uint64_t :8;
uint64_t :4;
uint64_t Motor_hert:1;
uint64_t :3;
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
} Sig;
} CANMsg001Union;
typedef union
{
uint8_t Msg [ 8 ];
struct
{
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t :8;
uint64_t :7;
uint64_t Battery_temp:1;
uint64_t :8;
uint64_t :8;
} Sig;
} CANMsg021Union;
void CAN_MSG_COUNTER_PLUS(void);
void Can_Set_Buff_260(uint8_t CopyData []);
void Can_Set_Buff_280(uint8_t CopyData []);
void Can_Set_Buff_380(uint8_t CopyData []);
void Can_Set_Buff_385(uint8_t CopyData []);
void Can_Set_Buff_52E(uint8_t CopyData []);
void Can_Set_Buff_69B(uint8_t CopyData []);
void Can_Set_Buff_28A(uint8_t CopyData []);
void Can_Set_Buff_2E1(uint8_t CopyData []);
void Can_Set_Buff_0E1(uint8_t CopyData []);
void Can_Set_Buff_0F6(uint8_t CopyData []);
void Can_Set_Buff_036(uint8_t CopyData []);
void Can_Set_Buff_0B6(uint8_t CopyData []);
void Can_Set_Buff_320(uint8_t CopyData []);
void Can_Set_Buff_152(uint8_t CopyData []);
void Can_Set_Buff_153(uint8_t CopyData []);
void Can_Set_Buff_168(uint8_t CopyData []);
void Can_Set_Buff_128(uint8_t CopyData []);
void Can_Set_Buff_139(uint8_t CopyData []);
void Can_Set_Buff_131(uint8_t CopyData []);
void Can_Set_Buff_24A(uint8_t CopyData []);
void Can_Set_Buff_1A1(uint8_t CopyData []);
void Can_Set_Buff_389(uint8_t CopyData []);
void Can_Set_Buff_135(uint8_t CopyData []);
void Can_Set_Buff_35A(uint8_t CopyData []);
void Can_Set_Buff_341(uint8_t CopyData []);
void Can_Set_Buff_211(uint8_t CopyData []);
void Can_Set_Buff_228(uint8_t CopyData []);
void Can_Set_Buff_431(uint8_t CopyData []);
void Can_Set_Buff_5e0(uint8_t CopyData []);
void Can_Set_Buff_236(uint8_t CopyData []);
void Can_Set_Buff_75F(uint8_t CopyData []);
void Can_BusOffRecover(void);
uint8_t CrcCheckSum(uint8_t *data, uint8_t len); uint8_t CrcCheckSum(uint8_t *data, uint8_t len);
void Can_Set_Buff_200(uint8_t CopyData []);
void Can_Set_Buff_481(uint8_t CopyData []);
void Can_Set_Buff_020(uint8_t CopyData []);
void Can_Set_Buff_042(uint8_t CopyData []);
void Can_Set_Buff_480(uint8_t CopyData []);
void Can_Set_Buff_280(uint8_t CopyData []);
void Can_Set_Buff_202(uint8_t CopyData []);
void Can_Set_Buff_001(uint8_t CopyData []);
void Can_Set_Buff_021(uint8_t CopyData []);
extern uint8_t VSpeed;
#endif #endif
#include "CAN_Communication_Matrix.h" #include "CAN_Communication_Matrix.h"
#include "CAN_APP.h" #include "CAN_APP.h"
/* 2021/08/08 16:54:40 */ #include "RSCAN.h"
/*
can1 0- 31 /* 2022/11/19 14:29:55 */
can2 32- 63 st_CanMsgOp CAN_CH4_CanMsgOp;
can4 64 95 st_CanMsgTxOp CAN_CH4_CanMsgTxOp;
*/ #define CAN_CH4 &CAN_CH4_CanMsgOp
const st_CAN_SendAttribute CAN_CH4_CANSendAttr[CAN_CH4_ID_SEND_TOTAL] =
//Tx: {
const st_CAN_SendAttribute st_CANSendAttr [ ID_SEND_TOTAL ] = { {0x200, 100ul*1000ul, 5ul, 0u, MSG_STD, RSCAN_CHANNEL_BUF_4, 8u, CAN_MSG_TX_CYCLE, Can_Set_Buff_200, (void *)0},//车速
{0x2E1ul, 50ul * 1000ul, 0ul, 0u, 0, 64u, 8u, 0, Can_Set_Buff_2E1, ( void * )0}, {0x481, 500ul*1000ul, 10ul, 0u, MSG_STD, RSCAN_CHANNEL_BUF_5, 8u, CAN_MSG_TX_CYCLE, Can_Set_Buff_481, (void *)0},//时间
{0x020, 100ul*1000ul, 15ul, 0u, MSG_STD, RSCAN_CHANNEL_BUF_6, 8u, CAN_MSG_TX_CYCLE, Can_Set_Buff_020, (void *)0},//电量
{0x042, 10ul*1000ul, 20ul, 0u, MSG_STD, RSCAN_CHANNEL_BUF_7, 8u, CAN_MSG_TX_CYCLE, Can_Set_Buff_042, (void *)0},//tcs
{0x480, 500ul*1000ul, 25ul, 0u, MSG_STD, RSCAN_CHANNEL_BUF_8, 8u, CAN_MSG_TX_CYCLE, Can_Set_Buff_480, (void *)0},//GPS,4G,电话,蓝牙指示灯
{0x280, 100ul*1000ul, 30ul, 0u, MSG_STD, RSCAN_CHANNEL_BUF_9, 8u, CAN_MSG_TX_CYCLE, Can_Set_Buff_280, (void *)0},//tcs,能量回收
{0x202, 100ul*1000ul, 35ul, 0u, MSG_STD, RSCAN_CHANNEL_BUF_10, 8u, CAN_MSG_TX_CYCLE, Can_Set_Buff_202, (void *)0},//档位,续航里程,ready
{0x001, 100ul*1000ul, 40ul, 0u, MSG_STD, RSCAN_CHANNEL_BUF_11, 8u, CAN_MSG_TX_CYCLE, Can_Set_Buff_001, (void *)0},//电机过热
{0x021, 100ul*1000ul, 45ul, 0u, MSG_STD, RSCAN_CHANNEL_BUF_12, 8u, CAN_MSG_TX_CYCLE, Can_Set_Buff_021, (void *)0},//电池过热
}; };
const st_CANMsgAttribute CAN_CH4_CAN_MSG_CONST_ARRAY[CAN_CH4_ID_TOTAL_MAX] =
//Rx:
const st_CANMsgAttribute CAN_MSG_CONST_ARRAY [ CAN_CH0_ID_TOTAL_MAX ] =
{ {
{ {
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u}, {0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u}, {0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u}, {0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
5000ul, 5000ul,
0x10FF4117ul, 0x250ul,
(( void * )0),
(( void * )0),
(( void * )0),
},
{
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
5000ul,
0x18FEAE17ul,
(( void * )0),
(( void * )0),
(( void * )0),
},
{
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
5000ul,
0x10FF1017ul,
(( void * )0), (( void * )0),
(( void * )0), (( void * )0),
(( void * )0), (( void * )0),
...@@ -54,7 +37,7 @@ const st_CANMsgAttribute CAN_MSG_CONST_ARRAY [ CAN_CH0_ID_TOTAL_MAX ] = ...@@ -54,7 +37,7 @@ const st_CANMsgAttribute CAN_MSG_CONST_ARRAY [ CAN_CH0_ID_TOTAL_MAX ] =
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u}, {0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u}, {0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
5000ul, 5000ul,
0x18FEC1EEul, 0x450ul,
(( void * )0), (( void * )0),
(( void * )0), (( void * )0),
(( void * )0), (( void * )0),
...@@ -64,17 +47,7 @@ const st_CANMsgAttribute CAN_MSG_CONST_ARRAY [ CAN_CH0_ID_TOTAL_MAX ] = ...@@ -64,17 +47,7 @@ const st_CANMsgAttribute CAN_MSG_CONST_ARRAY [ CAN_CH0_ID_TOTAL_MAX ] =
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u}, {0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u}, {0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
5000ul, 5000ul,
0xCFE6CEEul, 0x45l,
(( void * )0),
(( void * )0),
(( void * )0),
},
{
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
{0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u},
5000ul,
0x18FEFC17ul,
(( void * )0), (( void * )0),
(( void * )0), (( void * )0),
(( void * )0), (( void * )0),
...@@ -82,168 +55,25 @@ const st_CANMsgAttribute CAN_MSG_CONST_ARRAY [ CAN_CH0_ID_TOTAL_MAX ] = ...@@ -82,168 +55,25 @@ const st_CANMsgAttribute CAN_MSG_CONST_ARRAY [ CAN_CH0_ID_TOTAL_MAX ] =
}; };
uint8_t Co_Can_ConvertSubID_CAN_CH4(uint32_t MsgID)
uint32_t Get_ID_ODO(void)
{
uint32_t ret = 0;
ret = Get_CAN_CH0_ID_18FEC1EE_Sig_Total_Vehicle_Distance();
ret = ret / 200 ;
return ret;
}
uint32_t Get_ID_FUEL(void)
{
uint32_t ret = 0;
ret = Get_CAN_CH0_ID_18FEFC17_Sig_Fuel_level();
ret = ret * 2 / 5;
return ret;
}
uint32_t Get_ID_VSpeed(void)
{
uint32_t ret = 0;
ret = Get_CAN_CH0_ID_0CFE6CEE_Sig_Tachograph_vehicle_speed();
ret = ret / 256;
return ret;
}
uint8_t Get_ID_HandBrakeSts(void)
{
uint8_t ret = 0;
ret = Get_CAN_CH0_ID_10FF4117_Sig_IC_HandBrakeSts();
return ret;
}
uint8_t Get_CAN_CH0_ID_10FF4117_Sig_IC_HCSPS_LampFailSts(void)
{
return (((uint8_t)((uint8_t)CAN_MSG_Read(CAN_CH0_ID_Send10FF4117_Msg_Count, 1u) >> 0u) & 0x03u));
}
uint8_t Get_CAN_CH0_ID_10FF4117_Sig_BackUPSts(void)
{
return (((uint8_t)((uint8_t)CAN_MSG_Read(CAN_CH0_ID_Send10FF4117_Msg_Count, 0u) >> 2u) & 0x03u));
}
uint8_t Get_CAN_CH0_ID_10FF4117_Sig_Seatbeltsts(void)
{
return (((uint8_t)((uint8_t)CAN_MSG_Read(CAN_CH0_ID_Send10FF4117_Msg_Count, 0u) >> 0u) & 0x03u));
}
uint8_t Get_CAN_CH0_ID_10FF4117_Sig_IC_HandBrakeSts(void)
{
return (((uint8_t)((uint8_t)CAN_MSG_Read(CAN_CH0_ID_Send10FF4117_Msg_Count, 0u) >> 6u) & 0x03u));
}
uint8_t Get_CAN_CH0_ID_18FEAE17_Sig_Service_Brake_Circuit_2_Air_Pressure(void)
{
return (((uint8_t)((uint8_t)CAN_MSG_Read(CAN_CH0_ID_Send18FEAE17_Msg_Count, 3u) >> 0u) & 0xFFu));
}
uint8_t Get_CAN_CH0_ID_18FEAE17_Sig_Service_Brake_Circuit_1_Air_Pressure(void)
{
return (((uint8_t)((uint8_t)CAN_MSG_Read(CAN_CH0_ID_Send18FEAE17_Msg_Count, 2u) >> 0u) & 0xFFu));
}
uint8_t Get_CAN_CH0_ID_10FF1017_Sig_HeatedMirrorSts(void)
{
return (((uint8_t)((uint8_t)CAN_MSG_Read(CAN_CH0_ID_Send10FF1017_Msg_Count, 2u) >> 2u) & 0x03u));
}
uint8_t Get_CAN_CH0_ID_10FF1017_Sig_RearFogLightSts(void)
{
return (((uint8_t)((uint8_t)CAN_MSG_Read(CAN_CH0_ID_Send10FF1017_Msg_Count, 2u) >> 4u) & 0x03u));
}
uint8_t Get_CAN_CH0_ID_10FF1017_Sig_FrontFogLightSts(void)
{ {
return (((uint8_t)((uint8_t)CAN_MSG_Read(CAN_CH0_ID_Send10FF1017_Msg_Count, 2u) >> 6u) & 0x03u)); uint8_t u8Result = CAN_CH4_ID_TOTAL_MAX;
}
uint8_t Get_CAN_CH0_ID_10FF1017_Sig_LowBeamSts(void)
{
return (((uint8_t)((uint8_t)CAN_MSG_Read(CAN_CH0_ID_Send10FF1017_Msg_Count, 1u) >> 0u) & 0x03u));
}
uint8_t Get_CAN_CH0_ID_10FF1017_Sig_HighBeamSts(void)
{
return (((uint8_t)((uint8_t)CAN_MSG_Read(CAN_CH0_ID_Send10FF1017_Msg_Count, 1u) >> 2u) & 0x03u));
}
uint8_t Get_CAN_CH0_ID_10FF1017_Sig_LHParkTailLightSts(void)
{
return (((uint8_t)((uint8_t)CAN_MSG_Read(CAN_CH0_ID_Send10FF1017_Msg_Count, 1u) >> 4u) & 0x03u));
}
uint8_t Get_CAN_CH0_ID_10FF1017_Sig_RHParkTailLightSts(void)
{
return (((uint8_t)((uint8_t)CAN_MSG_Read(CAN_CH0_ID_Send10FF1017_Msg_Count, 1u) >> 6u) & 0x03u));
}
uint32_t Get_CAN_CH0_ID_18FEC1EE_Sig_Total_Vehicle_Distance(void)
{
return (((uint32_t)((uint32_t)((uint32_t)((uint32_t)((uint32_t)CAN_MSG_Read(CAN_CH0_ID_Send18FEC1EE_Msg_Count, 3u) >> 0u) & 0xFFu) << 8u) + \
((uint32_t)((uint32_t)CAN_MSG_Read(CAN_CH0_ID_Send18FEC1EE_Msg_Count, 2u) >> 0u) & 0xFFu) << 8u) + \
((uint32_t)((uint32_t)CAN_MSG_Read(CAN_CH0_ID_Send18FEC1EE_Msg_Count, 1u) >> 0u) & 0xFFu) << 8u) + \
((uint32_t)((uint32_t)CAN_MSG_Read(CAN_CH0_ID_Send18FEC1EE_Msg_Count, 0u) >> 0u) & 0xFFu));
}
uint16_t Get_CAN_CH0_ID_0CFE6CEE_Sig_Tachograph_vehicle_speed(void)
{
return (((uint16_t)((uint16_t)((uint16_t)CAN_MSG_Read(CAN_CH0_ID_Send0CFE6CEE_Msg_Count, 7u) >> 0u) & 0xFFu) << 8u) + \
((uint16_t)((uint16_t)CAN_MSG_Read(CAN_CH0_ID_Send0CFE6CEE_Msg_Count, 6u) >> 0u) & 0xFFu));
}
uint8_t Get_CAN_CH0_ID_18FEFC17_Sig_Fuel_level(void)
{
return (((uint8_t)((uint8_t)CAN_MSG_Read(CAN_CH0_ID_Send18FEFC17_Msg_Count, 0u) >> 0u) & 0xFFu));
}
uint8_t Co_Can_ConvertSubID(uint32_t MsgID)
{
uint8_t u8Result = CAN_CH0_ID_TOTAL_MAX;
switch (MsgID) switch (MsgID)
{ {
case CAN_CH0_ID_Send10FF4117_Msg: case CAN_CH4_ID_250_Msg_Count:
u8Result = CAN_CH0_ID_Send10FF4117_Msg_Count; u8Result = CAN_CH4_ID_250_Msg;
break;
case CAN_CH0_ID_Send18FEAE17_Msg:
u8Result = CAN_CH0_ID_Send18FEAE17_Msg_Count;
break;
case CAN_CH0_ID_Send10FF1017_Msg:
u8Result = CAN_CH0_ID_Send10FF1017_Msg_Count;
break; break;
case CAN_CH0_ID_Send18FEC1EE_Msg: case CAN_CH4_ID_450_Msg_Count:
u8Result = CAN_CH0_ID_Send18FEC1EE_Msg_Count; u8Result = CAN_CH4_ID_450_Msg;
break; break;
case CAN_CH0_ID_Send0CFE6CEE_Msg: case CAN_CH4_ID_451_Msg_Count:
u8Result = CAN_CH0_ID_Send0CFE6CEE_Msg_Count; u8Result = CAN_CH4_ID_451_Msg;
break;
case CAN_CH0_ID_Send18FEFC17_Msg:
u8Result = CAN_CH0_ID_Send18FEFC17_Msg_Count;
break; break;
default : default :
u8Result = CAN_CH0_ID_TOTAL_MAX; u8Result = CAN_CH4_ID_TOTAL_MAX;
break; break;
} }
return u8Result; return u8Result;
} }
#ifndef CAN_COMMUNICATION_MATRIX_H_ #ifndef CAN_CH4_CAN_COMMUNICATION_MATRIX_H_
#define CAN_COMMUNICATION_MATRIX_H_ #define CAN_CH4_CAN_COMMUNICATION_MATRIX_H_
#include "TYW_stdint.h" #include "TYW_stdint.h"
#include "CAN_Lib.h" #include "CAN_Lib.h"
typedef enum extern st_CanMsgOp CAN_CH4_CanMsgOp;
{
CAN_CH0_ID_Send10FF4117_Msg_Count,
CAN_CH0_ID_Send18FEAE17_Msg_Count,
CAN_CH0_ID_Send10FF1017_Msg_Count,
CAN_CH0_ID_Send18FEC1EE_Msg_Count,
CAN_CH0_ID_Send0CFE6CEE_Msg_Count,
CAN_CH0_ID_Send18FEFC17_Msg_Count,
CAN_CH0_ID_TOTAL_MAX, extern st_CanMsgTxOp CAN_CH4_CanMsgTxOp;
} CAN_MSG_ID_t;
typedef enum typedef enum
{ {
ID_2E1_COUNT, CAN_CH4_ID_250_Msg_Count,
CAN_CH4_ID_450_Msg_Count,
ID_SEND_TOTAL, CAN_CH4_ID_451_Msg_Count,
} CAN_MSG_SEND_ID_t;
extern const st_CANMsgAttribute CAN_MSG_CONST_ARRAY [ CAN_CH0_ID_TOTAL_MAX ];
extern const st_CAN_SendAttribute st_CANSendAttr[ID_SEND_TOTAL] ;
#define CAN_CH0_ID_Send10FF4117_Msg 0x10FF4117ul
#define CAN_CH0_ID_Send18FEAE17_Msg 0x18FEAE17ul
#define CAN_CH0_ID_Send10FF1017_Msg 0x10FF1017ul
#define CAN_CH0_ID_Send18FEC1EE_Msg 0x18FEC1EEul
#define CAN_CH0_ID_Send0CFE6CEE_Msg 0x0CFE6CEEul
#define CAN_CH0_ID_Send18FEFC17_Msg 0x18FEFC17ul
extern uint32_t Get_ID_ODO(void);
extern uint32_t Get_ID_FUEL(void);
extern uint8_t Get_ID_HandBrakeSts(void);
extern uint32_t Get_ID_VSpeed(void);
extern uint8_t Get_CAN_CH0_ID_10FF4117_Sig_IC_HCSPS_LampFailSts(void); CAN_CH4_ID_TOTAL_MAX,
extern uint8_t Get_CAN_CH0_ID_10FF4117_Sig_BackUPSts(void); } CAN_CH4_CAN_MSG_ID_t;
extern uint8_t Get_CAN_CH0_ID_10FF4117_Sig_Seatbeltsts(void);
extern uint8_t Get_CAN_CH0_ID_10FF4117_Sig_IC_HandBrakeSts(void);
extern uint8_t Get_CAN_CH0_ID_18FEAE17_Sig_Service_Brake_Circuit_2_Air_Pressure(void);
extern uint8_t Get_CAN_CH0_ID_18FEAE17_Sig_Service_Brake_Circuit_1_Air_Pressure(void);
extern uint8_t Get_CAN_CH0_ID_10FF1017_Sig_HeatedMirrorSts(void);
extern uint8_t Get_CAN_CH0_ID_10FF1017_Sig_RearFogLightSts(void);
extern uint8_t Get_CAN_CH0_ID_10FF1017_Sig_FrontFogLightSts(void);
extern uint8_t Get_CAN_CH0_ID_10FF1017_Sig_LowBeamSts(void);
extern uint8_t Get_CAN_CH0_ID_10FF1017_Sig_HighBeamSts(void);
extern uint8_t Get_CAN_CH0_ID_10FF1017_Sig_LHParkTailLightSts(void);
extern uint8_t Get_CAN_CH0_ID_10FF1017_Sig_RHParkTailLightSts(void);
extern uint32_t Get_CAN_CH0_ID_18FEC1EE_Sig_Total_Vehicle_Distance(void);
extern uint16_t Get_CAN_CH0_ID_0CFE6CEE_Sig_Tachograph_vehicle_speed(void);
extern uint8_t Get_CAN_CH0_ID_18FEFC17_Sig_Fuel_level(void);
extern uint8_t Co_Can_ConvertSubID(uint32_t MsgID);
typedef enum
{
CAN_CH4_ID_200,
CAN_CH4_ID_481,
CAN_CH4_ID_020,
CAN_CH4_ID_042,
CAN_CH4_ID_480,
CAN_CH4_ID_280,
CAN_CH4_ID_202,
CAN_CH4_ID_001,
CAN_CH4_ID_021,
CAN_CH4_ID_SEND_TOTAL,
} CAN_CH4_CAN_MSG_SEND_ID_t;
extern const st_CANMsgAttribute CAN_CH4_CAN_MSG_CONST_ARRAY[CAN_CH4_ID_TOTAL_MAX] ;
extern const st_CAN_SendAttribute CAN_CH4_CANSendAttr[CAN_CH4_ID_SEND_TOTAL] ;
#define CAN_CH4_ID_250_Msg 0x250u
#define CAN_CH4_ID_450_Msg 0x450u
#define CAN_CH4_ID_451_Msg 0x451u
extern uint8_t Co_Can_ConvertSubID_CAN_CH4(uint32_t MsgID);
#endif #endif
#ifndef CAN_LIB_H_ #ifndef CAN_LIB_H_
#define CAN_LIB_H_ #define CAN_LIB_H_
/* #define Platform_16Bit /*
#define Platform_32Bit*/ #define Platform_16Bit
#define Platform_32Bit
*/
#ifdef Platform_16Bit #ifdef Platform_16Bit
#define canlib_uint8_t unsigned char #define canlib_uint8_t unsigned char
#define canlib_uint16_t unsigned int #define canlib_uint16_t unsigned int
#define canlib_uint32_t unsigned long #define canlib_uint32_t unsigned long
#else #else
#define canlib_uint8_t unsigned char #define canlib_uint8_t unsigned char
#define canlib_uint16_t unsigned short #define canlib_uint16_t unsigned short
...@@ -24,88 +26,166 @@ typedef void (*MSG_CKB_ON_LOST)(canlib_uint8_t CopyData []); ...@@ -24,88 +26,166 @@ typedef void (*MSG_CKB_ON_LOST)(canlib_uint8_t CopyData []);
typedef void (*pfnMsgBufferSet)(canlib_uint8_t CopyData []); typedef void (*pfnMsgBufferSet)(canlib_uint8_t CopyData []);
typedef void (*pfnMsgSuccess)(void); typedef void (*pfnMsgSuccess)(void);
/**@enum CAN_FUNC_ERR_t
* @brief 定义驱动上报应用消息类型 \n
*/
typedef enum typedef enum
{ {
CAN_ERR_OK, CAN_ERR_OK, /**< 模块初始化返回值,参数正常 */
CAN_ERR_ParaInit, CAN_ERR_ParaInit, /**< 模块初始化返回值,初始化错误 */
CAN_ERR_OUTRANGE, CAN_ERR_OUTRANGE, /**< 模块初始化返回值,参数传入超限制 */
} CAN_FUNC_ERR_t; } CAN_FUNC_ERR_t;
/**@enum CAN_TX_Status_t
* @brief 定义CAN模块发送状态 \n
*/
typedef enum
{
CAN_N_TX_Disable = 0x00U, /**< CAN模块禁止发送 */
CAN_N_TX_Enable = 0x55U, /**< CAN模块允许发送 */
} CAN_TX_Status_t;
/**@enum CAN_RX_Status_t
* @brief 定义CAN模块接收状态 \n
*/
typedef enum
{
CAN_N_RX_Enable = 0x00U, /**< CAN模块禁止接收 */
CAN_N_RX_Disable = 0x55U, /**< CAN模块允许接收 */
} CAN_RX_Status_t;
/**@struct st_CANMsgAttribute
* @brief 报文接收属性结构体 \n
* 定义报接收文属性
*/
typedef struct typedef struct
{ {
canlib_uint8_t INIT_Aarry [ 8u ]; canlib_uint8_t Init_Aarry [ 8u ]; /**< 报文初始化值.默认加载,未收到报文时,buffer内为该值 */
canlib_uint8_t TIMEOUT_Array [ 8u ]; canlib_uint8_t TimeOut_Array [ 8u ]; /**< 报文掉线值.掉线后加载 */
canlib_uint8_t MASK_Array [ 8u ]; canlib_uint8_t Mask_Array [ 8u ]; /**< 报文掉线掩码.哪一位要是用掉线值就置位 */
canlib_uint32_t MSG_TIMEOUT_VAL; canlib_uint32_t MSG_TimeOut_Val; /**< 报文掉线时间,单位ms */
canlib_uint32_t MSG_Identifier; canlib_uint32_t MSG_Identifier; /**< 报文ID值 */
MSG_CKB_ON_RECEIVE Msg_ReceiveCBK; MSG_CKB_ON_RECEIVE Msg_ReceiveCBK; /**< 报文中断接收回调函数,默认NULL,该回调函数处于接收中断内. */
MSG_CKB_ON_PROCESS Msg_ProcessCBK; MSG_CKB_ON_PROCESS Msg_ProcessCBK; /**< 报文逻辑接收回调函数,默认NULL,该回调函数处逻辑函数内 */
MSG_CKB_ON_LOST Msg_LOSTCBK; MSG_CKB_ON_LOST Msg_LostCBK; /**< 报文逻辑掉线回调函数,默认NULL,该回调函掉线后会被执行一次 */
} st_CANMsgAttribute; } st_CANMsgAttribute;
/**@struct st_CAN_SendAttribute
* @brief 报文发送属性结构体 \n
* 定义发送报文属性
*/
typedef struct
{
canlib_uint32_t u32MsgID; /**< 报文发送ID */
canlib_uint32_t u32MsgCycle; /**< 报文发送周期,单位是us */
canlib_uint32_t u32MsgCycleOffset; /**< 报文发送周期偏移量,定时器计时初值 */
canlib_uint32_t u32InitSendCnt; /**< 报文发送初始次数 */
canlib_uint8_t u8MsgSTD_EXT; /**< 报文类型是标准帧还是扩展帧 标准帧0 扩展帧1 */
canlib_uint8_t u8MsgPro; /**< 报文发送优先级,使用哪个buffer发送 */
canlib_uint8_t u8MsgDLC; /**< 报文发送的长度,默认8 */
canlib_uint8_t u8TXMsgType; /**< 报文发送的类型,周期帧,事件帧,周期事件帧 */
pfnMsgBufferSet MsgBufferSet; /**< 报文发送buffer填充函数,报文发送前会调用此函数从外部加载发送值 */
pfnMsgSuccess MsgSuccess; /**< 报文发送成功回调函数 */
} st_CAN_SendAttribute;
/**@struct st_CAN_Msg
* @brief 报文发送结构体 \n
* 定义报文发送结构的信息
*/
typedef struct
{
canlib_uint32_t MsgID; /**< 报文发送ID */
canlib_uint8_t MsgStd; /**< 报文发送标准帧/扩展帧 */
canlib_uint8_t MsgRTR; /**< 报文发送数据帧/远程帧 默认0 */
canlib_uint8_t MsgDLC; /**< 报文发送长度 */
canlib_uint8_t MsgPro; /**< 报文发送优先级,对应使用buffer */
canlib_uint8_t Msg [ 8 ]; /**< 报文发送数据buffer */
} st_CAN_Msg;
typedef canlib_uint8_t (*HAL_CAN_Send)(st_CAN_Msg *Msg);
/**@struct st_CANMsgStruct
* @brief 内部使用 \n
* 内容不明
*/
typedef struct
{
canlib_uint8_t AnalyzeMsg [ 8u ];
canlib_uint8_t ReceiveBuf [ 8u ];
volatile canlib_uint8_t CAN_Busy;
volatile canlib_uint8_t CAN_Received;
canlib_uint8_t CAN_Status;
canlib_uint8_t CAN_Reverse;
canlib_uint32_t CAN_Lost;
} st_CANMsgStruct;
/**@struct st_CanMsgOp
* @brief 内部使用,不做讲解 \n
* 内部使用,不做讲解
*/
typedef struct
{
st_CANMsgStruct *CAN_MSG_Analysis;
const st_CANMsgAttribute *pAttrubute;
canlib_uint16_t Total_Msg;
canlib_uint8_t u8CAN_RX_ENABLE;
} st_CanMsgOp;
/**@struct st_CAN_SendOperation
* @brief 内部使用,不做讲解 \n
* 内部使用,不做讲解
*/
typedef struct typedef struct
{ {
canlib_uint32_t u32MsgID; canlib_uint32_t u32MsgID;
canlib_uint32_t u32Timer;
canlib_uint32_t u32MsgCycle; canlib_uint32_t u32MsgCycle;
canlib_uint32_t u32MsgCycleOffset; canlib_uint32_t u32SendCnt;
canlib_uint32_t u32InitSendCnt;
canlib_uint8_t u8MsgSTD_EXT; canlib_uint8_t u8MsgSTD_EXT;
canlib_uint8_t u8MsgPro; canlib_uint8_t u8MsgPro;
canlib_uint8_t u8MsgDLC;
canlib_uint8_t u8TXMsgType; canlib_uint8_t u8TXMsgType;
pfnMsgBufferSet MsgBufferSet; canlib_uint8_t u8MsgRet;
pfnMsgSuccess MsgSuccess; canlib_uint8_t u8MsgBuff [ 8u ];
} st_CAN_SendAttribute; canlib_uint16_t u16MsgDLC;
typedef struct canlib_uint16_t u16TXMsgDIMcounter;
{ } st_CAN_SendOperation;
union /**@struct st_CanMsgTxOp
{ * @brief 内部使用,不做讲解 \n
canlib_uint32_t word_msg [ 2 ]; * 内部使用,不做讲解
canlib_uint8_t Msg [ 8 ]; */
}sig;
} st_CAN_MsgBuff;
extern st_CAN_MsgBuff Load_AttrBuff [ 300 ] ;
typedef struct typedef struct
{ {
canlib_uint32_t MsgID; const st_CAN_SendAttribute *pCAN_SendAttribute;
canlib_uint8_t MsgStd; st_CAN_SendOperation *CanMsg;
canlib_uint8_t MsgRTR; canlib_uint16_t Total_Msg;
canlib_uint8_t MsgDLC; HAL_CAN_Send Can_Write;
canlib_uint8_t MsgPro; canlib_uint8_t u8CAN_TX_ENABLE;
canlib_uint8_t Msg [ 8 ]; } st_CanMsgTxOp;
} st_CAN_Msg;
extern void CAN_RX_SetEnable(st_CanMsgOp *CanRXMsgOp, CAN_RX_Status_t RX_enable);
typedef canlib_uint8_t (*HAL_CAN_Send)(st_CAN_Msg *Msg); extern CAN_RX_Status_t CAN_RX_ReadEnableSts(st_CanMsgOp *CanRXMsgOp);
extern void CAN_RX_SetEnable(canlib_uint8_t RX_enable); extern void CAN_TX_SetEnable(st_CanMsgTxOp *CanMsgTxOp, CAN_TX_Status_t TX_enable);
extern canlib_uint8_t CAN_RX_ReadEnableSts(void); extern CAN_TX_Status_t CAN_TX_ReadEnableSts(st_CanMsgTxOp *CanMsgTxOp);
extern void CAN_TX_SetEnable(canlib_uint8_t TX_enable); extern void Can_Write_Fun(st_CanMsgTxOp *CanMsgTxOp, canlib_uint32_t u32CbkCycle);
extern canlib_uint8_t CAN_TX_ReadEnableSts(void); extern CAN_FUNC_ERR_t Can_Msg_Tx_Overwrite(st_CanMsgTxOp *CanMsgTxOp, canlib_uint32_t u32TxMsgIdx, canlib_uint16_t u16TxMSgDIMcounter, canlib_uint32_t u32TxMsgCycle);
extern CAN_FUNC_ERR_t Can_TX_BuffInit(st_CanMsgTxOp *CanMsgTxOp, const st_CAN_SendAttribute *Array, canlib_uint16_t length, HAL_CAN_Send pfunc);
extern void Can_Write_Fun(canlib_uint32_t u32CbkCycle); extern void Can_Msg_TX_SUCCESS(st_CanMsgTxOp *CanMsgTxOp, canlib_uint32_t u32TxMsgIdx);
extern CAN_FUNC_ERR_t Can_Msg_Tx_Overwrite(canlib_uint32_t u32TxMsgIdx, canlib_uint16_t u16TxMSgDIMcounter, canlib_uint32_t u32TxMsgCycle); extern CAN_FUNC_ERR_t Can_Msg_TX_FastInitCycle(st_CanMsgTxOp *CanMsgTxOp, canlib_uint32_t u32TxMsgIdx, canlib_uint32_t CurTimerCnt);
extern CAN_FUNC_ERR_t Can_TX_BuffInit(canlib_uint8_t *MemSpace, const st_CAN_SendAttribute *Array, canlib_uint16_t length, HAL_CAN_Send pfunc);
extern void Can_Msg_TX_SUCCESS(canlib_uint32_t u32TxMsgIdx); extern void Can_RX_BuffInit(st_CanMsgOp *CanRXMsgOp, const st_CANMsgAttribute *array, canlib_uint16_t length);
extern CAN_FUNC_ERR_t Can_Msg_TX_FastInitCycle(canlib_uint32_t u32TxMsgIdx, canlib_uint32_t CurTimerCnt); extern void CanMSg_XMS_Analysis(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t CbkCycle);
extern void Co_Can_Buff_Set(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t MsgID, canlib_uint8_t m_DLC, canlib_uint8_t Msg []);
extern void Can_RX_BuffInit(canlib_uint8_t *memSpace, const st_CANMsgAttribute *array, canlib_uint16_t length); extern canlib_uint8_t CAN_MSG_Status(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t MsgID);
extern void CanMSg_XMS_Analysis(canlib_uint16_t CbkCycle); extern canlib_uint8_t CAN_MSG_Read(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t MsgIdx, canlib_uint8_t BuffIdx);
extern void Co_Can_Buff_Set(canlib_uint16_t MsgID, canlib_uint8_t m_DLC, canlib_uint8_t Msg []); extern void Can_RX_ResetAllTimer(st_CanMsgOp *CanRXMsgOp);
extern canlib_uint8_t CAN_MSG_Status(canlib_uint16_t MsgID); extern void Can_RX_ResetTimer(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t idx);
extern canlib_uint8_t CAN_MSG_Read(canlib_uint16_t MsgIdx, canlib_uint8_t BuffIdx); extern canlib_uint32_t CAN_RX_Get_TimeStamp(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t MsgIdx);
extern void Can_RX_ResetAllTimer(void);
extern void Can_RX_ResetTimer(canlib_uint16_t idx);
extern canlib_uint32_t Read_CAN_RX_Version(void); extern canlib_uint32_t Read_CAN_RX_Version(void);
extern canlib_uint32_t Read_CAN_TX_Version(void); extern canlib_uint32_t Read_CAN_TX_Version(void);
extern void CAN_TX_DiagCtrlEnable(canlib_uint8_t TX_enable); extern void CAN_TX_DiagCtrlEnable(st_CanMsgTxOp *CanMsgTxOp, CAN_TX_Status_t TX_enable);
extern void CAN_TX_DiagCtrlRelease(void); extern void CAN_TX_DiagCtrlRelease(st_CanMsgTxOp *CanMsgTxOp);
extern void CAN_RX_DiagCtrlEnable(canlib_uint8_t RX_enable); extern void CAN_RX_DiagCtrlEnable(st_CanMsgOp *CanRXMsgOp, CAN_RX_Status_t RX_enable);
extern void CAN_RX_DiagCtrlRelease(void); extern void CAN_RX_DiagCtrlRelease(st_CanMsgOp *CanRXMsgOp);
#endif #endif
#include "CAN_Lib.h" #include "CAN_Lib.h"
typedef struct /**
{ * @file CAN_Signal_Rx.c
canlib_uint8_t AnalyzeMsg [ 8u ]; * @brief CAN接收文件
canlib_uint8_t ReceiveBuf [ 8u ]; * @details CAN接收文件
volatile canlib_uint8_t CAN_Busy; * @author 赵建智
volatile canlib_uint8_t CAN_Received; * @date 2022.04.25
canlib_uint8_t CAN_Status; * @version V1.0
canlib_uint8_t CAN_Reverse; * @copyright 赵建智
canlib_uint32_t CAN_Lost; */
} st_CANMsgStruct;
typedef struct
{
st_CANMsgStruct * CAN_MSG_Analysis;
const st_CANMsgAttribute *pAttrubute;
canlib_uint16_t Total_Msg;
} st_CanMsgOp;
st_CanMsgOp CanRXMsgOp; #if defined(__ICCARM__) /**< IAR ARM Compiler */
canlib_uint8_t u8CAN_RX_ENABLE;
#if defined(__ICCARM__)
const char DataStr [] = {__DATE__}; const char DataStr [] = {__DATE__};
const char TimeStr [] = {__TIME__}; const char TimeStr [] = {__TIME__};
#elif defined(__ghs__) #elif defined(__ghs__) /**< Green Hills ARM Compiler */
const char DataStr [] = {__DATE__}; const char DataStr [] = {__DATE__};
const char TimeStr [] = {__TIME__}; const char TimeStr [] = {__TIME__};
#elif defined(__GNUC__) #elif defined(__GNUC__) /**< GNU Compiler Collection */
const char DataStr [] = {__DATE__};
const char TimeStr [] = {__TIME__};
#elif defined(__DCC__) /**< Wind River Diab Compiler */
const char DataStr [] = {__DATE__};
const char TimeStr [] = {__TIME__};
#elif defined(__ARMCC_VERSION) /**< ARMC Compiler */
const char DataStr [] = {__DATE__};
const char TimeStr [] = {__TIME__};
#elif defined(__HC12__) /**< Codewarrior Compiler */
const char DataStr [] = {__DATE__};
const char TimeStr [] = {__TIME__};
#else /**< VScode */
const char DataStr [] = {__DATE__}; const char DataStr [] = {__DATE__};
const char TimeStr [] = {__TIME__}; const char TimeStr [] = {__TIME__};
#else
#endif #endif
void CAN_RX_SetEnable(canlib_uint8_t RX_enable) #if defined(__ICCARM__) /**< IAR ARM Compiler */
const char Cur_RX_Module_Version [] = {"RX_VER=V1.0.0"};
#elif defined(__ghs__) /**< Green Hills ARM Compiler */
const char Cur_RX_Module_Version [] = {"RX_VER=V1.0.0"};
#elif defined(__GNUC__) /**< GNU Compiler Collection */
const char Cur_RX_Module_Version [] = {"RX_VER=V1.0.0"};
#elif defined(__DCC__) /**< Wind River Diab Compiler */
const char Cur_RX_Module_Version [] = {"RX_VER=V1.0.0"};
#elif defined(__ARMCC_VERSION) /**< ARMC Compiler */
const char Cur_RX_Module_Version [] = {"RX_VER=V1.0.0"};
#elif defined(__HC12__) /**< Codewarrior Compiler */
const char Cur_RX_Module_Version [] = {"RX_VER=V1.0.0"};
#else /**< VScode */
const char Cur_RX_Module_Version [] = {"RX_VER=V1.0.0"};
#endif
/**
* @brief CAN报文接收使能控制
* @param[in] CanRXMsgOp 报文接收操作对象指针, 每路can都应有独立的结构体指针
* @param[in] RX_enable 报文接收状态,默认是0x00
* - CAN_N_RX_Enable 报文允许接收
* - CAN_N_RX_Disable 报文禁止接收
* @warning
*
* 示例
@code
CAN_RX_SetEnable(&CAN_CH0_CanMsgOp,CAN_N_RX_Enable);
@endcode
*
* @since 1.0.1
*/
void CAN_RX_SetEnable(st_CanMsgOp *CanRXMsgOp, CAN_RX_Status_t RX_enable)
{ {
if ( (u8CAN_RX_ENABLE & 0x80u) == 0x80u ) if ( (CanRXMsgOp->u8CAN_RX_ENABLE & 0x80u) == 0x80u )
{ {
} }
else else
{ {
u8CAN_RX_ENABLE = RX_enable; CanRXMsgOp->u8CAN_RX_ENABLE = ( canlib_uint8_t )RX_enable;
} }
} }
canlib_uint8_t CAN_RX_ReadEnableSts(void) /**
* @brief CAN报文接收状态读取
* @param[in] CanRXMsgOp 报文接收操作对象指针, 每路can都应有独立的结构体指针
* @return 当前CAN通道RX状态
* - CAN_N_RX_Enable 报文允许接收
* - CAN_N_RX_Disable 报文禁止接收
* @warning None
*
* 示例
@code
CAN_RX_Status_t Rx_Statis = CAN_RX_ReadEnableSts(&CAN_CH0_CanMsgOp);
@endcode
*
* @since 1.0.1
*/
CAN_RX_Status_t CAN_RX_ReadEnableSts(st_CanMsgOp *CanRXMsgOp)
{ {
return u8CAN_RX_ENABLE; return ( CAN_RX_Status_t )CanRXMsgOp->u8CAN_RX_ENABLE;
} }
void Can_RX_BuffInit(canlib_uint8_t *memSpace, const st_CANMsgAttribute *array, canlib_uint16_t length) /**
* @brief CAN报文接收模块初始化
* @param[in] CanRXMsgOp 报文接收操作对象指针, 每路can都应有独立的结构体指针
* @param[in] array 报文接收属性列表,按CAN通道区分,各自独立
* @param[in] length 接收报文总数量,按CAN通道区分,各自独立
* @warning None
*
* 示例
@code
#pragma alignvar(8)
uint32_t pRXBuff [ CAN_RX_MSG_Block * ID_TOTAL_MAX ];
void COM_CAN_Init(void)
{
memset(pRXBuff, 0, sizeof(pRXBuff));
CAN_CH0_CanMsgOp.CAN_MSG_Analysis=pRXBuff;
Can_RX_BuffInit(&CAN_CH0_CanMsgOp, CAN_CH0_CAN_MSG_CONST_ARRAY, CAN_CH0_ID_TOTAL_MAX);
}
@endcode
*
* @since 1.0.0
*/
void Can_RX_BuffInit(st_CanMsgOp *CanRXMsgOp, const st_CANMsgAttribute *array, canlib_uint16_t length)
{ {
canlib_uint16_t i; canlib_uint16_t i;
canlib_uint8_t j; canlib_uint8_t j;
CanRXMsgOp.pAttrubute = array; CanRXMsgOp->pAttrubute = array;
CanRXMsgOp.CAN_MSG_Analysis = ( st_CANMsgStruct * )(( void * )memSpace); /* CanRXMsgOp->CAN_MSG_Analysis = ( st_CANMsgStruct * )(( void * )memSpace); */
CanRXMsgOp.Total_Msg = length; CanRXMsgOp->Total_Msg = length;
for ( i = 0u; i < CanRXMsgOp.Total_Msg; i++ ) for ( i = 0u; i < CanRXMsgOp->Total_Msg; i++ )
{ {
for ( j = 0u; j < 8u; j++ ) for ( j = 0u; j < 8u; j++ )
{ {
CanRXMsgOp.CAN_MSG_Analysis [ i ].AnalyzeMsg [ j ] = CanRXMsgOp.pAttrubute [ i ].INIT_Aarry [ j ]; CanRXMsgOp->CAN_MSG_Analysis [ i ].AnalyzeMsg [ j ] = CanRXMsgOp->pAttrubute [ i ].Init_Aarry [ j ];
CanRXMsgOp.CAN_MSG_Analysis [ i ].ReceiveBuf [ j ] = CanRXMsgOp.pAttrubute [ i ].INIT_Aarry [ j ]; CanRXMsgOp->CAN_MSG_Analysis [ i ].ReceiveBuf [ j ] = CanRXMsgOp->pAttrubute [ i ].Init_Aarry [ j ];
} }
CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Busy = 0U; CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Busy = 0U;
CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Received = 0U; CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Received = 0U;
CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Status = 0U; CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Status = 0U;
CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Reverse = 0U; CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Reverse = 0U;
CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Lost = 0U; CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Lost = 0U;
} }
u8CAN_RX_ENABLE = 0u; CanRXMsgOp->u8CAN_RX_ENABLE = 0u;
} }
/**
void CanMSg_XMS_Analysis(canlib_uint16_t CbkCycle) * @brief CAN报文接收模块逻辑处理
* @param[in] CanRXMsgOp 报文接收操作对象指针, 每路can都应有独立的结构体指针
* @param[in] CbkCycle 报文接收模块调用周期,单位是ms
* @warning None
*
* 示例
@code
CanMSg_XMS_Analysis(&CAN_CH0_CanMsgOp,5u);
@endcode
*
* @since 1.0.0
*/
void CanMSg_XMS_Analysis(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t CbkCycle)
{ {
canlib_uint16_t i; canlib_uint16_t i;
canlib_uint8_t j; canlib_uint8_t j;
if ( (u8CAN_RX_ENABLE&0x7fu) == 0x00u ) if ( (CanRXMsgOp->u8CAN_RX_ENABLE & 0x7fu) == 0x00u )
{ {
for ( i = 0u; i < CanRXMsgOp.Total_Msg; i++ ) for ( i = 0u; i < CanRXMsgOp->Total_Msg; i++ )
{ {
if ( CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Received == 1u ) if ( CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Received == 1u )
{ {
CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Busy = 1u; CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Busy = 1u;
for ( j = 0u; j < 8u; j++ ) for ( j = 0u; j < 8u; j++ )
{ {
CanRXMsgOp.CAN_MSG_Analysis [ i ].AnalyzeMsg [ j ] = CanRXMsgOp.CAN_MSG_Analysis [ i ].ReceiveBuf [ j ]; CanRXMsgOp->CAN_MSG_Analysis [ i ].AnalyzeMsg [ j ] = CanRXMsgOp->CAN_MSG_Analysis [ i ].ReceiveBuf [ j ];
} }
CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Busy = 0u; CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Busy = 0u;
CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Received = 0u; CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Received = 0u;
CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Lost = 0u; CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Lost = 0u;
CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Status = 0u; CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Status = 0u;
if ( CanRXMsgOp.pAttrubute [ i ].Msg_ProcessCBK != (( void * )0) ) if ( CanRXMsgOp->pAttrubute [ i ].Msg_ProcessCBK != (( void * )0) )
{ {
CanRXMsgOp.pAttrubute [ i ].Msg_ProcessCBK(CanRXMsgOp.CAN_MSG_Analysis [ i ].AnalyzeMsg); CanRXMsgOp->pAttrubute [ i ].Msg_ProcessCBK(CanRXMsgOp->CAN_MSG_Analysis [ i ].AnalyzeMsg);
} }
} }
if ( CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Lost <= 0xFFFFFF00UL )
{
CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Lost += CbkCycle;
if ( (CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Lost >= CanRXMsgOp.pAttrubute [ i ].MSG_TIMEOUT_VAL) && (CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Status != 0x55U) ) if ( (CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Lost >= CanRXMsgOp->pAttrubute [ i ].MSG_TimeOut_Val) && (CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Status != 0x55U) )
{ {
CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Status = 0x55U; CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Status = 0x55U;
for ( j = 0u; j < 8u; j++ ) for ( j = 0u; j < 8u; j++ )
{ {
CanRXMsgOp.CAN_MSG_Analysis [ i ].AnalyzeMsg [ j ] &= CanRXMsgOp.pAttrubute [ i ].MASK_Array [ j ]; CanRXMsgOp->CAN_MSG_Analysis [ i ].AnalyzeMsg [ j ] &= CanRXMsgOp->pAttrubute [ i ].Mask_Array [ j ];
CanRXMsgOp.CAN_MSG_Analysis [ i ].AnalyzeMsg [ j ] |= CanRXMsgOp.pAttrubute [ i ].TIMEOUT_Array [ j ]; CanRXMsgOp->CAN_MSG_Analysis [ i ].AnalyzeMsg [ j ] |= CanRXMsgOp->pAttrubute [ i ].TimeOut_Array [ j ];
} }
if ( CanRXMsgOp.pAttrubute [ i ].Msg_LOSTCBK != (( void * )0) ) if ( CanRXMsgOp->pAttrubute [ i ].Msg_LostCBK != (( void * )0) )
{ {
CanRXMsgOp.pAttrubute [ i ].Msg_LOSTCBK(CanRXMsgOp.CAN_MSG_Analysis [ i ].AnalyzeMsg); CanRXMsgOp->pAttrubute [ i ].Msg_LostCBK(CanRXMsgOp->CAN_MSG_Analysis [ i ].AnalyzeMsg);
} }
} }
else else
{ {
if ( CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Lost < CanRXMsgOp.pAttrubute [ i ].MSG_TIMEOUT_VAL ) /* if ( CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Lost < CanRXMsgOp->pAttrubute [ i ].MSG_TimeOut_Val )
{ {
CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Lost += CbkCycle; CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Lost += CbkCycle;
} */
} }
} }
} }
} }
} }
/**
void Co_Can_Buff_Set(canlib_uint16_t MsgID, canlib_uint8_t m_DLC, canlib_uint8_t Msg []) * @brief CAN报文接收函数,放在接收中断内
* @param[in] CanRXMsgOp 报文接收操作对象指针, 每路can都应有独立的结构体指针
* @param[in] MsgID 报文索引序号,非ID,配合ID转换函数使用.
* @param[in] m_DLC 报文长度,默认填8
* @param[in] Msg 报文数据buffer.
* @warning 不可直接传入ID.
*
* 示例
@code
Co_Can_Buff_Set(&CAN_CH0_CanMsgOp,Co_Can_ConvertSubID_CAN_CH0(m_id), m_dlc, m_Msg);
@endcode
*
* @since 1.0.0
*/
void Co_Can_Buff_Set(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t MsgID, canlib_uint8_t m_DLC, canlib_uint8_t Msg [])
{ {
canlib_uint8_t i; canlib_uint8_t i;
canlib_uint16_t u16ConverIdx; canlib_uint16_t u16ConverIdx;
u16ConverIdx = MsgID; u16ConverIdx = MsgID;
if ( u16ConverIdx < CanRXMsgOp.Total_Msg ) if ( u16ConverIdx < CanRXMsgOp->Total_Msg )
{ {
if ( CanRXMsgOp.CAN_MSG_Analysis [ u16ConverIdx ].CAN_Busy == 0u ) if ( CanRXMsgOp->CAN_MSG_Analysis [ u16ConverIdx ].CAN_Busy == 0u )
{ {
for ( i = 0u; i < 8u; i++ ) for ( i = 0u; i < 8u; i++ )
{ {
CanRXMsgOp.CAN_MSG_Analysis [ u16ConverIdx ].ReceiveBuf [ i ] = Msg [ i ]; CanRXMsgOp->CAN_MSG_Analysis [ u16ConverIdx ].ReceiveBuf [ i ] = Msg [ i ];
} }
CanRXMsgOp.CAN_MSG_Analysis [ u16ConverIdx ].CAN_Received = 1u; CanRXMsgOp->CAN_MSG_Analysis [ u16ConverIdx ].CAN_Received = 1u;
if ( CanRXMsgOp.pAttrubute [ u16ConverIdx ].Msg_ReceiveCBK != (( void * )0) ) if ( CanRXMsgOp->pAttrubute [ u16ConverIdx ].Msg_ReceiveCBK != (( void * )0) )
{ {
CanRXMsgOp.pAttrubute [ u16ConverIdx ].Msg_ReceiveCBK(CanRXMsgOp.CAN_MSG_Analysis [ u16ConverIdx ].ReceiveBuf); CanRXMsgOp->pAttrubute [ u16ConverIdx ].Msg_ReceiveCBK(CanRXMsgOp->CAN_MSG_Analysis [ u16ConverIdx ].ReceiveBuf);
} }
} }
} }
} }
/**
canlib_uint8_t CAN_MSG_Read(canlib_uint16_t MsgIdx, canlib_uint8_t BuffIdx) * @brief CAN报文buffer数据读取
* @param[in] CanRXMsgOp 报文接收操作对象指针, 每路can都应有独立的结构体指针
* @param[in] MsgIdx 报文索引序号,非ID,使用枚举的内容.
* @param[in] BuffIdx 报文数组索引0-7
* @warning 内部使用,外部不使用
*
* 示例
@code
canlib_uint8_t Ret = CAN_MSG_Read(&CAN_CH0_CanMsgOp , 10u, 5u);
@endcode
*
* @since 1.0.0
*/
canlib_uint8_t CAN_MSG_Read(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t MsgIdx, canlib_uint8_t BuffIdx)
{ {
canlib_uint8_t ret = 0u; canlib_uint8_t ret = 0u;
if ( MsgIdx < CanRXMsgOp.Total_Msg ) if ( MsgIdx < CanRXMsgOp->Total_Msg )
{ {
if ( BuffIdx < 8u ) if ( BuffIdx < 8u )
{ {
ret = CanRXMsgOp.CAN_MSG_Analysis [ MsgIdx ].AnalyzeMsg [ BuffIdx ]; ret = CanRXMsgOp->CAN_MSG_Analysis [ MsgIdx ].AnalyzeMsg [ BuffIdx ];
} }
else else
{ {
...@@ -164,13 +275,28 @@ canlib_uint8_t CAN_MSG_Read(canlib_uint16_t MsgIdx, canlib_uint8_t BuffIdx) ...@@ -164,13 +275,28 @@ canlib_uint8_t CAN_MSG_Read(canlib_uint16_t MsgIdx, canlib_uint8_t BuffIdx)
} }
return ret; return ret;
} }
/**
canlib_uint8_t CAN_MSG_Status(canlib_uint16_t MsgID) * @brief CAN报文ID当前状态读取
* @param[in] CanRXMsgOp 报文接收操作对象指针, 每路can都应有独立的结构体指针
* @param[in] MsgID 报文索引序号,非ID,使用枚举的内容.
* @return 当前报文状态
* - 0x00 报文在线
* - 0x55 报文掉线
* @warning None
*
* 示例
@code
canlib_uint8_t Ret = CAN_MSG_Status(&CAN_CH0_CanMsgOp , 3u);
@endcode
*
* @since 1.0.0
*/
canlib_uint8_t CAN_MSG_Status(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t MsgID)
{ {
canlib_uint8_t ret; canlib_uint8_t ret;
if ( MsgID < CanRXMsgOp.Total_Msg ) if ( MsgID < CanRXMsgOp->Total_Msg )
{ {
ret = ( canlib_uint8_t )CanRXMsgOp.CAN_MSG_Analysis [ MsgID ].CAN_Status; ret = ( canlib_uint8_t )CanRXMsgOp->CAN_MSG_Analysis [ MsgID ].CAN_Status;
} }
else else
{ {
...@@ -178,37 +304,113 @@ canlib_uint8_t CAN_MSG_Status(canlib_uint16_t MsgID) ...@@ -178,37 +304,113 @@ canlib_uint8_t CAN_MSG_Status(canlib_uint16_t MsgID)
} }
return ret; return ret;
} }
/**
void Can_RX_ResetAllTimer(void) * @brief CAN报文接收模块复位所有掉线时间,重新计时
* @param[in] CanRXMsgOp 报文接收操作对象指针, 每路can都应有独立的结构体指针
* @warning None
*
* 示例
@code
Can_RX_ResetAllTimer(&CAN_CH0_CanMsgOp);
@endcode
*
* @since 1.0.0
*/
void Can_RX_ResetAllTimer(st_CanMsgOp *CanRXMsgOp)
{ {
canlib_uint16_t i; canlib_uint16_t i;
for ( i = 0u; i < CanRXMsgOp.Total_Msg; i++ ) for ( i = 0u; i < CanRXMsgOp->Total_Msg; i++ )
{ {
CanRXMsgOp.CAN_MSG_Analysis [ i ].CAN_Lost = 0U; CanRXMsgOp->CAN_MSG_Analysis [ i ].CAN_Lost = 0U;
} }
} }
/**
void Can_RX_ResetTimer(canlib_uint16_t idx) * @brief CAN报文接收模块复位所有掉线时间,重新计时
* @param[in] CanRXMsgOp 报文接收操作对象指针, 每路can都应有独立的结构体指针
* @param[in] idx 报文索引序号,非ID,使用枚举的内容.
* @warning None
*
* 示例
@code
Can_RX_ResetTimer(&CAN_CH0_CanMsgOp,9u);
@endcode
*
* @since 1.0.0
*/
void Can_RX_ResetTimer(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t idx)
{ {
if ( idx < CanRXMsgOp.Total_Msg ) if ( idx < CanRXMsgOp->Total_Msg )
{ {
CanRXMsgOp.CAN_MSG_Analysis [ idx ].CAN_Lost = 0U; CanRXMsgOp->CAN_MSG_Analysis [ idx ].CAN_Lost = 0U;
} }
} }
/**
canlib_uint32_t Read_CAN_RX_Version(void) * @brief CAN报文接收模块,诊断控制
* @param[in] CanRXMsgOp 报文接收操作对象指针, 每路can都应有独立的结构体指针
* @param[in] RX_enable 模块控制状态
* - 0x00 报文接收使能
* - 0x55 报文接收关闭
* @warning None
*
* 示例
@code
CAN_RX_DiagCtrlEnable(&CAN_CH0_CanMsgOp,0x00u);
@endcode
*
* @since 1.0.0
*/
void CAN_RX_DiagCtrlEnable(st_CanMsgOp *CanRXMsgOp, CAN_RX_Status_t RX_enable)
{ {
return 0x0004U; CanRXMsgOp->u8CAN_RX_ENABLE = ( canlib_uint8_t )RX_enable;
CanRXMsgOp->u8CAN_RX_ENABLE |= 0x80u;
} }
/**
void CAN_RX_DiagCtrlEnable(canlib_uint8_t RX_enable) * @brief CAN报文接收模块,诊断控制释放
* @param[in] CanRXMsgOp 报文接收操作对象指针, 每路can都应有独立的结构体指针
* @warning None
*
* 示例
@code
CAN_RX_DiagCtrlRelease(&CAN_CH0_CanMsgOp);
@endcode
*
* @since 1.0.0
*/
void CAN_RX_DiagCtrlRelease(st_CanMsgOp *CanRXMsgOp)
{
CanRXMsgOp->u8CAN_RX_ENABLE &= ~(0x01u << 7);
}
/**
* @brief CAN报文接收模块版本读取
* @warning None
*
* 示例
@code
canlib_uint32_t Ver = Read_CAN_RX_Version();
@endcode
*
* @since 1.0.1
*/
canlib_uint32_t Read_CAN_RX_Version(void)
{ {
u8CAN_RX_ENABLE = RX_enable; return 0x0006UL;
u8CAN_RX_ENABLE |= 0x80u;
} }
void CAN_RX_DiagCtrlRelease(void) /**
* @brief CAN报文接收模块报文掉线时间戳
* @warning None
*
* 示例
@code
canlib_uint32_t CAN_ID_030 = CAN_RX_Get_TimeStamp(&CAN_CH0_CanMsgOp,3);
@endcode
*
* @since 1.0.1
*/
canlib_uint32_t CAN_RX_Get_TimeStamp(st_CanMsgOp *CanRXMsgOp, canlib_uint16_t MsgIdx)
{ {
u8CAN_RX_ENABLE &= ~(0x01u << 7); canlib_uint32_t Ret = 0UL;
Ret = CanRXMsgOp->CAN_MSG_Analysis [ MsgIdx ].CAN_Lost;
return Ret;
} }
#include "CAN_Lib.h" #include "CAN_Lib.h"
/**
* @file CAN_Signal_Tx.c
* @brief CAN发送文件
* @details CAN发送文件
* @author 赵建智
* @date 2022.04.25
* @version V1.0
* @copyright 赵建智
*/
typedef struct /**
{ * @brief CAN报文外发诊断控制
canlib_uint32_t u32MsgID; * @param[in] CanMsgTxOp 报文发送操作对象指针, 每路can都应有独立的结构体指针
canlib_uint32_t u32Timer; * @param[in] TX_enable 发送控制类型
canlib_uint32_t u32MsgCycle; * @ref CAN_N_TX_Enable 使能发送
canlib_uint32_t u32SendCnt; * @ref CAN_N_TX_Disable 禁止发送
canlib_uint8_t u8MsgSTD_EXT; * @warning 该接口只能由诊断调用.功能部分不可使用
canlib_uint8_t u8MsgPro; *
canlib_uint8_t u8TXMsgType; * 示例
canlib_uint8_t u8MsgRet; @code
canlib_uint8_t u8MsgBuff [ 8u ]; CAN_TX_DiagCtrlEnable(&CAN0_TX_Option,0x55);
canlib_uint16_t u16MsgDLC; @endcode
canlib_uint16_t u16TXMsgDIMcounter; *
} st_CAN_SendOperation; * @since 1.0.0
*/
typedef struct void CAN_TX_DiagCtrlEnable(st_CanMsgTxOp *CanMsgTxOp, CAN_TX_Status_t TX_enable)
{
const st_CAN_SendAttribute *pCAN_SendAttribute;
st_CAN_SendOperation * CanMsg;
canlib_uint16_t Total_Msg;
HAL_CAN_Send Can_Write;
} st_CanMsgTxOp;
st_CanMsgTxOp CanMsgTxOp;
canlib_uint8_t u8CAN_TX_ENABLE;
void CAN_TX_DiagCtrlEnable(canlib_uint8_t TX_enable)
{ {
u8CAN_TX_ENABLE = TX_enable; CanMsgTxOp->u8CAN_TX_ENABLE = TX_enable;
u8CAN_TX_ENABLE |= 0x80u; CanMsgTxOp->u8CAN_TX_ENABLE |= 0x80u;
} }
/**
void CAN_TX_DiagCtrlRelease(void) * @brief CAN报文外发诊断释放控制
* @param[in] CanMsgTxOp 报文发送操作对象指针, 每路can都应有独立的结构体指针
*
* @warning 该接口只能由诊断调用.功能部分不可使用
*
* 示例
@code
CAN_TX_DiagCtrlRelease(&CAN0_TX_Option);
@endcode
*
* @since 1.0.0
*/
void CAN_TX_DiagCtrlRelease(st_CanMsgTxOp *CanMsgTxOp)
{ {
u8CAN_TX_ENABLE &= ~(0x01u << 7); CanMsgTxOp->u8CAN_TX_ENABLE &= ~(0x01u << 7);
} }
/**
void CAN_TX_SetEnable(canlib_uint8_t TX_enable) * @brief CAN报文外发控制
* @param[in] CanMsgTxOp 报文发送操作对象指针, 每路can都应有独立的结构体指针
* @param[in] TX_enable 报文外发状态控制
* - CAN_N_TX_Enable 使能发送
* - CAN_N_TX_Disable 禁止发送
*
* @warning None
*
* 示例
@code
CAN_TX_SetEnable(&CAN0_TX_Option,CAN_N_TX_Enable);
@endcode
*
* @since 1.0.1
*/
void CAN_TX_SetEnable(st_CanMsgTxOp *CanMsgTxOp, CAN_TX_Status_t TX_enable)
{ {
if ( (u8CAN_TX_ENABLE & 0x80u) == 0x80u ) if ( (CanMsgTxOp->u8CAN_TX_ENABLE & 0x80u) == 0x80u )
{ {
} }
else else
{ {
u8CAN_TX_ENABLE = TX_enable; CanMsgTxOp->u8CAN_TX_ENABLE = ( canlib_uint8_t )TX_enable;
} }
} }
/**
canlib_uint8_t CAN_TX_ReadEnableSts(void) * @brief CAN报文外发状态读取
* @param[in] CanMsgTxOp 报文发送操作对象指针, 每路can都应有独立的结构体指针
* @return 当前CAN通道TX状态
* @ref 0X00U 禁止发送
* @ref 0X55U/0xD5 允许发送
* @warning NONE
*
* 示例
@code
CAN_TX_Status_t CAN_CH_TX_Sts = CAN_TX_ReadEnableSts(&CAN0_TX_Option);
@endcode
*
* @since 1.0.1
*/
CAN_TX_Status_t CAN_TX_ReadEnableSts(st_CanMsgTxOp *CanMsgTxOp)
{ {
return u8CAN_TX_ENABLE; return ( CAN_TX_Status_t )CanMsgTxOp->u8CAN_TX_ENABLE;
} }
/**
CAN_FUNC_ERR_t Can_TX_BuffInit(canlib_uint8_t *MemSpace, const st_CAN_SendAttribute *Array, canlib_uint16_t length, HAL_CAN_Send pfunc) * @brief CAN报文外发逻辑模块初始化
* @param[in] CanMsgTxOp 报文发送操作对象指针, 每路can都应有独立的结构体指针
* @param[in] Array 报文发送属性列表,按CAN通道区分,各自独立
* @param[in] length 发送报文总数量,按CAN通道区分,各自独立
* @param[in] pfunc 底层发送回调函数,每路can都应有独立的结构体指针
*
* @return 发送模块初始化结果
* - CAN_ERR_OK 初始化成功
* - CAN_ERR_ParaInit 初始化失败
*
* @warning 此函数必须先于CAN模块硬件驱动调用
*
* 示例
@code
#pragma alignvar(8)
uint32_t pTXBuff [ CAN_TX_MSG_Block * ID_TOTAL_MAX ];
void COM_CAN_Init(void)
{
memset(pTXBuff, 0, sizeof(pTXBuff));
CAN_CH0_CanMsgTxOp.CanMsg=pTXBuff;
CAN_FUNC_ERR_t CAN_CH_TX_Ret = Can_TX_BuffInit(&CAN0_TX_Option,CAN_CH0_CANSendAttr,CAN_CH0_ID_SEND_TOTAL,Can0_Write);
}
@endcode
*
* @since 1.0.0
*/
CAN_FUNC_ERR_t Can_TX_BuffInit(st_CanMsgTxOp *CanMsgTxOp, const st_CAN_SendAttribute *Array, canlib_uint16_t length, HAL_CAN_Send pfunc)
{ {
canlib_uint8_t i = 0u; canlib_uint8_t i = 0u;
canlib_uint8_t j = 0u; canlib_uint8_t j = 0u;
CAN_FUNC_ERR_t ret = CAN_ERR_OK; CAN_FUNC_ERR_t ret = CAN_ERR_OK;
CanMsgTxOp.pCAN_SendAttribute = Array; CanMsgTxOp->pCAN_SendAttribute = Array;
CanMsgTxOp.CanMsg = ( st_CAN_SendOperation * )(( void * )MemSpace); /* CanMsgTxOp->CanMsg = ( st_CAN_SendOperation *)(( void *)MemSpace); */
CanMsgTxOp.Total_Msg = length; CanMsgTxOp->Total_Msg = length;
CanMsgTxOp.Can_Write = pfunc; CanMsgTxOp->Can_Write = pfunc;
u8CAN_TX_ENABLE = 0X00U; CanMsgTxOp->u8CAN_TX_ENABLE = 0x00;//0X00U;
for ( i = 0u; i < CanMsgTxOp.Total_Msg; i++ ) for ( i = 0u; i < CanMsgTxOp->Total_Msg; i++ )
{ {
CanMsgTxOp.CanMsg [ i ].u32MsgID = CanMsgTxOp.pCAN_SendAttribute [ i ].u32MsgID; CanMsgTxOp->CanMsg [ i ].u32MsgID = CanMsgTxOp->pCAN_SendAttribute [ i ].u32MsgID;
CanMsgTxOp.CanMsg [ i ].u32Timer = CanMsgTxOp.pCAN_SendAttribute [ i ].u32MsgCycleOffset; CanMsgTxOp->CanMsg [ i ].u32Timer = CanMsgTxOp->pCAN_SendAttribute [ i ].u32MsgCycleOffset;
CanMsgTxOp.CanMsg [ i ].u32MsgCycle = CanMsgTxOp.pCAN_SendAttribute [ i ].u32MsgCycle; CanMsgTxOp->CanMsg [ i ].u32MsgCycle = CanMsgTxOp->pCAN_SendAttribute [ i ].u32MsgCycle;
CanMsgTxOp.CanMsg [ i ].u32SendCnt = CanMsgTxOp.pCAN_SendAttribute [ i ].u32InitSendCnt; CanMsgTxOp->CanMsg [ i ].u32SendCnt = CanMsgTxOp->pCAN_SendAttribute [ i ].u32InitSendCnt;
CanMsgTxOp.CanMsg [ i ].u8MsgSTD_EXT = CanMsgTxOp.pCAN_SendAttribute [ i ].u8MsgSTD_EXT; CanMsgTxOp->CanMsg [ i ].u8MsgSTD_EXT = CanMsgTxOp->pCAN_SendAttribute [ i ].u8MsgSTD_EXT;
CanMsgTxOp.CanMsg [ i ].u8MsgPro = CanMsgTxOp.pCAN_SendAttribute [ i ].u8MsgPro; CanMsgTxOp->CanMsg [ i ].u8MsgPro = CanMsgTxOp->pCAN_SendAttribute [ i ].u8MsgPro;
CanMsgTxOp.CanMsg [ i ].u16MsgDLC = CanMsgTxOp.pCAN_SendAttribute [ i ].u8MsgDLC; CanMsgTxOp->CanMsg [ i ].u16MsgDLC = CanMsgTxOp->pCAN_SendAttribute [ i ].u8MsgDLC;
CanMsgTxOp.CanMsg [ i ].u8TXMsgType = CanMsgTxOp.pCAN_SendAttribute [ i ].u8TXMsgType; CanMsgTxOp->CanMsg [ i ].u8TXMsgType = CanMsgTxOp->pCAN_SendAttribute [ i ].u8TXMsgType;
CanMsgTxOp.CanMsg [ i ].u8MsgRet = 0u; CanMsgTxOp->CanMsg [ i ].u8MsgRet = 0u;
/* /*
发送周期是 0表示纯事件型报文 DIM counter 需要是0 发送周期是 0表示纯事件型报文 DIM counter 需要是0
...@@ -81,26 +146,26 @@ CAN_FUNC_ERR_t Can_TX_BuffInit(canlib_uint8_t *MemSpace, const st_CAN_SendAttrib ...@@ -81,26 +146,26 @@ CAN_FUNC_ERR_t Can_TX_BuffInit(canlib_uint8_t *MemSpace, const st_CAN_SendAttrib
1.周期报文 DIM 无意义 初始化成0 1.周期报文 DIM 无意义 初始化成0
2.周期事件型 DIM 初始化成0xffff 2.周期事件型 DIM 初始化成0xffff
*/ */
if ( CanMsgTxOp.pCAN_SendAttribute [ i ].u32MsgCycle != 0ul ) if ( CanMsgTxOp->pCAN_SendAttribute [ i ].u32MsgCycle != 0ul )
{ {
if ( CanMsgTxOp.pCAN_SendAttribute [ i ].u8TXMsgType == 0u ) if ( CanMsgTxOp->pCAN_SendAttribute [ i ].u8TXMsgType == 0u )
{ {
CanMsgTxOp.CanMsg [ i ].u16TXMsgDIMcounter = 0xffffu; CanMsgTxOp->CanMsg [ i ].u16TXMsgDIMcounter = 0xffffu;
} }
else else
{ {
CanMsgTxOp.CanMsg [ i ].u16TXMsgDIMcounter = 0xffffu; CanMsgTxOp->CanMsg [ i ].u16TXMsgDIMcounter = 0xffffu;
} }
} }
else else
{ {
if ( CanMsgTxOp.pCAN_SendAttribute [ i ].u8TXMsgType != 0u ) if ( CanMsgTxOp->pCAN_SendAttribute [ i ].u8TXMsgType != 0u )
{ {
CanMsgTxOp.CanMsg [ i ].u16TXMsgDIMcounter = 0u; CanMsgTxOp->CanMsg [ i ].u16TXMsgDIMcounter = 0u;
} }
else else
{ {
CanMsgTxOp.CanMsg [ i ].u16TXMsgDIMcounter = 0u; CanMsgTxOp->CanMsg [ i ].u16TXMsgDIMcounter = 0u;
/*while (1u)*/ /*while (1u)*/
{ {
ret = CAN_ERR_ParaInit; ret = CAN_ERR_ParaInit;
...@@ -111,141 +176,155 @@ CAN_FUNC_ERR_t Can_TX_BuffInit(canlib_uint8_t *MemSpace, const st_CAN_SendAttrib ...@@ -111,141 +176,155 @@ CAN_FUNC_ERR_t Can_TX_BuffInit(canlib_uint8_t *MemSpace, const st_CAN_SendAttrib
} }
} }
for ( j = 0u; j < CanMsgTxOp.CanMsg [ i ].u16MsgDLC; j++ ) for ( j = 0u; j < CanMsgTxOp->CanMsg [ i ].u16MsgDLC; j++ )
{ {
CanMsgTxOp.CanMsg [ i ].u8MsgBuff [ j ] = 0u; CanMsgTxOp->CanMsg [ i ].u8MsgBuff [ j ] = 0u;
} }
if ( CanMsgTxOp.pCAN_SendAttribute [ i ].MsgBufferSet != (( void * )0) ) if ( CanMsgTxOp->pCAN_SendAttribute [ i ].MsgBufferSet != (( void * )0) )
{ {
CanMsgTxOp.pCAN_SendAttribute [ i ].MsgBufferSet(CanMsgTxOp.CanMsg [ i ].u8MsgBuff); CanMsgTxOp->pCAN_SendAttribute [ i ].MsgBufferSet(CanMsgTxOp->CanMsg [ i ].u8MsgBuff);
} }
} }
return ret; return ret;
} }
/**
void Can_Write_Fun(canlib_uint32_t u32CbkCycle) * @brief CAN报文外发逻辑
* @param[in] CanMsgTxOp 报文发送操作对象指针, 每路can都应有独立的结构体指针
* @param[in] u32CbkCycle 报文发送逻辑调用周期,单位us.
*
* @warning 此函数必须先于CAN模块硬件驱动调用
*
* 示例
@code
Can_Write_Fun(&CAN0_TX_Option,50u);
@endcode
*
* @since 1.0.0
*/
void Can_Write_Fun(st_CanMsgTxOp *CanMsgTxOp, canlib_uint32_t u32CbkCycle)
{ {
canlib_uint8_t i = 0u; canlib_uint8_t i = 0u;
canlib_uint8_t j = 0u; canlib_uint8_t j = 0u;
st_CAN_Msg m_Msg; st_CAN_Msg m_Msg;
if ( (u8CAN_TX_ENABLE & 0x7Fu) == 0X55U ) if ( (CanMsgTxOp->u8CAN_TX_ENABLE & 0x7Fu) == 0X55U )
{ {
for ( i = 0u; i < CanMsgTxOp.Total_Msg; i++ ) for ( i = 0u; i < CanMsgTxOp->Total_Msg; i++ )
{ {
if ( CanMsgTxOp.CanMsg [ i ].u8TXMsgType == 0u ) if ( CanMsgTxOp->CanMsg [ i ].u8TXMsgType == 0u )
{ {
if ( CanMsgTxOp.CanMsg [ i ].u32Timer < CanMsgTxOp.CanMsg [ i ].u32MsgCycle ) if ( CanMsgTxOp->CanMsg [ i ].u32Timer < CanMsgTxOp->CanMsg [ i ].u32MsgCycle )
{ {
CanMsgTxOp.CanMsg [ i ].u32Timer += u32CbkCycle; CanMsgTxOp->CanMsg [ i ].u32Timer += u32CbkCycle;
} }
else else
{ {
if ( CanMsgTxOp.CanMsg [ i ].u32SendCnt <= 0xffff0000ul ) if ( CanMsgTxOp->CanMsg [ i ].u32SendCnt <= 0xffff0000ul )
{ {
CanMsgTxOp.CanMsg [ i ].u32SendCnt++; CanMsgTxOp->CanMsg [ i ].u32SendCnt++;
} }
if ( CanMsgTxOp.CanMsg [ i ].u8MsgRet == 0U ) if ( CanMsgTxOp->CanMsg [ i ].u8MsgRet == 0U )
{ {
for ( j = 0u; j < CanMsgTxOp.CanMsg [ i ].u16MsgDLC; j++ ) for ( j = 0u; j < CanMsgTxOp->CanMsg [ i ].u16MsgDLC; j++ )
{ {
CanMsgTxOp.CanMsg [ i ].u8MsgBuff [ j ] = 0u; CanMsgTxOp->CanMsg [ i ].u8MsgBuff [ j ] = 0u;
} }
if ( CanMsgTxOp.pCAN_SendAttribute [ i ].MsgBufferSet != (( void * )0) ) if ( CanMsgTxOp->pCAN_SendAttribute [ i ].MsgBufferSet != (( void * )0) )
{ {
CanMsgTxOp.pCAN_SendAttribute [ i ].MsgBufferSet(CanMsgTxOp.CanMsg [ i ].u8MsgBuff); CanMsgTxOp->pCAN_SendAttribute [ i ].MsgBufferSet(CanMsgTxOp->CanMsg [ i ].u8MsgBuff);
} }
} }
/* Below HW SEND INTERFACE */ /* Below HW SEND INTERFACE */
m_Msg.MsgID = CanMsgTxOp.CanMsg [ i ].u32MsgID; m_Msg.MsgID = CanMsgTxOp->CanMsg [ i ].u32MsgID;
m_Msg.MsgStd = CanMsgTxOp.CanMsg [ i ].u8MsgSTD_EXT; m_Msg.MsgStd = CanMsgTxOp->CanMsg [ i ].u8MsgSTD_EXT;
m_Msg.MsgRTR = 0u; m_Msg.MsgRTR = 0u;
m_Msg.MsgDLC = ( canlib_uint8_t )CanMsgTxOp.CanMsg [ i ].u16MsgDLC; m_Msg.MsgDLC = ( canlib_uint8_t )CanMsgTxOp->CanMsg [ i ].u16MsgDLC;
m_Msg.MsgPro = CanMsgTxOp.CanMsg [ i ].u8MsgPro; m_Msg.MsgPro = CanMsgTxOp->CanMsg [ i ].u8MsgPro;
for ( j = 0u; j < CanMsgTxOp.CanMsg [ i ].u16MsgDLC; j++ ) for ( j = 0u; j < CanMsgTxOp->CanMsg [ i ].u16MsgDLC; j++ )
{ {
m_Msg.Msg [ j ] = Load_AttrBuff [ i ].sig.Msg [ j ]; m_Msg.Msg [ j ] = CanMsgTxOp->CanMsg [ i ].u8MsgBuff [ j ];
} }
if ( CanMsgTxOp.Can_Write != (( void * )0) ) if ( CanMsgTxOp->Can_Write != (( void * )0) )
{ {
CanMsgTxOp.CanMsg [ i ].u8MsgRet = CanMsgTxOp.Can_Write(&m_Msg); CanMsgTxOp->CanMsg [ i ].u8MsgRet = CanMsgTxOp->Can_Write(&m_Msg);
} }
if ( CanMsgTxOp.CanMsg [ i ].u8MsgRet == 0U ) if ( CanMsgTxOp->CanMsg [ i ].u8MsgRet == 0U )
{ {
CanMsgTxOp.CanMsg [ i ].u32Timer = 0u; CanMsgTxOp->CanMsg [ i ].u32Timer = 0u;
} }
else else
{ {
CanMsgTxOp.CanMsg [ i ].u32Timer -= u32CbkCycle; CanMsgTxOp->CanMsg [ i ].u32Timer -= u32CbkCycle;
} }
} }
} }
else else
{ {
if ( CanMsgTxOp.CanMsg [ i ].u32MsgCycle != 0x00ul ) if ( CanMsgTxOp->CanMsg [ i ].u32MsgCycle != 0x00ul )
{ {
if ( CanMsgTxOp.CanMsg [ i ].u16TXMsgDIMcounter != 0x00ul ) if ( CanMsgTxOp->CanMsg [ i ].u16TXMsgDIMcounter != 0x00ul )
{ {
if ( (CanMsgTxOp.CanMsg [ i ].u16TXMsgDIMcounter != CanMsgTxOp.CanMsg [ i ].u32SendCnt) || (CanMsgTxOp.CanMsg [ i ].u16TXMsgDIMcounter == 0xffffu) ) if ( (CanMsgTxOp->CanMsg [ i ].u16TXMsgDIMcounter != CanMsgTxOp->CanMsg [ i ].u32SendCnt) || (CanMsgTxOp->CanMsg [ i ].u16TXMsgDIMcounter == 0xffffu) )
{ {
if ( CanMsgTxOp.CanMsg [ i ].u32Timer < CanMsgTxOp.CanMsg [ i ].u32MsgCycle ) if ( CanMsgTxOp->CanMsg [ i ].u32Timer < CanMsgTxOp->CanMsg [ i ].u32MsgCycle )
{ {
CanMsgTxOp.CanMsg [ i ].u32Timer += u32CbkCycle; CanMsgTxOp->CanMsg [ i ].u32Timer += u32CbkCycle;
} }
else else
{ {
CanMsgTxOp.CanMsg [ i ].u32Timer = 0u; CanMsgTxOp->CanMsg [ i ].u32Timer = 0u;
if ( CanMsgTxOp.CanMsg [ i ].u32SendCnt <= 0xffff0000ul ) if ( CanMsgTxOp->CanMsg [ i ].u32SendCnt <= 0xffff0000ul )
{ {
CanMsgTxOp.CanMsg [ i ].u32SendCnt++; CanMsgTxOp->CanMsg [ i ].u32SendCnt++;
} }
for ( j = 0u; j < CanMsgTxOp.CanMsg [ i ].u16MsgDLC; j++ ) for ( j = 0u; j < CanMsgTxOp->CanMsg [ i ].u16MsgDLC; j++ )
{ {
CanMsgTxOp.CanMsg [ i ].u8MsgBuff [ j ] = 0u; CanMsgTxOp->CanMsg [ i ].u8MsgBuff [ j ] = 0u;
} }
if ( CanMsgTxOp.pCAN_SendAttribute [ i ].MsgBufferSet != (( void * )0) ) if ( CanMsgTxOp->pCAN_SendAttribute [ i ].MsgBufferSet != (( void * )0) )
{ {
CanMsgTxOp.pCAN_SendAttribute [ i ].MsgBufferSet(CanMsgTxOp.CanMsg [ i ].u8MsgBuff); CanMsgTxOp->pCAN_SendAttribute [ i ].MsgBufferSet(CanMsgTxOp->CanMsg [ i ].u8MsgBuff);
} }
/* Below HW SEND INTERFACE */ /* Below HW SEND INTERFACE */
m_Msg.MsgID = CanMsgTxOp.CanMsg [ i ].u32MsgID; m_Msg.MsgID = CanMsgTxOp->CanMsg [ i ].u32MsgID;
m_Msg.MsgStd = CanMsgTxOp.CanMsg [ i ].u8MsgSTD_EXT; m_Msg.MsgStd = CanMsgTxOp->CanMsg [ i ].u8MsgSTD_EXT;
m_Msg.MsgRTR = 0u; m_Msg.MsgRTR = 0u;
m_Msg.MsgDLC = ( canlib_uint8_t )CanMsgTxOp.CanMsg [ i ].u16MsgDLC; m_Msg.MsgDLC = ( canlib_uint8_t )CanMsgTxOp->CanMsg [ i ].u16MsgDLC;
m_Msg.MsgPro = CanMsgTxOp.CanMsg [ i ].u8MsgPro; m_Msg.MsgPro = CanMsgTxOp->CanMsg [ i ].u8MsgPro;
for ( j = 0u; j < CanMsgTxOp.CanMsg [ i ].u16MsgDLC; j++ ) for ( j = 0u; j < CanMsgTxOp->CanMsg [ i ].u16MsgDLC; j++ )
{ {
m_Msg.Msg [ j ] = CanMsgTxOp.CanMsg [ i ].u8MsgBuff [ j ]; m_Msg.Msg [ j ] = CanMsgTxOp->CanMsg [ i ].u8MsgBuff [ j ];
} }
if ( CanMsgTxOp.Can_Write != (( void * )0) ) if ( CanMsgTxOp->Can_Write != (( void * )0) )
{ {
CanMsgTxOp.CanMsg [ i ].u8MsgRet = CanMsgTxOp.Can_Write(&m_Msg); CanMsgTxOp->CanMsg [ i ].u8MsgRet = CanMsgTxOp->Can_Write(&m_Msg);
} }
if ( CanMsgTxOp.CanMsg [ i ].u8MsgRet == 0U ) if ( CanMsgTxOp->CanMsg [ i ].u8MsgRet == 0U )
{ {
CanMsgTxOp.CanMsg [ i ].u32Timer = 0u; CanMsgTxOp->CanMsg [ i ].u32Timer = 0u;
} }
else else
{ {
CanMsgTxOp.CanMsg [ i ].u32Timer -= u32CbkCycle; CanMsgTxOp->CanMsg [ i ].u32Timer -= u32CbkCycle;
} }
} }
} }
else else
{ {
if ( CanMsgTxOp.pCAN_SendAttribute [ i ].u32MsgCycle != 0ul ) if ( CanMsgTxOp->pCAN_SendAttribute [ i ].u32MsgCycle != 0ul )
{ {
CanMsgTxOp.CanMsg [ i ].u16TXMsgDIMcounter = 0xffffu; CanMsgTxOp->CanMsg [ i ].u16TXMsgDIMcounter = 0xffffu;
CanMsgTxOp->CanMsg [ i ].u32MsgCycle = CanMsgTxOp->pCAN_SendAttribute [ i ].u32MsgCycle;
} }
else else
{ {
CanMsgTxOp.CanMsg [ i ].u16TXMsgDIMcounter = 0u; CanMsgTxOp->CanMsg [ i ].u16TXMsgDIMcounter = 0u;
CanMsgTxOp.CanMsg [ i ].u32MsgCycle = 0ul; CanMsgTxOp->CanMsg [ i ].u32MsgCycle = 0ul;
} }
CanMsgTxOp.CanMsg [ i ].u32SendCnt = 0ul; CanMsgTxOp->CanMsg [ i ].u32SendCnt = 0ul;
} }
} }
} }
...@@ -254,23 +333,36 @@ void Can_Write_Fun(canlib_uint32_t u32CbkCycle) ...@@ -254,23 +333,36 @@ void Can_Write_Fun(canlib_uint32_t u32CbkCycle)
} }
} }
/* /**
u32TxMsgCycle * @brief CAN报文修改外发属性,重点针对周期事件型,变周期
* @param[in] CanMsgTxOp 报文发送操作对象指针, 每路can都应有独立的结构体指针
ret = 0 success * @param[in] u32TxMsgIdx 要修改的报文序号,非报文ID,枚举里的ID名
ret = 1 wrong attribute * @param[in] u16TxMSgDIMcounter 要改变周期发多少帧
ret = 2 request out of range * @param[in] u32TxMsgCycle 期望改成多少周期
*/ * @return 当前CAN通道TX状态
CAN_FUNC_ERR_t Can_Msg_Tx_Overwrite(canlib_uint32_t u32TxMsgIdx, canlib_uint16_t u16TxMSgDIMcounter, canlib_uint32_t u32TxMsgCycle) * @ref CAN_ERR_OK 设置正确
* @ref CAN_ERR_ParaInit 设置类型不正确,
* @ref CAN_ERR_OUTRANGE 参数色值超限
* @warning 此函数改一次调用一次,持续调用就发不出去了
*
* 示例
@code
//3号报文,以1ms周期发5帧,之后恢复到表格里默认的设置
CAN_FUNC_ERR_t CAN_Ret=Can_Msg_Tx_Overwrite(&CAN0_TX_Option,3u,5u,1000u);
@endcode
*
* @since 1.0.0
*/
CAN_FUNC_ERR_t Can_Msg_Tx_Overwrite(st_CanMsgTxOp *CanMsgTxOp, canlib_uint32_t u32TxMsgIdx, canlib_uint16_t u16TxMSgDIMcounter, canlib_uint32_t u32TxMsgCycle)
{ {
CAN_FUNC_ERR_t Ret = CAN_ERR_OK; CAN_FUNC_ERR_t Ret = CAN_ERR_OK;
if ( u32TxMsgIdx < CanMsgTxOp.Total_Msg ) if ( u32TxMsgIdx < CanMsgTxOp->Total_Msg )
{ {
if ( CanMsgTxOp.CanMsg [ u32TxMsgIdx ].u8TXMsgType != 0u ) if ( CanMsgTxOp->CanMsg [ u32TxMsgIdx ].u8TXMsgType != 0u )
{ {
CanMsgTxOp.CanMsg [ u32TxMsgIdx ].u16TXMsgDIMcounter = u16TxMSgDIMcounter; CanMsgTxOp->CanMsg [ u32TxMsgIdx ].u16TXMsgDIMcounter = u16TxMSgDIMcounter;
CanMsgTxOp.CanMsg [ u32TxMsgIdx ].u32MsgCycle = u32TxMsgCycle; CanMsgTxOp->CanMsg [ u32TxMsgIdx ].u32MsgCycle = u32TxMsgCycle;
CanMsgTxOp.CanMsg [ u32TxMsgIdx ].u32SendCnt = 0ul; CanMsgTxOp->CanMsg [ u32TxMsgIdx ].u32SendCnt = 0ul;
} }
else else
{ {
...@@ -283,13 +375,30 @@ CAN_FUNC_ERR_t Can_Msg_Tx_Overwrite(canlib_uint32_t u32TxMsgIdx, canlib_uint16_t ...@@ -283,13 +375,30 @@ CAN_FUNC_ERR_t Can_Msg_Tx_Overwrite(canlib_uint32_t u32TxMsgIdx, canlib_uint16_t
} }
return Ret; return Ret;
} }
/**
CAN_FUNC_ERR_t Can_Msg_TX_FastInitCycle(canlib_uint32_t u32TxMsgIdx, canlib_uint32_t CurTimerCnt) * @brief CAN报文修改指定外发报文定时器
* @param[in] CanMsgTxOp 报文发送操作对象指针, 每路can都应有独立的结构体指针
* @param[in] u32TxMsgIdx 要修改的报文序号,非报文ID,枚举里的ID名.
* @param[in] CurTimerCnt 当前ID的外发计时值.
* @return 当前输入参数是否正确
* @ref CAN_ERR_OK 设置正确
* @ref CAN_ERR_OUTRANGE 参数色值超限
* @warning 此函数改一次调用一次,持续调用就发不出去了
*
* 示例
@code
//3号报文,当前外发计时变更为50 000 us
CAN_FUNC_ERR_t CAN_Ret=Can_Msg_TX_FastInitCycle(&CAN0_TX_Option,3u,50000ul);
@endcode
*
* @since 1.0.0
*/
CAN_FUNC_ERR_t Can_Msg_TX_FastInitCycle(st_CanMsgTxOp *CanMsgTxOp, canlib_uint32_t u32TxMsgIdx, canlib_uint32_t CurTimerCnt)
{ {
CAN_FUNC_ERR_t Ret = CAN_ERR_OK; CAN_FUNC_ERR_t Ret = CAN_ERR_OK;
if ( u32TxMsgIdx < CanMsgTxOp.Total_Msg ) if ( u32TxMsgIdx < CanMsgTxOp->Total_Msg )
{ {
CanMsgTxOp.CanMsg [ u32TxMsgIdx ].u32Timer = CurTimerCnt; CanMsgTxOp->CanMsg [ u32TxMsgIdx ].u32Timer = CurTimerCnt;
} }
else else
{ {
...@@ -297,19 +406,51 @@ CAN_FUNC_ERR_t Can_Msg_TX_FastInitCycle(canlib_uint32_t u32TxMsgIdx, canlib_uint ...@@ -297,19 +406,51 @@ CAN_FUNC_ERR_t Can_Msg_TX_FastInitCycle(canlib_uint32_t u32TxMsgIdx, canlib_uint
} }
return Ret; return Ret;
} }
/**
void Can_Msg_TX_SUCCESS(canlib_uint32_t u32TxMsgIdx) * @brief CAN报文发送成功确认
* @param[in] CanMsgTxOp 报文发送操作对象指针, 每路can都应有独立的结构体指针
* @param[in] u32TxMsgIdx 要修改的报文序号,非报文ID,枚举里的ID名
* @warning 此函数需要对应buff发送成功时调用
*
* 示例
@code
Can_Msg_TX_SUCCESS(&CAN0_TX_Option,3u);
@endcode
*
* @since 1.0.0
*/
void Can_Msg_TX_SUCCESS(st_CanMsgTxOp *CanMsgTxOp, canlib_uint32_t u32TxMsgIdx)
{ {
if ( u32TxMsgIdx < CanMsgTxOp.Total_Msg ) if ( u32TxMsgIdx < CanMsgTxOp->Total_Msg )
{ {
if ( CanMsgTxOp.pCAN_SendAttribute [ u32TxMsgIdx ].MsgSuccess != (( void * )0) ) if ( CanMsgTxOp->pCAN_SendAttribute [ u32TxMsgIdx ].MsgSuccess != (( void * )0) )
{ {
CanMsgTxOp.pCAN_SendAttribute [ u32TxMsgIdx ].MsgSuccess( ); CanMsgTxOp->pCAN_SendAttribute [ u32TxMsgIdx ].MsgSuccess( );
} }
} }
} }
/**
* @brief CAN报文发送模块版本号
* @return CAN报文发送模块版本
* @warning NONE
* @since 1.0.0
*/
canlib_uint32_t Read_CAN_TX_Version(void) canlib_uint32_t Read_CAN_TX_Version(void)
{ {
return 0x0004u; return 0x0005uL;
} }
#if defined(__ICCARM__) /**< IAR ARM Compiler */
const char Cur_TX_Module_Version [] = {"TX_VER=V1.0.0"};
#elif defined(__ghs__) /**< Green Hills ARM Compiler */
const char Cur_TX_Module_Version [] = {"TX_VER=V1.0.0"};
#elif defined(__GNUC__) /**< GNU Compiler Collection */
const char Cur_TX_Module_Version [] = {"TX_VER=V1.0.0"};
#elif defined(__DCC__) /**< Wind River Diab Compiler */
const char Cur_TX_Module_Version [] = {"TX_VER=V1.0.0"};
#elif defined(__ARMCC_VERSION) /**< ARMC Compiler */
const char Cur_TX_Module_Version [] = {"TX_VER=V1.0.0"};
#elif defined(__HC12__) /**< Codewarrior Compiler */
const char Cur_TX_Module_Version [] = {"TX_VER=V1.0.0"};
#else /**< VScode */
const char Cur_TX_Module_Version [] = {"TX_VER=V1.0.0"};
#endif
\ No newline at end of file
#include "COM_CAN.h" #include "COM_CAN.h"
#include "TYW_stdint.h"
#include "CAN_Communication_Matrix.h" #include "CAN_Communication_Matrix.h"
#include "RTE_CAN.h" #include "RTE_CAN.h"
#include "TYW_stdint.h"
#include <string.h> #include <string.h>
#include "Check_Ctrl.h"
uint8_t SingleOrDouble_CAN = 0;
#pragma alignvar(8) #pragma alignvar(8)
uint32_t pRXBuff [ CAN_RX_MSG_Block * CAN_CH0_ID_TOTAL_MAX ]; uint32_t pRXBuff_CH4[CAN_RX_MSG_Block * CAN_CH4_ID_TOTAL_MAX];
#pragma alignvar(8)
static uint32_t pTXBuff [ CAN_TX_MSG_Block * 300 ];
#pragma alignvar(8) #pragma alignvar(8)
static st_CAN_SendAttribute Load_Attr [ 300 ] = {0}; uint32_t pTXBuff[CAN_TX_MSG_Block * CAN_CH4_ID_SEND_TOTAL];
st_CAN_MsgBuff Load_AttrBuff [ 300 ] = {0};
typedef struct
{
uint32_t Subaddr;
uint32_t SubStep;
} st_AutoCheckAttr;
typedef union _word_split
{
uint32_t word;
uint8_t byte [ 4 ];
} WORD_SPLIT_u;
typedef struct
{
WORD_SPLIT_u total_msg;
WORD_SPLIT_u total_step;
WORD_SPLIT_u total_msg_begin;
WORD_SPLIT_u total_step_begin;
WORD_SPLIT_u sub_step_addr;
uint32_t res2;
uint32_t res3;
uint32_t crc_result;
} st_CheckMessage; uint8_t COM_APP_Process(st_CAN_Msg *Msg);
st_CheckMessage *PreLoad_Info;
#define FIX_LOAD_ADDRESS 0x50000
st_AutoCheckAttr Sub_Attr [ 200 ] = {0};
uint32_t g_Verify_Result;
#define MAKE_U32(high, mid1, mid0, low) ((( uint8_t )(low)) | ((( uint8_t )(mid0)) << 8) | ((( uint8_t )(mid1)) << 16) | ((( uint8_t )(high)) << 24))
void Execute_Specify_Step(uint32_t step);
float double0;
float double1;
float double2;
float double3;
void COM_CAN_Init(void) void COM_CAN_Init(void)
{ {
/*CAN APP BUFFER INIT*/ /*CAN APP BUFFER INIT*/
memset(pRXBuff_CH4, 0, sizeof(pRXBuff_CH4));
CAN_CH4_CanMsgOp.CAN_MSG_Analysis = pRXBuff_CH4;
Can_RX_BuffInit(&CAN_CH4_CanMsgOp, CAN_CH4_CAN_MSG_CONST_ARRAY, CAN_CH4_ID_TOTAL_MAX);
memset(pRXBuff, 0, sizeof(pRXBuff));
memset(pTXBuff, 0, sizeof(pTXBuff)); memset(pTXBuff, 0, sizeof(pTXBuff));
memset(Load_AttrBuff, 0, sizeof(Load_AttrBuff)); CAN_CH4_CanMsgTxOp.CanMsg = pTXBuff;
memset(Load_Attr, 0, sizeof(Load_Attr)); Can_TX_BuffInit(&CAN_CH4_CanMsgTxOp, CAN_CH4_CANSendAttr, CAN_CH4_ID_SEND_TOTAL, COM_APP_Process);
g_Verify_Result = 0;
Msg_Load_Init( );
Can_RX_BuffInit(( uint8_t * )pRXBuff, CAN_MSG_CONST_ARRAY, CAN_CH0_ID_TOTAL_MAX);
if ( g_Verify_Result == 1U )
{
Can_TX_BuffInit(( uint8_t * )pTXBuff, Load_Attr, PreLoad_Info->total_msg.word, Can_Write_FIFO);
}
CAN_RX_SetEnable(0x00);
if ( g_Verify_Result == 1U )
{
CAN_TX_SetEnable(0x55);
Execute_Specify_Step(0);
}
}
void COM_RX_Process(void)
{
CanMSg_XMS_Analysis(5u);
}
void Msg_Load_Init(void)
{
uint32_t i = 0u;
uint32_t *addr;
uint32_t Total_Msg;
uint32_t Total_Msg_addr;
PreLoad_Info = ( uint32_t *)FIX_LOAD_ADDRESS;
g_Verify_Result = Check_Infordata_CRC_32(&PreLoad_Info->total_msg, 28);
if ( g_Verify_Result == 1U )
{
Total_Msg = PreLoad_Info->total_msg.word;
Total_Msg_addr = PreLoad_Info->total_msg_begin.word;
addr = ( uint32_t *)Total_Msg_addr;
for ( i = 0; i < Total_Msg; i++ )
{
Load_Attr [ i ].u32MsgID = (*(addr + i * 4)); // convert_0;
Load_Attr [ i ].u32MsgCycle = (*(addr + 1 + i * 4)); // convert_1;
Load_Attr [ i ].u8MsgPro = (*(addr + 2 + i * 4)); // convert_2;
Load_Attr [ i ].u8MsgDLC = (*(addr + 3 + i * 4)); // convert_3;
}
addr = ( uint32_t * )PreLoad_Info->sub_step_addr.word; CAN_RX_SetEnable(&CAN_CH4_CanMsgOp, CAN_N_RX_Enable);
for ( i = 0; i < PreLoad_Info->total_step.word; i++ ) CAN_TX_SetEnable(&CAN_CH4_CanMsgTxOp, CAN_N_TX_Enable);
{
Sub_Attr [ i ].Subaddr = (*(addr + 0 + i * 2));
Sub_Attr [ i ].SubStep = (*(addr + 1 + i * 2));
}
}
} }
void Execute_Specify_Step(uint32_t step) uint8_t COM_APP_Process(st_CAN_Msg *Msg)
{ {
Can_Write((_CAN_Msg *)Msg);
uint32_t i = 0u; return 0u;
uint32_t j = 0u;
uint32_t *addr;
uint32_t buff_idx;
uint32_t buff_id;
uint8_t *pbuff;
if ( g_Verify_Result == 1U )
{
if ( step < PreLoad_Info->total_step.word )
{
addr = ( uint32_t * )Sub_Attr [ step ].Subaddr;
for ( i = 0; i < Sub_Attr [ step ].SubStep; i++ )
{
buff_idx = *(addr + 1 + i * 4);
pbuff = ( void *)(Sub_Attr [ step ].Subaddr + 8 + i * 16);
for ( j = 0; j < 8; j++ )
{
Load_AttrBuff [ buff_idx ].sig.Msg [ j ] = pbuff [ j ];
}
}
}
//if ( step == 4 )
//{
// addr = ( uint32_t * )Sub_Attr [ step ].Subaddr;
//
// for ( i = 0; i < Sub_Attr [ step ].SubStep; i++ )
// {
// buff_idx = *(addr + 1 + i * 4);
// pbuff = SW_Version;
//
// for ( j = 0; j < 8; j++ )
// {
// Load_AttrBuff [ buff_idx ].sig.Msg [ j ] = pbuff [ j];
// }
// }
//
//}
}
} }
const uint32_t CRC32_Table [ 256 ] = { void COM_TX_Process(void)
0x00000000ul, 0x77073096ul, 0xEE0E612Cul, 0x990951BAul,
0x076DC419ul, 0x706AF48Ful, 0xE963A535ul, 0x9E6495A3ul,
0x0EDB8832ul, 0x79DCB8A4ul, 0xE0D5E91Eul, 0x97D2D988ul,
0x09B64C2Bul, 0x7EB17CBDul, 0xE7B82D07ul, 0x90BF1D91ul,
0x1DB71064ul, 0x6AB020F2ul, 0xF3B97148ul, 0x84BE41DEul,
0x1ADAD47Dul, 0x6DDDE4EBul, 0xF4D4B551ul, 0x83D385C7ul,
0x136C9856ul, 0x646BA8C0ul, 0xFD62F97Aul, 0x8A65C9ECul,
0x14015C4Ful, 0x63066CD9ul, 0xFA0F3D63ul, 0x8D080DF5ul,
0x3B6E20C8ul, 0x4C69105Eul, 0xD56041E4ul, 0xA2677172ul,
0x3C03E4D1ul, 0x4B04D447ul, 0xD20D85FDul, 0xA50AB56Bul,
0x35B5A8FAul, 0x42B2986Cul, 0xDBBBC9D6ul, 0xACBCF940ul,
0x32D86CE3ul, 0x45DF5C75ul, 0xDCD60DCFul, 0xABD13D59ul,
0x26D930ACul, 0x51DE003Aul, 0xC8D75180ul, 0xBFD06116ul,
0x21B4F4B5ul, 0x56B3C423ul, 0xCFBA9599ul, 0xB8BDA50Ful,
0x2802B89Eul, 0x5F058808ul, 0xC60CD9B2ul, 0xB10BE924ul,
0x2F6F7C87ul, 0x58684C11ul, 0xC1611DABul, 0xB6662D3Dul,
0x76DC4190ul, 0x01DB7106ul, 0x98D220BCul, 0xEFD5102Aul,
0x71B18589ul, 0x06B6B51Ful, 0x9FBFE4A5ul, 0xE8B8D433ul,
0x7807C9A2ul, 0x0F00F934ul, 0x9609A88Eul, 0xE10E9818ul,
0x7F6A0DBBul, 0x086D3D2Dul, 0x91646C97ul, 0xE6635C01ul,
0x6B6B51F4ul, 0x1C6C6162ul, 0x856530D8ul, 0xF262004Eul,
0x6C0695EDul, 0x1B01A57Bul, 0x8208F4C1ul, 0xF50FC457ul,
0x65B0D9C6ul, 0x12B7E950ul, 0x8BBEB8EAul, 0xFCB9887Cul,
0x62DD1DDFul, 0x15DA2D49ul, 0x8CD37CF3ul, 0xFBD44C65ul,
0x4DB26158ul, 0x3AB551CEul, 0xA3BC0074ul, 0xD4BB30E2ul,
0x4ADFA541ul, 0x3DD895D7ul, 0xA4D1C46Dul, 0xD3D6F4FBul,
0x4369E96Aul, 0x346ED9FCul, 0xAD678846ul, 0xDA60B8D0ul,
0x44042D73ul, 0x33031DE5ul, 0xAA0A4C5Ful, 0xDD0D7CC9ul,
0x5005713Cul, 0x270241AAul, 0xBE0B1010ul, 0xC90C2086ul,
0x5768B525ul, 0x206F85B3ul, 0xB966D409ul, 0xCE61E49Ful,
0x5EDEF90Eul, 0x29D9C998ul, 0xB0D09822ul, 0xC7D7A8B4ul,
0x59B33D17ul, 0x2EB40D81ul, 0xB7BD5C3Bul, 0xC0BA6CADul,
0xEDB88320ul, 0x9ABFB3B6ul, 0x03B6E20Cul, 0x74B1D29Aul,
0xEAD54739ul, 0x9DD277AFul, 0x04DB2615ul, 0x73DC1683ul,
0xE3630B12ul, 0x94643B84ul, 0x0D6D6A3Eul, 0x7A6A5AA8ul,
0xE40ECF0Bul, 0x9309FF9Dul, 0x0A00AE27ul, 0x7D079EB1ul,
0xF00F9344ul, 0x8708A3D2ul, 0x1E01F268ul, 0x6906C2FEul,
0xF762575Dul, 0x806567CBul, 0x196C3671ul, 0x6E6B06E7ul,
0xFED41B76ul, 0x89D32BE0ul, 0x10DA7A5Aul, 0x67DD4ACCul,
0xF9B9DF6Ful, 0x8EBEEFF9ul, 0x17B7BE43ul, 0x60B08ED5ul,
0xD6D6A3E8ul, 0xA1D1937Eul, 0x38D8C2C4ul, 0x4FDFF252ul,
0xD1BB67F1ul, 0xA6BC5767ul, 0x3FB506DDul, 0x48B2364Bul,
0xD80D2BDAul, 0xAF0A1B4Cul, 0x36034AF6ul, 0x41047A60ul,
0xDF60EFC3ul, 0xA867DF55ul, 0x316E8EEFul, 0x4669BE79ul,
0xCB61B38Cul, 0xBC66831Aul, 0x256FD2A0ul, 0x5268E236ul,
0xCC0C7795ul, 0xBB0B4703ul, 0x220216B9ul, 0x5505262Ful,
0xC5BA3BBEul, 0xB2BD0B28ul, 0x2BB45A92ul, 0x5CB36A04ul,
0xC2D7FFA7ul, 0xB5D0CF31ul, 0x2CD99E8Bul, 0x5BDEAE1Dul,
0x9B64C2B0ul, 0xEC63F226ul, 0x756AA39Cul, 0x026D930Aul,
0x9C0906A9ul, 0xEB0E363Ful, 0x72076785ul, 0x05005713ul,
0x95BF4A82ul, 0xE2B87A14ul, 0x7BB12BAEul, 0x0CB61B38ul,
0x92D28E9Bul, 0xE5D5BE0Dul, 0x7CDCEFB7ul, 0x0BDBDF21ul,
0x86D3D2D4ul, 0xF1D4E242ul, 0x68DDB3F8ul, 0x1FDA836Eul,
0x81BE16CDul, 0xF6B9265Bul, 0x6FB077E1ul, 0x18B74777ul,
0x88085AE6ul, 0xFF0F6A70ul, 0x66063BCAul, 0x11010B5Cul,
0x8F659EFFul, 0xF862AE69ul, 0x616BFFD3ul, 0x166CCF45ul,
0xA00AE278ul, 0xD70DD2EEul, 0x4E048354ul, 0x3903B3C2ul,
0xA7672661ul, 0xD06016F7ul, 0x4969474Dul, 0x3E6E77DBul,
0xAED16A4Aul, 0xD9D65ADCul, 0x40DF0B66ul, 0x37D83BF0ul,
0xA9BCAE53ul, 0xDEBB9EC5ul, 0x47B2CF7Ful, 0x30B5FFE9ul,
0xBDBDF21Cul, 0xCABAC28Aul, 0x53B39330ul, 0x24B4A3A6ul,
0xBAD03605ul, 0xCDD70693ul, 0x54DE5729ul, 0x23D967BFul,
0xB3667A2Eul, 0xC4614AB8ul, 0x5D681B02ul, 0x2A6F2B94ul,
0xB40BBE37ul, 0xC30C8EA1ul, 0x5A05DF1Bul, 0x2D02EF8Dul};
uint32_t Check_Infordata_CRC_32(uint8_t p [], uint32_t len)
{ {
uint8_t i; Can_Write_Fun(&CAN_CH4_CanMsgTxOp, 50000u);
uint32_t m32 = 0u;
uint32_t FlashCrcValue = 0xFFFFFFFF;
uint32_t result = 0;
if ( len < 0xff )
{
for ( i = 0; i < len; i++ )
{
FlashCrcValue = CRC32_Table [ (FlashCrcValue ^ p [ i ]) & 0xFF ] ^ ((FlashCrcValue >> 8) & 0x00ffffff);
}
FlashCrcValue ^= 0xffffffff;
}
m32 = ((( uint32_t )p [ i + 3 ] << 24) & 0xff000000) | ((( uint32_t )p [ i + 2 ] << 16) & 0x00ff0000) | ((( uint32_t )p [ i + 1 ] << 8) & 0x0000ff00) | ((( uint32_t )p [ i ]) & 0xff0000ff);
if ( (m32 == FlashCrcValue) && (FlashCrcValue != 0xFFFFFFFF) )
{
result = 1;
}
return result;
} }
uint32_t Get_Total_CheckStep(void) void COM_RX_Process(void)
{ {
uint32_t ret = 0; CanMSg_XMS_Analysis(&CAN_CH4_CanMsgOp, 5u);
if ( g_Verify_Result == 1U )
{
ret = PreLoad_Info->total_step.word;
}
else
{
ret = 0;
}
return ret;
} }
...@@ -3,9 +3,7 @@ ...@@ -3,9 +3,7 @@
void COM_CAN_Init(void); void COM_CAN_Init(void);
void COM_RX_Process(void); void COM_RX_Process(void);
void Msg_Load_Init(void); void COM_TX_Process(void);
extern void Execute_Specify_Step(unsigned int step);
unsigned int Check_Infordata_CRC_32(unsigned char p [], unsigned int len);
unsigned int Get_Total_CheckStep(void);
#endif #endif
\ No newline at end of file
...@@ -66,7 +66,6 @@ uint32_t Global_Session = 0; ...@@ -66,7 +66,6 @@ uint32_t Global_Session = 0;
uint32_t loc_Step; uint32_t loc_Step;
void Function_Check_Ctrl(uint32_t cmd);
void MENU_CHECK_STEP_ADD(void) void MENU_CHECK_STEP_ADD(void)
{ {
...@@ -202,147 +201,6 @@ void Diag_Info_Init(void) ...@@ -202,147 +201,6 @@ void Diag_Info_Init(void)
//memset(Voltage_UDS, 0xFF, sizeof(Voltage_UDS)); //memset(Voltage_UDS, 0xFF, sizeof(Voltage_UDS));
} }
uint8_t Type_Clear = 0;
extern uint8_t BCM_FLAG_2014 = 0;
uint32_t loc_Type = 0;
void Total_Check(void)
{
uint8_t erweima[64] ;
uint8_t cmperweima[34];
uint8_t yibiaoshuju[34];
loc_Type = Get_Display_Type( );
if ( Type_Clear != loc_Type )
{
Type_Clear = loc_Type;
Display_TFT_Clear();
}
// POWER_CTRL_KL30_Current = 0u;//静态电流电阻的远仪表端,永远接通总电源。B+~
BCM_FLAG_2014 = BCM_2014[1] & 0X40 ;
// loc_Type = 2;
switch ( loc_Type )
{
case 0:
// Buzzer_Init();
// Function_Check_Ctrl(1); //Excel表格发报文。硬线信号
//Buzzer_Warning();
// TFT_LCD_Draw_Bmp(200, 90+40, ( uint8_t * )gImage_dui12 );
// for(int i = 0;i<34;i++)
// {
// erweima[i] = barcode_Msg[i];
// }
memcpy(erweima,barcode_Msg,34);
erweima[34] = 0xFF;
General_Number_Disp(erweima, 3, 90);
break;
case 1:
// Buzzer_Warning();
memcpy(cmperweima,barcode_Msg1,34);
// for(int i =0;i<34;i++)
// {
// cmperweima[i] = barcode_Msg1[i];
// }
cmperweima[34] = 0xFF;
General_Number_Disp(cmperweima, 3, 90);
memcpy(yibiaoshuju,get_num_buf,34);
// for(int i =0;i<34;i++)
// {
// yibiaoshuju[i] = get_num_buf[i];
// }
yibiaoshuju[34] = 0xFF;
General_Number_Disp(yibiaoshuju, 3, 165);
// zhenduanflag = 3;
// comparestart = 1;
break;
case 2:
POWER_CTRL_KL30 = 0u; //B+
POWER_CTRL_KL15 = 0u; //KL15
CAN_Msg_Tx_Enable = 1u;
if(MENU_CHECK_STEP == 0)
{
Display_Version_Info(1);
}
else
{
loc_Type_back = 0;
}
if((R485_ID4Dh.Sig.ESP322 == 0) && ( R485_ID4Dh.Sig.G0312 == 0))
{
MENU_CHECK_STEP = 0;
}
//Function_Check_Ctrl(1); //Excel表格发报文。硬线信号
Diag_Info_Init( );
Display_Init( );
// Send_Init();
// Send_ODO_Init();
// Display_Send_ODO(0);
//FUEL_UDS__Display(3);
Buzzer_Warning();
break;
case 3:
blename[4] = 0xFF;
// if(recvflag111 == 1)
// {
if((blename[0]+blename[1]+blename[2]+blename[3]) != 0)
{
General_Number_Disp(blename, 3, 165);
}
// recvflag111 = 0;
// }
// POWER_CTRL_KL30 = 0u; //B+
// POWER_CTRL_KL15 = 0u; //KL15
// CAN_Msg_Tx_Enable = 1u;
// Diag_Info_Init( );
// Display_Init( );
// Display_Version_Info(0);
// Display_Set_Buff();
// // Function_Check_Ctrl(1); //Excel表格发报文。硬线信号
// //FUEL_UDS__Display(3);
// Buzzer_Warning();
// break;
// case 4:
// break;
default:
POWER_CTRL_KL30 = 0u;
POWER_CTRL_KL15 = 0u;
CAN_Msg_Tx_Enable = 1u;
Display_Menu_Type = 0;
Diag_Info_Init( );
Display_Init( );
Display_Version_Info(0);
Send_Init();
Send_ODO_Init();
// Buzzer_Init();
break;
}
}
void Read_IPK_Session_Type(void)//请求仪表发送 软硬件版本号 等数据。 void Read_IPK_Session_Type(void)//请求仪表发送 软硬件版本号 等数据。
{ {
...@@ -543,362 +401,6 @@ void Read_IPK_Session_Type(void)//请求仪表发送 软硬件版本号 等数 ...@@ -543,362 +401,6 @@ void Read_IPK_Session_Type(void)//请求仪表发送 软硬件版本号 等数
} }
} }
} }
uint8_t LED_Waring = 0;
uint8_t ABStime = 0;
void Function_Check_Ctrl(uint32_t cmd)
{
uint8_t p [ 20 ];
uint8_t DIAG_BUFER [ 40 ];
uint32_t i;
uint32_t j;
static uint32_t status = 0;
static uint32_t MENU_BACK = 0xff;
static uint8_t UDS_EunD = 0;
if ( cmd == 0 )
{
;
}
else if(cmd == 1)
{
//Voltage_UDS__Display();
//FUEL_UDS__Display(1);
if ( MENU_CHECK_STEP >= Get_Total_CheckStep( ) )
{
// MENU_CHECK_STEP = 0;
}
if ( MENU_BACK != MENU_CHECK_STEP )
{
MENU_BACK = MENU_CHECK_STEP;
Execute_Specify_Step(MENU_CHECK_STEP);//Excel表格发报文。
if (0)//数字需要3位还是2位
{
p [ 0 ] = (MENU_CHECK_STEP + 1) / 100; // 65535
p [ 1 ] = ((MENU_CHECK_STEP + 1) % 100) / 10;
p [ 2 ] = (MENU_CHECK_STEP + 1) % 10; // 65535
p [ 3 ] = 0xff;
}
else
{
p [ 0 ] = ((MENU_CHECK_STEP ) % 100) / 10;
p [ 1 ] = (MENU_CHECK_STEP ) % 10; // 65535
p [ 2 ] = 0xff;
}
General_Number_Disp(p, 190, 10);//刷图:报文检测步数
}
Display_Send_Vspead(MENU_CHECK_STEP);
switch (MENU_CHECK_STEP)
{
case 0:
{
LED3 = 0; //右转
LED4 = 0;
LINE_OUT_NEG_05 = 0;
LINE_OUT_NEG_06 = 1;
LINE_jinguang = 0;
POWER_CTRL_KL30_Current = 0;
if(Auto_ONOFF == 0)
{
LINE_OUT_NEG_01 = 1;
LINE_OUT_NEG_04 = 1;
}
LINE_OUT_NEG_02 = 1;
LINE_OUT_NEG_03 = 1;
POWER_CTRL_KL30 = 0;
name1= (devicename) & 0xFF;
name2 = (devicename >> 8) & 0xFF;
break;
}
case 1:
{
LED3 = 0;
LED4 = 0;
LINE_OUT_NEG_05 = 1;
LINE_OUT_NEG_06 = 0;
POWER_CTRL_KL30_Current = 0;
LINE_jinguang = 1;
POWER_CTRL_KL30 = 0;
break;
}
case 2:
{
LED3 = 0;
LINE_OUT_NEG_05 = 1;
LINE_OUT_NEG_06 = 0;
LINE_jinguang = 0;
POWER_CTRL_KL30_Current = 0;
POWER_CTRL_KL30 = 1;
LED4 = 1;
if(LINE_FUEL_RES04 == 1 || LINE_FUEL_RES02 == 1)
{
LED3 = 1;
}
break;
}
case 3:
{
LED3 = 1;
LINE_OUT_NEG_06 = 0;
LINE_OUT_NEG_05 = 1;
LINE_jinguang = 0;
POWER_CTRL_KL30_Current = 0;
LED4 = 0;
POWER_CTRL_KL30 = 0;
break;
}
case 4:
{
LED3 = 0;
LINE_OUT_NEG_06 = 0;
LINE_OUT_NEG_05 = 1;
LINE_jinguang = 0;
POWER_CTRL_KL30_Current = 0;
LED4 = 0;
POWER_CTRL_KL30 = 0;
break;
}
case 5:
{
LED3 = 0;
LINE_OUT_NEG_06 = 0;
LINE_OUT_NEG_05 = 1;
LINE_jinguang = 0;
POWER_CTRL_KL30_Current = 0;
LED4 = 0;
POWER_CTRL_KL30 = 0;
queren = 0 ;
// ABStime = 0;
break;
}
case 6:
{
LED3 = 0;
LINE_OUT_NEG_06 = 0;
LINE_OUT_NEG_05 = 1;
LINE_jinguang = 0;
POWER_CTRL_KL30_Current = 0;
LED4 = 0;
POWER_CTRL_KL30 = 0;
if(ABStime < 30)
{
ABStime++;
}
else
{
queren = 1;
ABStime = 0;
}
break;
}
case 7:
{
LED3 = 0;
LINE_OUT_NEG_06 = 0;
LINE_OUT_NEG_05 = 0;
LINE_jinguang = 0;
POWER_CTRL_KL30_Current = 0;
LED4 = 0;
POWER_CTRL_KL30 = 0;
queren = 0;
// ABStime = 0;
break;
}
case 8:
{
LED3 = 0;
LINE_OUT_NEG_06 = 0;
LINE_OUT_NEG_05 = 1;
LINE_jinguang = 0;
LED4 = 0;
POWER_CTRL_KL30_Current = 1;
POWER_CTRL_KL30 = 0;
break;
}
case 9:
{
LED3 = 0;
LINE_OUT_NEG_06 = 0;
LINE_OUT_NEG_05 = 1;
LINE_jinguang = 0;
LED4 = 0;
POWER_CTRL_KL30_Current = 0;
POWER_CTRL_KL30 = 0;
break;
}
case 10:
{
LED3 = 1;
LED4 = 1;
LINE_OUT_NEG_05 = 0;
LINE_OUT_NEG_06 = 1;
LINE_jinguang = 1;
POWER_CTRL_KL30_Current = 1;
POWER_CTRL_KL30 = 1;
break;
}
case 11:
{
if(Auto_ONOFF == 0)
{
LINE_OUT_NEG_01 = 1;
LINE_OUT_NEG_04 = 1;
}
LINE_OUT_NEG_02 = 1;
LINE_OUT_NEG_03 = 1;
LED3 = 1;
LED4 = 1;
LINE_OUT_NEG_05 = 0;
LINE_OUT_NEG_06 = 1;
LINE_jinguang = 1;
POWER_CTRL_KL30 = 1;
POWER_CTRL_KL30_Current = 1;
break;
}
case 12:
{
POWER_CTRL_KL30_Current = 1;
if(Auto_ONOFF == 0)
{
LINE_OUT_NEG_01 = 0;
}
LINE_OUT_NEG_02 = 0;
LINE_OUT_NEG_03 = 1;
LINE_OUT_NEG_04 = 0;
break;
}
case 13:
{
POWER_CTRL_KL30_Current = 0;
if(Auto_ONOFF == 0)
{
LINE_OUT_NEG_01 = 0;
}
LINE_OUT_NEG_02 = 0;
LINE_OUT_NEG_03 = 1;
LINE_OUT_NEG_04 = 0;
break;
}
case 14:
{
LED3 = 0; //右转
LED4 = 0;
LINE_OUT_NEG_05 = 0;
LINE_OUT_NEG_06 = 1;
LINE_jinguang = 0;
POWER_CTRL_KL30_Current = 0;
if(Auto_ONOFF == 0)
{
LINE_OUT_NEG_01 = 0;
LINE_OUT_NEG_04 = 1;
}
LINE_OUT_NEG_02 = 1;
LINE_OUT_NEG_03 = 1;
POWER_CTRL_KL30 = 0;
break;
}
case 15:
{
LED3 = 0; //右转
LED4 = 0;
LINE_OUT_NEG_05 = 0;
LINE_OUT_NEG_06 = 1;
LINE_jinguang = 0;
POWER_CTRL_KL30_Current = 0;
if(Auto_ONOFF == 0)
{
LINE_OUT_NEG_01 = 0;
LINE_OUT_NEG_04 = 0;
}
LINE_OUT_NEG_02 = 0;
LINE_OUT_NEG_03 = 0;
POWER_CTRL_KL30 = 0;
break;
}
case 16:
{
LED3 = 0; //右转
LED4 = 0;
LINE_OUT_NEG_05 = 0;
LINE_OUT_NEG_06 = 1;
LINE_jinguang = 0;
POWER_CTRL_KL30_Current = 0;
if(Auto_ONOFF == 0)
{
LINE_OUT_NEG_01 = 1;
LINE_OUT_NEG_04 = 1;
}
LINE_OUT_NEG_02 = 1;
LINE_OUT_NEG_03 = 1;
POWER_CTRL_KL30 = 0;
break;
}
// case 21:
// {
// LINE_OUT_POS_01 = 1;
// LINE_OUT_NEG_02 = 0;
// LINE_OUT_NEG_01 = 0;
// break;
// }
// case 22:
// {
// LINE_OUT_POS_01 = 1;
// LINE_OUT_NEG_02 = 1;
// LINE_OUT_NEG_01 = 1;
// Display_Menu_Type = 3;
// if( (Get_ID_HandBrakeSts() != 1) ||
// (Get_CAN_CH0_ID_10FF4117_Sig_Seatbeltsts() != 1) ||
// (Get_CAN_CH0_ID_10FF1017_Sig_HighBeamSts() != 1) ||
// (Get_CAN_CH0_ID_10FF1017_Sig_LowBeamSts() != 1) || (Get_CAN_CH0_ID_10FF1017_Sig_FrontFogLightSts() != 1) )
// {
// LED_Waring = 1;
// }
// else
// {
// LED_Waring = 0;
// }
// break;
// }
// case 23:
// {
// LINE_OUT_POS_01 = 0;
// LINE_OUT_NEG_02 = 0;
// LINE_OUT_NEG_01 = 0;
// break;
// }
default:
break;
// }
}
}
}
void Get_ODO_Call(void) void Get_ODO_Call(void)
{ {
......
...@@ -44,7 +44,7 @@ extern unsigned int loc_Step; ...@@ -44,7 +44,7 @@ extern unsigned int loc_Step;
extern unsigned char KEYBUFFER [ 4 ]; extern unsigned char KEYBUFFER [ 4 ];
extern unsigned int CAN_Msg_Tx_Enable; extern unsigned int CAN_Msg_Tx_Enable;
extern uint8_t loc_Type_back; extern uint8_t loc_Type_back;
extern uint8_t LED_Waring ; //extern uint8_t LED_Waring ;
void SET_IPK_NONE(void); void SET_IPK_NONE(void);
void Clear_IPK_NONE(void); void Clear_IPK_NONE(void);
......
...@@ -31,22 +31,24 @@ void Can_Init(void) ...@@ -31,22 +31,24 @@ void Can_Init(void)
{ {
CAN_Frame_st_t stCANFrame; CAN_Frame_st_t stCANFrame;
RSCAN0_Config_st_t loc_can = {0}; RSCAN0_Config_st_t loc_can = {0};
loc_can.stRSCANCh2.u32RSCANChEn = 0U; // loc_can.stRSCANCh2.u32RSCANChEn = 0U;
loc_can.stRSCANCh2.enRSCANChBps = RSCAN_Baud_Rate_250K; // loc_can.stRSCANCh2.enRSCANChBps = RSCAN_Baud_Rate_250K;
loc_can.stRSCANCh2.u32RSCANChRuleSize = CANFD0_CH2_RX_RULE_SIZE; // loc_can.stRSCANCh2.u32RSCANChRuleSize = CANFD0_CH2_RX_RULE_SIZE;
loc_can.stRSCANCh2.pfnRSCANConfirmCallBack = Can_Confirm; // loc_can.stRSCANCh2.pfnRSCANConfirmCallBack = Can_Confirm;
loc_can.stRSCANCh2.pfnRSCANReadMsgCallBack = Can_Read_Msg; // loc_can.stRSCANCh2.pfnRSCANReadMsgCallBack = Can_Read_Msg;
loc_can.stRSCANCh2.pfnRSCANAbortConfirmCallBack = 0; // loc_can.stRSCANCh2.pfnRSCANAbortConfirmCallBack = 0;
loc_can.stRSCANCh4.u32RSCANChEn = 1U; loc_can.stRSCANCh4.u32RSCANChEn = 1U;
loc_can.stRSCANCh4.enRSCANChBps = RSCAN_Baud_Rate_250K; loc_can.stRSCANCh4.enRSCANChBps = RSCAN_Baud_Rate_500K;
loc_can.stRSCANCh4.u32RSCANChRuleSize = CANFD0_CH4_RX_RULE_SIZE; loc_can.stRSCANCh4.u32RSCANChRuleSize = CANFD0_CH4_RX_RULE_SIZE;
loc_can.stRSCANCh4.pfnRSCANConfirmCallBack = Can_Confirm; loc_can.stRSCANCh4.pfnRSCANConfirmCallBack = Can_Confirm;
loc_can.stRSCANCh4.pfnRSCANReadMsgCallBack = Can_Read_Msg; loc_can.stRSCANCh4.pfnRSCANReadMsgCallBack = Can_Read_Msg;
loc_can.stRSCANCh4.pfnRSCANAbortConfirmCallBack = 0; loc_can.stRSCANCh4.pfnRSCANAbortConfirmCallBack = 0;
CAN_RST = 0;
RSCAN0_CH_Init(CANFD_RX_RULE_TABLE_LIST, &loc_can); RSCAN0_CH_Init(CANFD_RX_RULE_TABLE_LIST, &loc_can);
CAN_TX_SetEnable(0x55);
// stCANFrame.u32CANID=0x666; // stCANFrame.u32CANID=0x666;
// stCANFrame.u8CANFrameIDE=0; // stCANFrame.u8CANFrameIDE=0;
...@@ -96,7 +98,8 @@ uint8_t Can_Write(_CAN_Msg *Msg) ...@@ -96,7 +98,8 @@ uint8_t Can_Write(_CAN_Msg *Msg)
uint32_t idx; uint32_t idx;
m_msg.u32CANID = Msg->MsgID; m_msg.u32CANID = Msg->MsgID;
m_msg.u8CANLEN = Msg->MsgDLC; m_msg.u8CANLEN = Msg->MsgDLC;
m_msg.u8CANFrameIDE = 1; m_msg.u8CANFrameIDE = 0;
m_msg.u8CANFrameType = 0;
for ( i = 0; i < m_msg.u8CANLEN; i++ ) for ( i = 0; i < m_msg.u8CANLEN; i++ )
{ {
m_msg.unCANData.u8CANData [ i ] = Msg->Msg [ i ]; m_msg.unCANData.u8CANData [ i ] = Msg->Msg [ i ];
...@@ -117,7 +120,8 @@ uint8_t Can_Write_FIFO(_CAN_Msg *Msg) ...@@ -117,7 +120,8 @@ uint8_t Can_Write_FIFO(_CAN_Msg *Msg)
uint32_t idx; uint32_t idx;
m_msg.u32CANID = Msg->MsgID; m_msg.u32CANID = Msg->MsgID;
m_msg.u8CANLEN = Msg->MsgDLC; m_msg.u8CANLEN = Msg->MsgDLC;
m_msg.u8CANFrameIDE = 1; m_msg.u8CANFrameIDE = 0;
m_msg.u8CANFrameType = 0;
for ( i = 0; i < m_msg.u8CANLEN; i++ ) for ( i = 0; i < m_msg.u8CANLEN; i++ )
{ {
m_msg.unCANData.u8CANData [ i ] = Msg->Msg [ i ]; m_msg.unCANData.u8CANData [ i ] = Msg->Msg [ i ];
...@@ -154,7 +158,8 @@ void Can_Abort_All(void) ...@@ -154,7 +158,8 @@ void Can_Abort_All(void)
/*****Lower*******/ /*****Lower*******/
void Can_Read_Msg(uint32_t m_id, uint8_t m_dlc, uint8_t m_Msg []) void Can_Read_Msg(uint32_t m_id, uint8_t m_dlc, uint8_t m_Msg [])
{ {
Co_Can_Buff_Set(Co_Can_ConvertSubID(m_id), m_dlc, m_Msg); Co_Can_Buff_Set(&CAN_CH4_CanMsgOp, Co_Can_ConvertSubID_CAN_CH4(m_id),m_dlc, m_Msg);
//UDS_ReceivedMsg(m_id, m_dlc);
if ( (m_id == DIAG_ID_Rx_FUN) || (m_id == DIAG_ID_Rx_PHY) ) if ( (m_id == DIAG_ID_Rx_FUN) || (m_id == DIAG_ID_Rx_PHY) )
{ {
...@@ -168,37 +173,12 @@ void Can_Confirm(uint32_t Identifier, uint8_t TransferStatus) ...@@ -168,37 +173,12 @@ void Can_Confirm(uint32_t Identifier, uint8_t TransferStatus)
MSG_ID = 0ul; MSG_ID = 0ul;
switch ( Identifier ) switch ( Identifier )
{ {
case RSCAN_CHANNEL_BUF_2:
MSG_ID = 0x401ul;
break;
case RSCAN_CHANNEL_BUF_3:
MSG_ID = 0x260ul;
break;
case RSCAN_CHANNEL_BUF_4:
MSG_ID = 0x280ul;
break;
case RSCAN_CHANNEL_BUF_5:
MSG_ID = 0x380ul;
break;
case RSCAN_CHANNEL_BUF_6:
MSG_ID = 0x385ul;
break;
case RSCAN_CHANNEL_BUF_7:
MSG_ID = 0x69bul;
break;
case RSCAN_CHANNEL_BUF_8:
MSG_ID = 0x28Aul;
break;
case RSCAN_CHANNEL_BUF_1: case RSCAN_CHANNEL_BUF_1:
MSG_ID = DIAG_ID_Tx;
break;
case RSCAN_CHANNEL_BUF_0:
MSG_ID = DIAG_ID_Tx; MSG_ID = DIAG_ID_Tx;
DoCAN_L_Data_Confirm(MSG_ID, TransferStatus); DoCAN_L_Data_Confirm(MSG_ID, TransferStatus);
break; break;
default: default:
break; break;
} }
......
...@@ -149,6 +149,14 @@ void RTE_GPIO_Init(void) ...@@ -149,6 +149,14 @@ void RTE_GPIO_Init(void)
gpio_temp.enGPIODir = GPIO_DIR_IN; gpio_temp.enGPIODir = GPIO_DIR_IN;
gpio_temp.enGPIOAltFun = GPIO_ALTER_FUN_1; gpio_temp.enGPIOAltFun = GPIO_ALTER_FUN_1;
GPIO_Config(&gpio_temp); GPIO_Config(&gpio_temp);
gpio_temp.enGPIOPort = GPIO_PORT_GROUP_0;
gpio_temp.enGPIOPIN = GPIO_PIN_4;
gpio_temp.enGPIOMode = GPIO_MODE_PORT;
gpio_temp.enGPIODir = GPIO_DIR_OUT;
gpio_temp.enGPIOAltFun = GPIO_ALTER_FUN_1;
GPIO_Config(&gpio_temp);
queren = 0; queren = 0;
LINE_OUT_POS_06 = 0; LINE_OUT_POS_06 = 0;
LINE_OUT_POS_07 = 0; LINE_OUT_POS_07 = 0;
......
...@@ -24,12 +24,12 @@ ...@@ -24,12 +24,12 @@
#define SW1 GPIO_IN_APORT00_PIN00 #define SW1 GPIO_IN_APORT00_PIN00
#define SW2 GPIO_IN_PORT10_PIN05 #define SW2 GPIO_IN_PORT10_PIN05
#define SW3 GPIO_IN_APORT00_PIN01 #define SW3 GPIO_IN_APORT00_PIN01
#define SW4 GPIO_IN_APORT00_PIN02 //按键- #define SW4 GPIO_IN_APORT00_PIN02
#define SW5 GPIO_IN_APORT00_PIN03 //按键+ #define SW5 GPIO_IN_APORT00_PIN03
#define SW6 GPIO_IN_APORT00_PIN04 #define SW6 GPIO_IN_APORT00_PIN04
#define SW7 GPIO_IN_APORT00_PIN05 #define SW7 GPIO_IN_APORT00_PIN05
#define SW8 GPIO_IN_APORT00_PIN06 //右转 #define SW8 GPIO_IN_APORT00_PIN06
#define SW9 GPIO_IN_PORT09_PIN00 #define SW9 GPIO_IN_PORT09_PIN00
#define SW10 GPIO_IN_PORT10_PIN06 #define SW10 GPIO_IN_PORT10_PIN06
...@@ -57,7 +57,7 @@ ...@@ -57,7 +57,7 @@
#define SD_FMQ GPIO_OUT_PORT10_PIN02 #define SD_FMQ GPIO_OUT_PORT10_PIN02
// #define PWM_FMQ GPIO_OUT_PORT10_PIN06 // #define PWM_FMQ GPIO_OUT_PORT10_PIN06
#define CAN_RST GPIO_OUT_PORT00_PIN04
#define NEG_1_Ctrl GPIO_OUT_PORT09_PIN06 #define NEG_1_Ctrl GPIO_OUT_PORT09_PIN06
#define NEG_2_Ctrl GPIO_OUT_PORT09_PIN05 #define NEG_2_Ctrl GPIO_OUT_PORT09_PIN05
......
#ifndef TYWTYPES_H #ifndef TYWTYPES_H
#define TYWTYPES_H #define TYWTYPES_H
#ifndef Platform_RH850 #ifndef Platform_RH850
#define Platform_RH850 #define Platform_RH850
#endif #endif
/* /*
变量长度(byte) XHY 324 3360 rh850 SAMC21 变量长度(byte) XHY 324 3360 rh850 SAMC21
...@@ -382,7 +381,29 @@ typedef long int32_t; ...@@ -382,7 +381,29 @@ typedef long int32_t;
#define NVM_RelaxRemind_4H 2u #define NVM_RelaxRemind_4H 2u
typedef enum
{
CAN_MSG_TX_CYCLE = 0u,
CAN_MSG_TX_CYCKE_EVENT,
} CAN_TX_Type_t;
typedef enum
{
MSG_STD = 0u,
MSG_EXT,
} CAN_MSG_FORMAT_t;
typedef enum
{
CAN_FRAME_CAN = 0u,
CAN_FRAME_CANFD,
} CAN_FRAME_TYPE_t;
typedef enum
{
CAN_Intel = 0u,
CAN_Motorola,
} CAN_MSG_Endian_t;
#endif #endif
...@@ -61,8 +61,6 @@ void Sys_Run_Mode_Pseudo_Real_Time_Tasks(void) ...@@ -61,8 +61,6 @@ void Sys_Run_Mode_Pseudo_Real_Time_Tasks(void)
------------------------------------------------------------------------------*/ ------------------------------------------------------------------------------*/
void Sys_Run_Mode_2ms_Tasks_Group(void) void Sys_Run_Mode_2ms_Tasks_Group(void)
{ {
// Can_Write_Fun(2); //报文外发
// COM_RX_Process( );
RTE_ADC_Services( ); RTE_ADC_Services( );
Get_static_Current(); Get_static_Current();
} }
...@@ -72,6 +70,8 @@ void Sys_Run_Mode_2ms_Tasks_Group(void) ...@@ -72,6 +70,8 @@ void Sys_Run_Mode_2ms_Tasks_Group(void)
------------------------------------------------------------------------------*/ ------------------------------------------------------------------------------*/
void Sys_Run_Mode_5ms_Tasks_Group(void) void Sys_Run_Mode_5ms_Tasks_Group(void)
{ {
COM_RX_Process( );
COM_TX_Process();
} }
/*============================================================================== /*==============================================================================
...@@ -88,266 +88,21 @@ void Sys_Run_Mode_10ms_Tasks_Group(void) ...@@ -88,266 +88,21 @@ void Sys_Run_Mode_10ms_Tasks_Group(void)
// BusOff_Service( ); // BusOff_Service( );
Key_Service( ); Key_Service( );
Recv_Byte(); Recv_Byte();
if(devicename<0xFFFF)
{
devicename++;
}
else
{
devicename = 0;
}
if(firstpowerflag == 2)
{
if(clearOdoFlag == 0)
{
backsend();
// RS485_TX_finish = 0;
if(RS485_TX_finish == 0)
{
LINE_OUT_NEG_09 = 1;
if(LINE_OUT_NEG_09 == 1)
{
if(connectbleFlag == 0)
{
if(zhenduanflag == 0)
{
// R485_Send_Line_0x47(MENU_CHECK_STEP);
RS485_User_Tx_Data();
comparestart = 0;
}
else if(zhenduanflag == 1)
{
R485_Send_0x47();
comparestart = 0;
}
else if(zhenduanflag == 2)
{
R485_Sendcheck_0x47();
}
else
{
;
}
}
else
{
// if(send0x42time<0xFFFFFFFF)
// {
// send0x42time++;
// }
// if(bleOFFtoONtime<0xFFFFFFFF)
// {
// bleOFFtoONtime++;
// }
if(RS485_TX_finish == 0)
{
if(startONfalg == 0)
{
if(send0x42time<130)
{
// if(sendflag == 1)
// {
R485_Send_0x42();
// sendflag = 0;
// }
queren = 0;
}
else
{
// bleOFFtoONtime = 0;
// LINE_OUT_NEG_01 = 0;
// LINE_OUT_NEG_02 = 0;
// LINE_OUT_NEG_03 = 0;
// LINE_OUT_NEG_04 = 0;
startONfalg = 1;
Display_TFT_Clear();
}
}
else
{
if(startIGONtime >= 50)
{
// LINE_OUT_NEG_01 = 1;
// LINE_OUT_NEG_02 = 1;
// LINE_OUT_NEG_03 = 1;
// LINE_OUT_NEG_04 = 1;
if(startIGONtime >= 100)
{
Openble[0] = 0x59;
Openble[1] = 0x44;
Openble[2] = 0xA;
Openble[3] = 0x8A;
Openble[4] = 0xA;
Openble[5] = 0xA;
Openble[6] = name2;
Openble[7] = name1;
Openble[8] = 1;
Openble[9] = 0x4B;
Openble[10] = 0x4A;
// RS485_User_Tx_Data();
if(sendflag == 1)
{
R485_Send_0x41();
sendflag = 0;
}
else
{
R485_Send_0x80();
sendflag = 1;
}
blename[4] = 0xFF;
// if(send0x42time % 20 == 0)
// {
UART_Ch2_Send_Multiple_Byte(Openble,sizeof(Openble));
// if(startIGONtime > 500)
// {
// queren = 1;
// }
// }
}
}
}
RS485_send_time = 0;
RS485_TX_finish = 1;
}
else
{
}
}
}
// else
// {
// RS485_TX_finish = 0;
// }
}
else
{
// backsend();
// LINE_OUT_NEG_09 = 0;
// if(LINE_OUT_NEG_09 == 0)
// {
// }
}
}
else
{
MENU_CHECK_STEP = 3;
backsend();
RS485_User_Tx_Data();
if(clearodotime < 3000)
clearodotime++;
if(clearodotime >= 1500)
{
// Port_SetPortPinLevel(2,9,PortGpioHigh);
queren = 1;
}
}
}
} }
/*============================================================================== /*==============================================================================
20ms����ִ������ ��0�� 20ms����ִ������ ��0��
------------------------------------------------------------------------------*/ ------------------------------------------------------------------------------*/
uint8_t time100mssend = 0;
void Sys_Run_Mode_20ms_Tasks_Group0(void) void Sys_Run_Mode_20ms_Tasks_Group0(void)
{ {
// uint8_t data[8] = {0};
// uint32_t SpdN = 0;
// _CAN_Msg canMag;
// //Total_Check( );
// canMag.MsgID = 0x8FFF00B;
// FT_VehSpeedCalc_Main(FT_CurVehSpeed, &SpdN, SPEED_TO_CANMESSAGE);
// FT_Fill_VehSpeedCANMessage(SpdN, data);
// canMag.MsgDLC = 8u;
// canMag.MsgPro = 1u;
// memcpy(canMag.Msg, data, 8);
// Can_Write(&canMag);
if(time100mssend < 2)
{
time100mssend++;
}
else
{
// firstIGON = 0;
time100mssend = 0;
}
} }
/*============================================================================== /*==============================================================================
50ms����ִ������ ��0�� 50ms����ִ������ ��0��
------------------------------------------------------------------------------*/ ------------------------------------------------------------------------------*/
uint8_t powerstu = 0;
uint32_t timerms = 0;
void Sys_Run_Mode_50ms_Tasks_Group(void) void Sys_Run_Mode_50ms_Tasks_Group(void)
{ {
static uint32_t timer_100ms = 0;
if(timer_100ms <=1000)
{
timer_100ms++;
}
if(timerms <=1000)
{
timerms++;
}
// if ( timer_100ms >= 500 )
// {
// if(powerstu == 0)
// {
// LINE_OUT_NEG_01 = 1;
// LINE_OUT_NEG_02 = 1;
// LINE_OUT_NEG_03 = 1;
// LINE_OUT_NEG_04 = 1;
// powerstu = 1;
// timer_100ms = 0;
// firstIGON = 1;
// timerms = 0;
// }
// else
// {
// LINE_OUT_NEG_01 = 0;
// LINE_OUT_NEG_02 = 0;
// LINE_OUT_NEG_03 = 0;
// LINE_OUT_NEG_04 = 0;
// powerstu = 0;
// timer_100ms = 400;
// firstIGON = 1;
// timerms = 0;
// }
// // Read_IPK_Session_Type( );//请求仪表发送 软硬件版本号 等数据。
// }
if(timerms >=60)
{
firstIGON = 0;
}
firstIGON = 0;
} }
/*============================================================================== /*==============================================================================
...@@ -364,207 +119,12 @@ uint16_t time5s = 0; ...@@ -364,207 +119,12 @@ uint16_t time5s = 0;
uint16_t IGFLAG = 0; uint16_t IGFLAG = 0;
void Sys_Run_Mode_100ms_Tasks_Group(void) void Sys_Run_Mode_100ms_Tasks_Group(void)
{ {
static uint32_t loc_timer = 0;
loc_timer++;
if ( loc_timer >= 3 )
{
loc_timer = 0;
// HW_CHECK_IPK_EXIST( );
Recv_Byte1();
}
Display_PageNum(); Display_PageNum();
//POWER_CTRL_KL30 = 1; User_CheckMode_Service(100u);
time5s+=100; //TFT_LCD_Draw_Bmp(3, 40, ( uint8_t * )gImage_Dsy_words_1X6_Y16);
if(time5s > 10000)
{
time5s = 0;
if(IGFLAG == 1)
{
IGFLAG = 0;
}
else
{
IGFLAG = 1;
}
}
POWER_CTRL_KL30 = 1; POWER_CTRL_KL30 = 1;
POWER_CTRL_KL30_B = 1; POWER_CTRL_KL30_B = 1;
if(IGFLAG == 1)
{
POWER_CTRL_KL15 = 1; POWER_CTRL_KL15 = 1;
}
else
{
POWER_CTRL_KL15 = 0;
}
// Freln_Duty_HZ_Service();
if(RS485_send_time<0xFFFFFFFF)
{
RS485_send_time++;
}
if(firstpowerflag == 2)
{
if(AutoFlag == 1)
{
if(AutoTime <= 200)
{
AutoTime++;
}
else
{
MENU_CHECK_STEP_ADD( );
if(MENU_CHECK_STEP == 0)
{
MENU_CHECK_STEP = 0;
}
if(MENU_CHECK_STEP == 13)
{
AutoTime = 0;
}
else
{
AutoTime = 160;
}
}
}
if(Auto_ONOFF == 1)
{
if(ONOFFtime <=160)
{
ONOFFtime++;
}
else
{
// if(LINE_OUT_NEG_01 == 1)
// {
// LINE_OUT_NEG_01 = 0;
// LINE_OUT_NEG_04 = 0;
// ONOFFtime = 0;
// }
// else
// {
// LINE_OUT_NEG_01 = 1;
// LINE_OUT_NEG_04 = 1;
// ONOFFtime = 0;
// }
}
}
if(flashtime < 3)
{
flashtime++;
}
else
{
if(comparestart == 1)
{
compareresult = GetDataCompare();
// Display_TFT_Clear();
if(compareresult == 1)
{
TFT_LCD_Draw_Bmp(200, 90+40, ( uint8_t * )gImage_cuo1 );
// comparestart = 2;
}
else
{
TFT_LCD_Draw_Bmp(200, 90+40, ( uint8_t * )gImage_dui1 );
// comparestart = 2;
}
comparestart = 0;
// Display_TFT_Clear();
}
else if(comparestart == 0)
{
//Total_Check( );
if(zhenduanflag == 3)
{
if(compareresult == 1)
{
TFT_LCD_Draw_Bmp(200, 90+40, ( uint8_t * )gImage_cuo1 );
// comparestart = 2;
}
else
{
TFT_LCD_Draw_Bmp(200, 90+40, ( uint8_t * )gImage_dui1 );
// comparestart = 2;
}
// comparestart = 1;
}
}
else
{
//Total_Check();
}
flashtime = 0;
}
// if(recvflag111 == 1)
// {
// blename[4] = 0xff;
// General_Number_Disp(blename, 3, 165);
// recvflag111 = 0;
// }
}
if(firstpowerflag == 1)
{
zhenduanflag = 2;
//Total_Check();
firstpowerflag = 2;
Display_TFT_Clear();
if(compareresult == 1 && comparestart == 0)
{
// Total_Check();
if(compareresult == 1)
{
TFT_LCD_Draw_Bmp(200, 90+40, ( uint8_t * )gImage_cuo1 );
// comparestart = 2;
}
else
{
TFT_LCD_Draw_Bmp(200, 90+40, ( uint8_t * )gImage_dui1 );
// comparestart = 2;
}
//Total_Check();
firstpowerflag = 3;
// zhendlag = 5;
}
}
else
{
if(compareresult == 1)
{
//Total_Check();
firstpowerflag = 3;
zhenduanflag = 2;
if(compareresult == 1)
{
TFT_LCD_Draw_Bmp(200, 90+40, ( uint8_t * )gImage_cuo1 );
// comparestart = 2;
}
else
{
TFT_LCD_Draw_Bmp(200, 90+40, ( uint8_t * )gImage_dui1 );
// comparestart = 2;
}
// Total_Check();
// zhenduanflag = 5;
}
// zhenduanflag = 2;
}
//u16LJSText = TFT_LCD_REQ_FIFO_MAX_DEPTH;
} }
/*=================================================================*/ /*=================================================================*/
......
...@@ -113,6 +113,10 @@ typedef struct ...@@ -113,6 +113,10 @@ typedef struct
uint32_t u32CANID; uint32_t u32CANID;
uint8_t u8CANLEN; uint8_t u8CANLEN;
uint8_t u8CANFrameIDE; /*0: Standard ID . 1: Extended ID */ uint8_t u8CANFrameIDE; /*0: Standard ID . 1: Extended ID */
uint8_t u8CANFrameType; /*0: CAN 1: CANFD */
uint8_t u8CANReserved1;
uint8_t u8CANReserved2;
uint8_t u8CANReserved3;
} CAN_Frame_st_t; } CAN_Frame_st_t;
......
...@@ -73,8 +73,11 @@ void Sys_Startup_Init(void) ...@@ -73,8 +73,11 @@ void Sys_Startup_Init(void)
GPIO_SET_KEPP( ); GPIO_SET_KEPP( );
RTE_ADC_Init( ); RTE_ADC_Init( );
// COM_CAN_Init( ); CAN_RST = 1;
// Can_Init( ); Can_Init();
COM_CAN_Init( );
enable_interrupt( ); enable_interrupt( );
Sys_Tick_Timer_Start( ); Sys_Tick_Timer_Start( );
TFT_LCD_Startup( ); TFT_LCD_Startup( );
...@@ -113,7 +116,7 @@ void Sys_Startup_Init(void) ...@@ -113,7 +116,7 @@ void Sys_Startup_Init(void)
// UART_Init(UART_RLIN32, &loc_config); // UART_Init(UART_RLIN32, &loc_config);
Display_TFT_Clear(); Display_TFT_Clear();
GUI_Display_Version_Code_Service(25, 20, "Please Scan The Code ", Letter_Num_11, PCodeText_Space_size); //GUI_Display_Version_Code_Service(25, 20, "Please Scan The Code ", Letter_Num_11, PCodeText_Space_size);
/*上电扫码校验功能如果需要扫码校验注释掉firstpowerflag = 2,打开上面两行的注释即可*/ /*上电扫码校验功能如果需要扫码校验注释掉firstpowerflag = 2,打开上面两行的注释即可*/
// firstpowerflag = 2; // firstpowerflag = 2;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include "init.h" #include "init.h"
#include "Task_Scheduler.h" #include "Task_Scheduler.h"
#include "RTE_WDT.h" #include "RTE_WDT.h"
#include "COM_CAN.h"
static void Sys_Task_Init(void); static void Sys_Task_Init(void);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment