Subversion Repositories HomeAutomation

Rev

Rev 24 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | SVN | RSS feed

Rev 24 Rev 25
-
 
1
/*********************************************************************
-
 
2
 *
-
 
3
 *                  CAN driver
-
 
4
 *
-
 
5
 *********************************************************************
-
 
6
 * FileName:        CAN.c
-
 
7
 *
-
 
8
 * Author               Date    Comment
-
 
9
 *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
 
10
 * Nilesh Rajbharti     8/20/01 Original        (Rev 1.0)
-
 
11
 ********************************************************************/
-
 
12
 
1
#include "../Include/CANdefs.h"
13
#include "../Include/CANdefs.h"
2
#include "../Include/stackTasks.h"
14
#include "../Include/stackTasks.h"
3
#include "../Include/CAN.h"
15
#include "../Include/CAN.h"
4
#include "../Include/uart.h"
16
#include "../Include/uart.h"
5
 
17
 
6
static void canGetPacket(void);
18
static void canGetPacket(void);
7
 
19
 
8
#ifdef USE_CAN
20
#ifdef USE_CAN
9
 
21
 
10
 
22
 
11
/*
23
/*
12
*   Function: canInit
24
*   Function: canInit
13
*
25
*
14
*   Input:  none
26
*   Input:  none
15
*   Output: none
27
*   Output: none
16
*   Pre-conditions: none
28
*   Pre-conditions: none
17
*   Affects: Changes can registers.
29
*   Affects: Changes can registers.
18
*   Depends: none.
30
*   Depends: none.
19
*/
31
*/
20
void canInit()
32
void canInit()
21
{
33
{
22
    CANCON = 0x80; //request config mode
34
    CANCON = 0x80; //request config mode
23
    while ((CANSTAT & 0xE0) != 0x80 ); //wait for config mode request
35
    while ((CANSTAT & 0xE0) != 0x80 ); //wait for config mode request
24
 
36
 
25
    // BAUD AND TQS
37
    // BAUD AND TQS
26
 
38
 
27
    BRGCON1=0;
39
    BRGCON1=0;
28
   
40
   
29
    // Sync_Seq = 2 x TQ = 1
41
    // Sync_Seq = 2 x TQ = 1
30
    BRGCON1bits.SJW1=0;
42
    BRGCON1bits.SJW1=0;
31
    BRGCON1bits.SJW0=1;
43
    BRGCON1bits.SJW0=1;
32
   
44
   
33
    // Setting BRP.
45
    // Setting BRP.
34
    BRGCON1=BRGCON1|CAN_BRP;
46
    BRGCON1=BRGCON1|CAN_BRP;
35
   
47
   
36
    // Maximum PHEG1
48
    // Maximum PHEG1
37
    BRGCON2bits.SEG2PHTS = 1;
49
    BRGCON2bits.SEG2PHTS = 1;
38
   
50
   
39
    // Phase_Seg1 = 2 x TQ = 1
51
    // Phase_Seg1 = 2 x TQ = 1
40
    BRGCON2bits.SEG1PH2 = 0;
52
    BRGCON2bits.SEG1PH2 = 0;
41
    BRGCON2bits.SEG1PH1 = 0;
53
    BRGCON2bits.SEG1PH1 = 0;
42
    BRGCON2bits.SEG1PH0 = 1;
54
    BRGCON2bits.SEG1PH0 = 1;
43
   
55
   
44
    // Prop_Seq = 2 x TQ = 1
56
    // Prop_Seq = 2 x TQ = 1
45
    BRGCON2bits.PRSEG2 = 0;
57
    BRGCON2bits.PRSEG2 = 0;
46
    BRGCON2bits.PRSEG1 = 0;
58
    BRGCON2bits.PRSEG1 = 0;
47
    BRGCON2bits.PRSEG0 = 1;
59
    BRGCON2bits.PRSEG0 = 1;
48
   
60
   
49
    //  Enableing bus wake-up
61
    //  Enableing bus wake-up
50
    BRGCON3bits.WAKDIS = 0;
62
    BRGCON3bits.WAKDIS = 0;
51
   
63
   
52
    // Dont use filter when wakeup
64
    // Dont use filter when wakeup
53
    BRGCON3bits.WAKFIL = 0;
65
    BRGCON3bits.WAKFIL = 0;
54
   
66
   
55
    // Phase_Seg2 = 2 x TQ = 1
67
    // Phase_Seg2 = 2 x TQ = 1
56
    BRGCON3bits.SEG2PH2 = 0;
68
    BRGCON3bits.SEG2PH2 = 0;
57
    BRGCON3bits.SEG2PH1 = 0;
69
    BRGCON3bits.SEG2PH1 = 0;
58
    BRGCON3bits.SEG2PH0 = 1;
70
    BRGCON3bits.SEG2PH0 = 1;
59
 
71
 
60
    ECANCON=0;
72
    ECANCON=0;
61
    ECANCONbits.MDSEL1 = 0;
73
    ECANCONbits.MDSEL1 = 0;
62
    ECANCONbits.MDSEL0 = 1;
74
    ECANCONbits.MDSEL0 = 1;
63
 
75
 
64
 
76
 
65
    // FILTERS AND MASKS
77
    // FILTERS AND MASKS
66
    RXB0CONbits.RXM1=1;
78
    RXB0CONbits.RXM1=1;
67
    RXB0CONbits.RXM0=0;
79
    RXB0CONbits.RXM0=0;
68
 
80
 
69
 
81
 
70
    // INTERRUPTS
82
    // INTERRUPTS
71
   
83
   
72
    // Diable transmit interrupt
84
    // Diable transmit interrupt
73
    TXBIE = 0;
85
    TXBIE = 0;
74
 
86
 
75
    //rx any interrupt
87
    //rx any interrupt
76
    PIR3 = 0;
88
    PIR3 = 0;
77
    PIE3 = 0b00000011;
89
    PIE3 = 0b00000011;
78
 
90
 
79
    // High interrupt
91
    // High interrupt
80
    IPR3 =0b00000011;
92
    IPR3 =0b00000011;
81
 
93
 
82
    // Programmable buffers interrupt
94
    // Programmable buffers interrupt
83
    BIE0  = 0xFF;  
95
    BIE0  = 0xFF;  
84
 
96
 
85
 
97
 
86
    //loopback mode or not
98
    //loopback mode or not
87
    #ifdef CAN_LOOPBACK_MODE
99
    #ifdef CAN_LOOPBACK_MODE
88
        CANCON = 0x40;//request loopback mode
100
        CANCON = 0x40;//request loopback mode
89
        while ((CANSTAT & 0xE0) != 0x40 );//wait for loopback mode
101
        while ((CANSTAT & 0xE0) != 0x40 );//wait for loopback mode
90
    #else
102
    #else
91
        CANCON = 0x00;//request normal mode
103
        CANCON = 0x00;//request normal mode
92
        while ((CANSTAT & 0xE0) != 0x00 );//wait for normal mode
104
        while ((CANSTAT & 0xE0) != 0x00 );//wait for normal mode
93
    #endif
105
    #endif
94
 
106
 
95
}
107
}
96
 
108
 
97
 
109
 
98
/*
110
/*
99
*   Function: canISR
111
*   Function: canISR
100
*
112
*
101
*   Input:  none
113
*   Input:  none
102
*   Output: none
114
*   Output: none
103
*   Pre-conditions: a call to canInit()
115
*   Pre-conditions: a call to canInit()
104
*   Affects: interrupt registers and receive data buffers
116
*   Affects: interrupt registers and receive data buffers
105
*   Depends: ..
117
*   Depends: ..
106
*/
118
*/
107
void canISR()
119
void canISR()
108
{
120
{
109
    if (PIR3bits.RXBnIF || PIR3bits.RXB1IF || PIR3bits.RXB0IF)
121
    if (PIR3bits.RXBnIF || PIR3bits.RXB1IF || PIR3bits.RXB0IF)
110
    {
122
    {
111
 
123
 
112
        // Get which buffer that is ful.
124
        // Get which buffer that is ful.
113
             if (RXB0CONbits.RXFUL) { ECANCON=(ECANCON&0b00000)|0b10000; canGetPacket(); }
125
             if (RXB0CONbits.RXFUL) { ECANCON=(ECANCON&0b00000)|0b10000; canGetPacket(); }
114
        else if (RXB1CONbits.RXFUL) { ECANCON=(ECANCON&0b00000)|0b10001; canGetPacket(); }
126
        else if (RXB1CONbits.RXFUL) { ECANCON=(ECANCON&0b00000)|0b10001; canGetPacket(); }
115
        else if (B0CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10010; canGetPacket(); }
127
        else if (B0CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10010; canGetPacket(); }
116
        else if (B1CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10011; canGetPacket(); }
128
        else if (B1CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10011; canGetPacket(); }
117
        else if (B2CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10100; canGetPacket(); }
129
        else if (B2CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10100; canGetPacket(); }
118
        else if (B3CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10101; canGetPacket(); }
130
        else if (B3CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10101; canGetPacket(); }
119
        else if (B4CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10110; canGetPacket(); }
131
        else if (B4CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10110; canGetPacket(); }
120
        else if (B5CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10111; canGetPacket(); }
132
        else if (B5CONbits.RXFUL)   { ECANCON=(ECANCON&0b00000)|0b10111; canGetPacket(); }
121
   
133
   
122
        if (PIR3bits.RXBnIF) {PIR3bits.RXBnIF = 0;}
134
        if (PIR3bits.RXBnIF) {PIR3bits.RXBnIF = 0;}
123
        if (PIR3bits.RXB1IF) {PIR3bits.RXB1IF = 0;}
135
        if (PIR3bits.RXB1IF) {PIR3bits.RXB1IF = 0;}
124
        if (PIR3bits.RXB0IF) {PIR3bits.RXB0IF = 0;}
136
        if (PIR3bits.RXB0IF) {PIR3bits.RXB0IF = 0;}
125
   
137
   
126
    }
138
    }
127
}
139
}
128
 
140
 
129
 
141
 
130
/*
142
/*
131
*   Function: canGetPacket
143
*   Function: canGetPacket
132
*
144
*
133
*   Input:  none
145
*   Input:  none
134
*   Output: none
146
*   Output: none
135
*   Pre-conditions: a call to canISR and an packet is available and banked to RXB0
147
*   Pre-conditions: a call to canISR and an packet is available and banked to RXB0
136
*   Affects: Calls canParse() function in main for parsing received packet.
148
*   Affects: Calls canParse() function in main for parsing received packet.
137
*   Depends: none.
149
*   Depends: none.
138
*/
150
*/
139
void canGetPacket()
151
void canGetPacket()
140
{
152
{
141
        CAN_MESSAGE cm;
153
        CAN_MESSAGE cm;
142
 
154
 
143
        // Set extended mode or not.
155
        // Set extended mode or not.
144
        cm.extended=(RXB0SIDLbits.EXID==0?FALSE:TRUE);
156
        cm.extended=(RXB0SIDLbits.EXID==0?FALSE:TRUE);
145
 
157
 
146
        // Clear
158
        // Clear
147
        cm.ident=0;
159
        cm.ident=0;
148
 
160
 
149
 
161
 
150
        if (cm.extended==TRUE)
162
        if (cm.extended==TRUE)
151
        {
163
        {
152
            //Read extended ident.
164
            //Read extended ident.
153
 
165
 
154
            //xx xx xx 28 27 26 25 24   23 22 21 20 19 18 17 16   15 14 13 12 11 10 09 08   07 06 05 04 03 02 01 00
166
            //xx xx xx 28 27 26 25 24   23 22 21 20 19 18 17 16   15 14 13 12 11 10 09 08   07 06 05 04 03 02 01 00
155
 
167
 
156
            //RXB0SIDH 28 27 26 25 24 23 22 21
168
            //RXB0SIDH 28 27 26 25 24 23 22 21
157
            //RXB0SIDL 20 19 18 xx xx xx 17 16
169
            //RXB0SIDL 20 19 18 xx xx xx 17 16
158
            //RXB0EIDH 15 14 13 12 11 10 09 08
170
            //RXB0EIDH 15 14 13 12 11 10 09 08
159
            //RXB0EIDL 07 06 05 04 03 02 01 00
171
            //RXB0EIDL 07 06 05 04 03 02 01 00
160
 
172
 
161
 
173
 
162
            cm.ident = (((DWORD)RXB0SIDH)<<21) + (((DWORD)(RXB0SIDL & 0xE0))<<13) + (((DWORD)(RXB0SIDL & 0x03))<<16) + (((DWORD)RXB0EIDH)<<8) + (BYTE)RXB0EIDL;
174
            cm.ident = (((DWORD)RXB0SIDH)<<21) + (((DWORD)(RXB0SIDL & 0xE0))<<13) + (((DWORD)(RXB0SIDL & 0x03))<<16) + (((DWORD)RXB0EIDH)<<8) + (BYTE)RXB0EIDL;
163
 
175
 
164
        }
176
        }
165
        else
177
        else
166
        {
178
        {
167
            //Read standard ident.
179
            //Read standard ident.
168
 
180
 
169
            //xx xx xx xx xx 10 09 08   07 06 05 04 03 02 01 00
181
            //xx xx xx xx xx 10 09 08   07 06 05 04 03 02 01 00
170
 
182
 
171
            //RXB0SIDH 10 09 08 07 06 05 04 03
183
            //RXB0SIDH 10 09 08 07 06 05 04 03
172
            //RXB0SIDL 02 01 00 xx xx xx xx xx
184
            //RXB0SIDL 02 01 00 xx xx xx xx xx
173
 
185
 
174
            cm.ident = (((DWORD)RXB0SIDH)<<3) + (((DWORD)RXB0SIDL)>>5);
186
            cm.ident = (((DWORD)RXB0SIDH)<<3) + (((DWORD)RXB0SIDL)>>5);
175
        }
187
        }
176
 
188
 
177
        // Data length
189
        // Data length
178
        cm.data_length=RXB0DLC;
190
        cm.data_length=RXB0DLC;
179
 
191
 
180
        // Data one bye one, for speed
192
        // Data one bye one, for speed
181
        cm.data[0]=RXB0D0;  cm.data[1]=RXB0D1;
193
        cm.data[0]=RXB0D0;  cm.data[1]=RXB0D1;
182
        cm.data[2]=RXB0D2;  cm.data[3]=RXB0D3;
194
        cm.data[2]=RXB0D2;  cm.data[3]=RXB0D3;
183
        cm.data[4]=RXB0D4;  cm.data[5]=RXB0D5;
195
        cm.data[4]=RXB0D4;  cm.data[5]=RXB0D5;
184
        cm.data[6]=RXB0D6;  cm.data[7]=RXB0D7;
196
        cm.data[6]=RXB0D6;  cm.data[7]=RXB0D7;
185
 
197
 
186
        // Clear ful status
198
        // Clear ful status
187
        RXB0CONbits.RXFUL=0;
199
        RXB0CONbits.RXFUL=0;
188
 
200
 
189
        //Call main parser
201
        //Call main parser
190
        canParse(cm);
202
        canParse(cm);
191
}
203
}
192
 
204
 
193
 
205
 
194
/*
206
/*
195
*   Function: canSendMessage
207
*   Function: canSendMessage
196
*
208
*
197
*   Input:  CAN_MESSAGE to send
209
*   Input:  CAN_MESSAGE to send
198
*   Output: True if packet scheduled sucess, false otherwise.
210
*   Output: True if packet scheduled sucess, false otherwise.
199
*   Pre-conditions: canInit
211
*   Pre-conditions: canInit
200
*   Affects: ..
212
*   Affects: ..
201
*   Depends: ..
213
*   Depends: ..
202
*/
214
*/
203
BOOL canSendMessage(CAN_MESSAGE cm)
215
BOOL canSendMessage(CAN_MESSAGE cm)
204
{
216
{
205
 
217
 
206
 
218
 
207
    if ( TXB0CONbits.TXREQ == 0 )
-
 
208
    {
-
 
209
        uartPutrs("TXREQ not set.");
-
 
210
 
219
 
211
    }
-
 
212
    else { uartPutrs("TXREQ is set."); return FALSE;}
-
 
213
 
-
 
214
 
-
 
215
 
-
 
216
 
-
 
217
/*
-
 
218
    if ( TXB0CONbits.TXREQ == 0 )  { ECANCON=(ECANCON&0b00000)|0b00011; }
220
    if ( TXB0CONbits.TXREQ == 0 )  { ECANCON=(ECANCON&0b00000)|0b00011; }
219
    if ( TXB1CONbits.TXREQ == 0 )  { ECANCON=(ECANCON&0b00000)|0b00100; }
221
    if ( TXB1CONbits.TXREQ == 0 )  { ECANCON=(ECANCON&0b00000)|0b00100; }
220
    if ( TXB2CONbits.TXREQ == 0 )  { ECANCON=(ECANCON&0b00000)|0b00101; }
222
    if ( TXB2CONbits.TXREQ == 0 )  { ECANCON=(ECANCON&0b00000)|0b00101; }
221
    // None of the transmit buffers were empty.
223
    // None of the transmit buffers were empty. 
222
    else { return FALSE;}
224
    else { return FALSE;}
223
 
225
 
224
   
226
   
225
    // Set extended mode or not.
227
    // Set extended mode or not.
226
    RXB0SIDLbits.EXID=(cm.extended==TRUE?1:0);
228
    RXB0SIDLbits.EXID=(cm.extended==TRUE?1:0);
227
 
229
 
228
 
230
 
229
        if (cm.extended==TRUE)
231
        if (cm.extended==TRUE)
230
        {
232
        {
231
            RXB0SIDL=RXB0SIDL|0b00001000;
233
            RXB0SIDL=RXB0SIDL|0b00001000;
232
        //  _asm
234
        //  _asm 
233
        //      bsf RXB0SIDL, 3, 0
235
        //      bsf RXB0SIDL, 3, 0
234
        //  _endasm
236
        //  _endasm 
235
        }
237
        }
236
        else
238
        else
237
        {
239
        {
238
            RXB0SIDL=RXB0SIDL&0b11110111;
240
            RXB0SIDL=RXB0SIDL&0b11110111;
239
        //  _asm
241
        //  _asm 
240
        //      bcf RXB0SIDL, 3, 0
242
        //      bcf RXB0SIDL, 3, 0
241
        //  _endasm
243
        //  _endasm 
242
        }
244
        }
243
 
245
 
244
       
246
       
245
 
247
 
246
 
248
 
247
        if (cm.extended==TRUE)
249
        if (cm.extended==TRUE)
248
        {
250
        {
249
            //Write extended ident.
251
            //Write extended ident.
250
   
252
   
251
            //xx xx xx 28 27 26 25 24   23 22 21 20 19 18 17 16   15 14 13 12 11 10 09 08   07 06 05 04 03 02 01 00
253
            //xx xx xx 28 27 26 25 24   23 22 21 20 19 18 17 16   15 14 13 12 11 10 09 08   07 06 05 04 03 02 01 00
252
 
254
 
253
            //RXB0SIDH 28 27 26 25 24 23 22 21
255
            //RXB0SIDH 28 27 26 25 24 23 22 21
254
            //RXB0SIDL 20 19 18 xx xx xx 17 16
256
            //RXB0SIDL 20 19 18 xx xx xx 17 16
255
            //RXB0EIDH 15 14 13 12 11 10 09 08
257
            //RXB0EIDH 15 14 13 12 11 10 09 08
256
            //RXB0EIDL 07 06 05 04 03 02 01 00
258
            //RXB0EIDL 07 06 05 04 03 02 01 00
257
 
259
 
258
 
260
 
259
            RXB0SIDH =  (BYTE)((cm.ident>>21));
261
            RXB0SIDH =  (BYTE)((cm.ident>>21));
260
            RXB0SIDL = ((BYTE)(cm.ident>>16) & 0x03) + ((BYTE)(cm.ident>>13) & 0xE0);
262
            RXB0SIDL = ((BYTE)(cm.ident>>16) & 0x03) + ((BYTE)(cm.ident>>13) & 0xE0);
261
            RXB0EIDH =  (BYTE)(cm.ident>>8);
263
            RXB0EIDH =  (BYTE)(cm.ident>>8);
262
            RXB0EIDL =  (BYTE)cm.ident;
264
            RXB0EIDL =  (BYTE)cm.ident;
263
 
265
 
264
        }
266
        }
265
        else
267
        else
266
        {
268
        {
267
            //Write standard ident.
269
            //Write standard ident.
268
       
270
       
269
            //xx xx xx xx xx 10 09 08   07 06 05 04 03 02 01 00
271
            //xx xx xx xx xx 10 09 08   07 06 05 04 03 02 01 00
270
 
272
 
271
            //RXB0SIDH 10 09 08 07 06 05 04 03
273
            //RXB0SIDH 10 09 08 07 06 05 04 03
272
            //RXB0SIDL 02 01 00 xx xx xx xx xx
274
            //RXB0SIDL 02 01 00 xx xx xx xx xx
273
 
275
 
274
            RXB0SIDH=  (BYTE)(cm.ident>>3);
276
            RXB0SIDH=  (BYTE)(cm.ident>>3);
275
            RXB0SIDL= ((BYTE)(cm.ident<<5) & 0xE0);
277
            RXB0SIDL= ((BYTE)(cm.ident<<5) & 0xE0);
276
 
278
 
277
        }
279
        }
278
 
280
 
279
        // Data length
281
        // Data length
280
        if (cm.data_length>8) RXB0DLC=8; else RXB0DLC=cm.data_length;
282
        if (cm.data_length>8) RXB0DLC=8; else RXB0DLC=cm.data_length;
281
 
283
 
282
        // Data one bye one, for speed
284
        // Data one bye one, for speed
283
        RXB0D0=cm.data[0];  RXB0D1=cm.data[1];
285
        RXB0D0=cm.data[0];  RXB0D1=cm.data[1];
284
        RXB0D2=cm.data[2];  RXB0D3=cm.data[3];
286
        RXB0D2=cm.data[2];  RXB0D3=cm.data[3];
285
        RXB0D4=cm.data[4];  RXB0D5=cm.data[5];
287
        RXB0D4=cm.data[4];  RXB0D5=cm.data[5];
286
        RXB0D6=cm.data[6];  RXB0D7=cm.data[7];
288
        RXB0D6=cm.data[6];  RXB0D7=cm.data[7];
287
 
289
 
288
        // mark as redy to transmit
290
        // mark as redy to transmit
289
        _asm
291
        _asm
290
            bsf RXB0CON, 3, 0
292
            bsf RXB0CON, 3, 0
291
        _endasm
293
        _endasm
292
 
294
 
293
 
295
 
294
        return TRUE;
296
        return TRUE;
295
*/
297
 
296
}
298
}
297
 
299
 
298
 
300
 
299
 
301
 
300
#endif //USE_CAN
302
#endif //USE_CAN
301
 
303