CFMOTO/ECU_BOOT/rscan_driver/boot_can_user.c
2023-05-05 11:53:54 +08:00

85 lines
1.8 KiB
C

#include "boot_macrodriver.h"
#include "boot_userdefine.h"
#include "r_rl78_can_sfr.h"
#include "r_rl78_can_drv.h"
#include "boot_can_user.h"
#define C_100MS_1MS 100
can_frame_t Boot_TxCanMessage;
can_frame_t Boot_RxCanMessage;
unsigned char BusOff_flag = 0;
void Copy_Array_to_Array(unsigned char *dest, unsigned char *src,unsigned char count)
{
unsigned char i = 0;
while( i < count)
{
i++;
*dest++ = *src++;
}
}
unsigned char TransmitCAN_Message(unsigned int ID,unsigned char Dlc,unsigned char *Data)
{
can_frame_t Boot_TxCanMessage;
Can_RtnType re_flag;
Boot_TxCanMessage.IDL=ID;
Boot_TxCanMessage.DLC=Dlc;
Boot_TxCanMessage.IDE = 0; /* IDE 0:Standard 1:Extend */
Boot_TxCanMessage.RTR = 0; /* RTR 0:Data 1:Remote */
Boot_TxCanMessage.THDSE = 0; /* Transmit History Data Store Enable */
Boot_TxCanMessage.IDH = 0; /* ID Data (high) */
Boot_TxCanMessage.DLC = 8; /* DLC Data */
Boot_TxCanMessage.LBL = 0; /* Label Data */
Boot_TxCanMessage.TS = 0; /* Timestamp Data */
Copy_Array_to_Array(Boot_TxCanMessage.DB,Data,Dlc);
re_flag=R_CAN_TrmByTRFIFO0_CH0(&Boot_TxCanMessage);
if(re_flag == CAN_RTN_OK)
{
return 0;
}
else
{
return 1;
}
}
void BusOff_Detect(void)
{
if(R_CAN_ReadChStatus_CH0()&0x02)
{
if(C0ERFLL&0x08)
{
if(BusOff_flag==0)
{
BusOff_flag=1;//clear after 40 IGN cycle
}
}
if(C0ERFLL!=0)
{
C0ERFLL=0;
}
C0CTRL&=0xfffc;
}
else
{
BusOff_flag=0;
}
}
/******************************/
//获取can总线出错状态
//返回值
/******************************/
unsigned char GetCanBusOffErr(void)
{
if(BusOff_flag==0)
return 0;
else
return 1;
}