-
Notifications
You must be signed in to change notification settings - Fork 1
/
can_error_mcp2515.c
122 lines (108 loc) · 2.82 KB
/
can_error_mcp2515.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/**
* ----------------------------------------------------------------------------
*
* "THE ANY BEVERAGE-WARE LICENSE" (Revision 42 - based on beer-ware license):
* <[email protected]> wrote this file. As long as you retain this notice you
* can do whatever you want with this stuff. If we meet some day, and you think
* this stuff is worth it, you can buy me a be(ve)er(age) in return. (I don't
* like beer much.)
*
* Matthias Kleemann
*
* ----------------------------------------------------------------------------
*
* \file can_error_mcp2515.c
*
* \date Created: 18.07.2012 18:23:45
* \author Matthias Kleemann
**/
#include "can_mcp2515.h"
/**
* \brief get TX error state of CAN bus
* \param chip - select chip to use
* \return error state
*
* \sa TXBO, TXEP, TXWAR
*/
can_error_t can_get_tx_bus_errors(eChipSelect chip)
{
can_error_t error = CAN_ERR_NO_ERROR;
uint8_t errFlags = read_register_mcp2515(chip, EFLG);
if(errFlags & (1 << TXBO))
{
// Bus-Off Error
error = CAN_ERR_TX_BUS_OFF;
}
else if(errFlags & (1 << TXEP))
{
// TX Error-Passive
error = CAN_ERR_TX_PASSIVE;
}
else if(errFlags & (1 << TXWAR))
{
// TX Error Warning
error = CAN_ERR_TX_WARNING;
}
return error;
}
/**
* \brief get RX error state of CAN bus
* \param chip - select chip to use
* \return error state
*
* \sa RX1OVR, RX0OVR, RXEP, RXWAR
*/
can_error_t can_get_rx_bus_errors(eChipSelect chip)
{
can_error_t error = CAN_ERR_NO_ERROR;
uint8_t errFlags = read_register_mcp2515(chip, EFLG);
if(errFlags & (1 << RX1OVR))
{
// RX buffer 1 overflow
error = CAN_ERR_RX1_OVERFLOW;
// reset flag
bit_modify_mcp2515(chip, EFLG, RX1OVR, 0);
// if interrupt enabled, reset it here
bit_modify_mcp2515(chip, CANINTF, RX1IF, 0);
}
else if(errFlags & (1 << RX0OVR))
{
// RX buffer 1 overflow
error = CAN_ERR_RX0_OVERFLOW;
// reset flag
bit_modify_mcp2515(chip, EFLG, RX0OVR, 0);
// if interrupt enabled, reset it here
bit_modify_mcp2515(chip, CANINTF, RX0IF, 0);
}
else if(errFlags & (1 << RXEP))
{
// RX Error-Passive
error = CAN_ERR_RX_PASSIVE;
}
else if(errFlags & (1 << RXWAR))
{
// RX Error Warning
error = CAN_ERR_RX_WARNING;
}
return error;
}
/**
* \brief detect any unusual error count (TEC/REC)
* \param chip - select chip to use
* \return error state
*
* Set when TEC or REC is equal to or greater than 96 (TXWAR or RXWAR = 1)
* and reset when both REC and TEC are less than 96.
*
* \sa EWARN, TXWAR, RXWAR
*/
can_error_t can_get_general_bus_errors(eChipSelect chip)
{
can_error_t error = CAN_ERR_NO_ERROR;
if(read_register_mcp2515(chip, EFLG) & (1 << EWARN))
{
// set warning
error = CAN_ERR_WARNING;
}
return error;
}