Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
J
jiancetai
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
陈家乐
jiancetai
Commits
185cd29c
Commit
185cd29c
authored
Sep 03, 2025
by
何锐
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
✨
feat:增加busoff恢复
parent
af701743
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
256 additions
and
107 deletions
+256
-107
RTE_CAN.c
YueJin_test_bench/source/Appliciation/RTE_CAN.c
+150
-7
RTE_CAN.h
YueJin_test_bench/source/Appliciation/RTE_CAN.h
+2
-0
Task.c
YueJin_test_bench/source/Appliciation/Task.c
+1
-1
RSCAN.c
YueJin_test_bench/source/Driver/CAN/RSCAN.c
+103
-99
No files found.
YueJin_test_bench/source/Appliciation/RTE_CAN.c
View file @
185cd29c
...
...
@@ -7,24 +7,157 @@
#include "RSCAN_Table.h"
#include "Check_Ctrl.h"
#define RSCAN0_BUS_OFF_LV1_RECOVERY_TIME 100U
/* Bus-off ???100ms */
#define RSCAN0_BUS_OFF_LV2_RECOVERY_TIME 1000U
/* Bus-off???1000ms */
void
RSCAN0_CH4_Abort_All
(
void
)
{
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_0
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_1
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_2
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_3
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_4
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_5
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_6
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_7
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_8
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_9
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_10
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_11
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_12
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_13
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_14
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_15
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_16
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_17
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_18
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_19
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_20
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_21
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_22
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_23
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_24
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_25
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_26
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_27
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_28
);
RSCAN0_CH4_Abort
(
RSCAN_CHANNEL_BUF_29
);
}
BusOffMonitorStruct
BusOffMonitor
;
// BusOff监控结构体
static
uint8_t
BusOffCnt
=
0u
;
// static uint8_t BusOffCnt = 0u;
// //初始化Bus Off监控结构体
// void BusOff_Init(void)
// {
// //重置相关信息
// BusOffMonitor.Status = BUS_OFF_STATUS_STABLE;
// BusOffMonitor.Timer = 0;
// BusOffMonitor.Cnt = 0;
// BusOffCnt = 0;
// }
uint8_t
UDS_DtcBusoffCnt
;
static
uint8_t
BusOffCnt
=
0u
;
// OSEK BusOff的判断,只需判断无需进行恢复操作
//初始化Bus Off监控结构体
void
BusOff_Init
(
void
)
{
//重置相关信息
BusOffMonitor
.
Status
=
BUS_OFF_STATUS_STABLE
;
BusOffMonitor
.
Timer
=
0
;
BusOffMonitor
.
Cnt
=
0
;
BusOffCnt
=
0
;
BusOffMonitor
.
Timer
=
0
;
BusOffMonitor
.
Cnt
=
0
;
BusOffCnt
=
0
;
UDS_DtcBusoffCnt
=
0u
;
// end
}
void
Can_BusOffRecover
(
void
)
{
BusOffMonitor
.
Cnt
=
0u
;
BusOffMonitor
.
Status
=
0u
;
BusOffMonitor
.
Timer
=
0u
;
UDS_DtcBusoffCnt
=
0u
;
}
uint8_t
GetBusOffState
(
void
)
{
uint8_t
rscan_st
;
rscan_st
=
RSCAN0_CH4_Get_Busoff_Status
();
return
rscan_st
;
}
void
CanBusoffRecover
(
void
)
{
RSCAN0_CH4_Busoff_Recover
();
}
// OSEK BusOff的判断,只需判断无需进行恢复操作
void
BusOff_Service
(
void
)
{
RSCAN0_CH4_Busoff_Recover
(
);
RSCAN0_CH1_Busoff_Recover
(
);
RSCAN0_CH2_Busoff_Recover
(
);
if
(
GetBusOffState
()
!=
0u
)
{
RSCAN0_CH4_Abort_All
();
BusOffMonitor
.
RecoverCnt
=
0u
;
if
(
BusOffMonitor
.
Status
==
BUS_OFF_STATUS_STABLE
)
{
BusOffMonitor
.
Status
=
BUS_OFF_STATUS_LV1
;
}
if
(
BusOffMonitor
.
Status
==
BUS_OFF_STATUS_LV1
)
{
BusOffMonitor
.
Timer
++
;
if
(
BusOffMonitor
.
Timer
>=
RSCAN0_BUS_OFF_LV1_RECOVERY_TIME
/
10U
)
{
BusOffMonitor
.
Timer
=
0U
;
Can_QuickTimer_Init
();
CanBusoffRecover
();
if
(
UDS_DtcBusoffCnt
<=
100u
)
{
UDS_DtcBusoffCnt
++
;
}
BusOffMonitor
.
Cnt
++
;
if
(
BusOffMonitor
.
Cnt
>=
10U
)
{
BusOffMonitor
.
Cnt
=
0U
;
BusOffMonitor
.
Status
=
BUS_OFF_STATUS_LV2
;
}
}
}
else
if
(
BusOffMonitor
.
Status
==
BUS_OFF_STATUS_LV2
)
{
BusOffMonitor
.
Timer
++
;
if
(
BusOffMonitor
.
Timer
>=
RSCAN0_BUS_OFF_LV2_RECOVERY_TIME
/
10U
)
{
BusOffMonitor
.
Timer
=
0U
;
Can_QuickTimer_Init
();
CanBusoffRecover
();
if
(
UDS_DtcBusoffCnt
<=
100u
)
{
UDS_DtcBusoffCnt
++
;
}
}
}
}
else
{
if
(
BusOffMonitor
.
RecoverCnt
<
2u
)
{
BusOffMonitor
.
RecoverCnt
++
;
}
else
{
BusOffMonitor
.
Cnt
=
0u
;
BusOffMonitor
.
Status
=
0u
;
BusOffMonitor
.
Timer
=
0u
;
UDS_DtcBusoffCnt
=
0u
;
}
}
}
/***Middle***/
void
Can_Init
(
void
)
...
...
@@ -199,3 +332,13 @@ void Can_Confirm(uint32_t Identifier, uint8_t TransferStatus)
{
}
}
void
Can_QuickTimer_Init
(
void
)
{
uint32_t
i
=
0u
;
for
(
i
=
0u
;
i
<
CAN_CH4_ID_SEND_TOTAL
;
i
++
)
{
// Can_Msg_TX_FastInitCycle(&CAN_CH4_CanMsgTxOp, i, CAN_CH4_CANSendAttr [ i ].u32MsgCycleOffset);
}
}
YueJin_test_bench/source/Appliciation/RTE_CAN.h
View file @
185cd29c
...
...
@@ -8,6 +8,7 @@ typedef struct
uint8_t
Status
;
//当前所处Bus Off 状态
uint8_t
Timer
;
// Bus Off计时器
uint8_t
Cnt
;
// Bus Off尝试恢复次数
uint8_t
RecoverCnt
;
}
BusOffMonitorStruct
;
typedef
enum
{
...
...
@@ -77,4 +78,5 @@ void Can_SetTx_St(Can_SendType Status);
void
Can_SetRx_St
(
Can_ReceiveType
Status
);
void
Can_Abort_All
(
void
);
void
Can_Uds_Abort
(
void
);
void
Can_QuickTimer_Init
(
void
);
#endif
YueJin_test_bench/source/Appliciation/Task.c
View file @
185cd29c
...
...
@@ -90,7 +90,7 @@ uint8_t sartigon = 0;
uint8_t
sendflag
=
0
;
void
Sys_Run_Mode_10ms_Tasks_Group
(
void
)
{
//
BusOff_Service( );
BusOff_Service
(
);
Key_Service
(
);
Recv_Byte
();
}
...
...
YueJin_test_bench/source/Driver/CAN/RSCAN.c
View file @
185cd29c
...
...
@@ -93,6 +93,7 @@
#define RSCAN_125K_NSJW ((RSCAN0_125K_SJW - 1U) << 11U)
#define RSCAN_125K_NBRP (RSCAN_125K_BIT_RATE_DIV - 1U)
#define RSCAN_TIME_OUT_MAX 0X0000FFFFUL
/*RCFDCnCFDCFCCk*/
/*Transmit/Receive FIFO Buffer Depth Configuration*/
...
...
@@ -1708,141 +1709,144 @@ RSCAN_SetState RSCAN0_CH5_Set_TXBUF_Data(RSCAN_Channel_Buf_en_t enBufIndex, CAN_
return
enRSCANStatus
;
}
/********************************************************/
/*
0: Not in bus off state
1: In bus off state
*/
uint8_t
RSCAN0_CH0_Get_Busoff_Status
(
void
)
{
uint8_t
u8BusoffStatus
=
0U
;
if
(
RCFDC0CFDC0ERFL
&
0x08UL
)
{
u8BusoffStatus
=
1U
;
}
return
u8BusoffStatus
;
uint8_t
u8BusoffStatus
=
0U
;
if
(
RCFDC0CFDC0ERFL
&
0x08UL
)
{
u8BusoffStatus
=
1U
;
}
return
u8BusoffStatus
;
}
uint8_t
RSCAN0_CH1_Get_Busoff_Status
(
void
)
{
uint8_t
u8BusoffStatus
=
0U
;
if
(
RCFDC0CFDC1ERFL
&
0x08UL
)
{
u8BusoffStatus
=
1U
;
}
return
u8BusoffStatus
;
uint8_t
u8BusoffStatus
=
0U
;
if
(
RCFDC0CFDC1ERFL
&
0x08UL
)
{
u8BusoffStatus
=
1U
;
}
return
u8BusoffStatus
;
}
uint8_t
RSCAN0_CH2_Get_Busoff_Status
(
void
)
{
uint8_t
u8BusoffStatus
=
0U
;
if
(
RCFDC0CFDC2ERFL
&
0x08UL
)
{
u8BusoffStatus
=
1U
;
}
return
u8BusoffStatus
;
uint8_t
u8BusoffStatus
=
0U
;
if
(
RCFDC0CFDC2ERFL
&
0x08UL
)
{
u8BusoffStatus
=
1U
;
}
return
u8BusoffStatus
;
}
uint8_t
RSCAN0_CH3_Get_Busoff_Status
(
void
)
{
uint8_t
u8BusoffStatus
=
0U
;
if
(
RCFDC0CFDC3ERFL
&
0x08UL
)
{
u8BusoffStatus
=
1U
;
}
return
u8BusoffStatus
;
uint8_t
u8BusoffStatus
=
0U
;
if
(
RCFDC0CFDC3ERFL
&
0x08UL
)
{
u8BusoffStatus
=
1U
;
}
return
u8BusoffStatus
;
}
uint8_t
RSCAN0_CH4_Get_Busoff_Status
(
void
)
{
uint8_t
u8BusoffStatus
=
0U
;
if
(
RCFDC0CFDC4ERFL
&
0x08UL
)
{
u8BusoffStatus
=
1U
;
}
return
u8BusoffStatus
;
uint8_t
u8BusoffStatus
=
0U
;
if
(
RCFDC0CFDC4ERFL
&
0x08UL
)
{
u8BusoffStatus
=
1U
;
}
return
u8BusoffStatus
;
}
uint8_t
RSCAN0_CH5_Get_Busoff_Status
(
void
)
{
uint8_t
u8BusoffStatus
=
0U
;
if
(
RCFDC0CFDC5ERFL
&
0x08UL
)
{
u8BusoffStatus
=
1U
;
}
return
u8BusoffStatus
;
uint8_t
u8BusoffStatus
=
0U
;
if
(
RCFDC0CFDC5ERFL
&
0x08UL
)
{
u8BusoffStatus
=
1U
;
}
return
u8BusoffStatus
;
}
void
RSCAN0_CH0_Busoff_Recover
(
void
)
{
if
(
RSCAN0_CH0_Get_Busoff_Status
())
{
RCFDC0CFDC0ERFL
&=
0xFFFFFFF7UL
;
RCFDC0CFDC0CTR
&=
0xFFFFFFF8UL
;
/* CommunicationMode */
while
((
RCFDC0CFDC0STS
&
0x87UL
)
!=
0x80UL
)
{
}
}
if
(
RSCAN0_CH0_Get_Busoff_Status
())
{
uint32_t
u32RSCANTimeCount
;
RCFDC0CFDC0ERFL
&=
0xFFFFFFF7UL
;
RCFDC0CFDC0CTR
&=
0xFFFFFFF8UL
;
u32RSCANTimeCount
=
0UL
;
while
(((
RCFDC0CFDC0STS
&
0x07UL
)
!=
0x0UL
)
&&
(
u32RSCANTimeCount
<
RSCAN_TIME_OUT_MAX
))
{
u32RSCANTimeCount
++
;
}
}
}
void
RSCAN0_CH1_Busoff_Recover
(
void
)
{
if
(
RSCAN0_CH1_Get_Busoff_Status
())
{
RCFDC0CFDC1ERFL
&=
0xFFFFFFF7UL
;
RCFDC0CFDC1CTR
&=
0xFFFFFFF8UL
;
/* CommunicationMode */
while
((
RCFDC0CFDC1STS
&
0x87UL
)
!=
0x80UL
)
{
}
}
if
(
RSCAN0_CH1_Get_Busoff_Status
())
{
uint32_t
u32RSCANTimeCount
;
RCFDC0CFDC1ERFL
&=
0xFFFFFFF7UL
;
RCFDC0CFDC1CTR
&=
0xFFFFFFF8UL
;
u32RSCANTimeCount
=
0UL
;
while
(((
RCFDC0CFDC1STS
&
0x07UL
)
!=
0x0UL
)
&&
(
u32RSCANTimeCount
<
RSCAN_TIME_OUT_MAX
))
{
u32RSCANTimeCount
++
;
}
}
}
void
RSCAN0_CH2_Busoff_Recover
(
void
)
{
if
(
RSCAN0_CH2_Get_Busoff_Status
())
{
RCFDC0CFDC2ERFL
&=
0xFFFFFFF7UL
;
RCFDC0CFDC2CTR
&=
0xFFFFFFF8UL
;
/* CommunicationMode */
while
((
RCFDC0CFDC2STS
&
0x87UL
)
!=
0x80UL
)
{
}
}
if
(
RSCAN0_CH2_Get_Busoff_Status
())
{
uint32_t
u32RSCANTimeCount
;
RCFDC0CFDC2ERFL
&=
0xFFFFFFF7UL
;
RCFDC0CFDC2CTR
&=
0xFFFFFFF8UL
;
u32RSCANTimeCount
=
0UL
;
while
(((
RCFDC0CFDC2STS
&
0x07UL
)
!=
0x0UL
)
&&
(
u32RSCANTimeCount
<
RSCAN_TIME_OUT_MAX
))
{
u32RSCANTimeCount
++
;
}
}
}
void
RSCAN0_CH3_Busoff_Recover
(
void
)
{
if
(
RSCAN0_CH3_Get_Busoff_Status
())
{
RCFDC0CFDC3ERFL
&=
0xFFFFFFF7UL
;
RCFDC0CFDC3CTR
&=
0xFFFFFFF8UL
;
/* CommunicationMode */
while
((
RCFDC0CFDC3STS
&
0x87UL
)
!=
0x80UL
)
{
}
}
if
(
RSCAN0_CH3_Get_Busoff_Status
())
{
uint32_t
u32RSCANTimeCount
;
RCFDC0CFDC3ERFL
&=
0xFFFFFFF7UL
;
RCFDC0CFDC3CTR
&=
0xFFFFFFF8UL
;
u32RSCANTimeCount
=
0UL
;
while
(((
RCFDC0CFDC3STS
&
0x07UL
)
!=
0x0UL
)
&&
(
u32RSCANTimeCount
<
RSCAN_TIME_OUT_MAX
))
{
u32RSCANTimeCount
++
;
}
}
}
void
RSCAN0_CH4_Busoff_Recover
(
void
)
{
if
(
RSCAN0_CH4_Get_Busoff_Status
())
{
RCFDC0CFDC4ERFL
&=
0xFFFFFFF7UL
;
RCFDC0CFDC4CTR
&=
0xFFFFFFF8UL
;
/* CommunicationMode */
while
((
RCFDC0CFDC4STS
&
0x87UL
)
!=
0x80UL
)
{
}
}
if
(
RSCAN0_CH4_Get_Busoff_Status
())
{
uint32_t
u32RSCANTimeCount
;
RCFDC0CFDC4ERFL
&=
0xFFFFFFF7UL
;
RCFDC0CFDC4CTR
&=
0xFFFFFFF8UL
;
u32RSCANTimeCount
=
0UL
;
while
(((
RCFDC0CFDC4STS
&
0x07UL
)
!=
0x0UL
)
&&
(
u32RSCANTimeCount
<
RSCAN_TIME_OUT_MAX
))
{
u32RSCANTimeCount
++
;
}
}
}
void
RSCAN0_CH5_Busoff_Recover
(
void
)
{
if
(
RSCAN0_CH5_Get_Busoff_Status
())
{
RCFDC0CFDC5ERFL
&=
0xFFFFFFF7UL
;
RCFDC0CFDC5CTR
&=
0xFFFFFFF8UL
;
/* CommunicationMode */
while
((
RCFDC0CFDC5STS
&
0x87UL
)
!=
0x80UL
)
{
}
}
if
(
RSCAN0_CH5_Get_Busoff_Status
())
{
uint32_t
u32RSCANTimeCount
;
RCFDC0CFDC5ERFL
&=
0xFFFFFFF7UL
;
RCFDC0CFDC5CTR
&=
0xFFFFFFF8UL
;
u32RSCANTimeCount
=
0UL
;
while
(((
RCFDC0CFDC5STS
&
0x07UL
)
!=
0x0UL
)
&&
(
u32RSCANTimeCount
<
RSCAN_TIME_OUT_MAX
))
{
u32RSCANTimeCount
++
;
}
}
}
void
RSCAN0_CH0_Abort
(
RSCAN_Channel_Buf_en_t
enBufIndex
)
{
uint32_t
u32RSCANBufIndexP
=
(
enBufIndex
+
32UL
*
0UL
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment