Subversion Repositories HomeAutomation

Rev

Details | Last modification | View Log | SVN | RSS feed

Rev Author Line No. Line
24 johboh 1
#include "../Include/CANdefs.h"
2
#include "../Include/stackTasks.h"
3
#include "../Include/CAN.h"
4
#include "../Include/uart.h"
5
 
6
#ifdef USE_CAN
7
 
8
/*
9
*   Function: canInit
10
*
11
*   Input:  none
12
*   Output: none
13
*   Pre-conditions: none
14
*   Affects: Changes can registers.
15
*   Depends: none.
16
*/
17
void canInit()
18
{
19
    CANCON=0b10000000;
20
    while(!CANSTATbits.OPMODE2);
21
 
22
    ECANCON=0;
23
 
24
    BRGCON1=0b01001001;
25
    BRGCON2=0b10001001;
26
    BRGCON3=0b00000001;
27
 
28
    // Set Mask 0 to not mask any filter bit
29
    RXM0SIDH = 0xFF;
30
    RXM0SIDL = 0xE3;
31
    RXM0EIDH = 0xFF;
32
    RXM0EIDL = 0xFF;
33
 
34
    MSEL0=MSEL1=MSEL2=MSEL3=0;
35
 
36
 
37
    CIOCON=0b00100000;
38
 
39
 
40
    PIE3=0b00000011;
41
    IPR3=0b00000011;
42
 
43
    CANCON=0b01000000;
44
    while(CANSTATbits.OPMODE2);
45
}
46
 
47
 
48
/*
49
*   Function: canISR
50
*
51
*   Input:  none
52
*   Output: none
53
*   Pre-conditions: a call to canInit()
54
*   Affects: interrupt registers and receive data buffers
55
*   Depends: ..
56
*/
57
void canISR()
58
{
59
    if (PIR3bits.RXB0IF==1 && PIE3bits.RXB0IE==1)
60
    {
61
        CAN_MESSAGE cm;
62
 
63
        uartPutrs("IF1");
64
 
65
        // Set extended mode or not.
66
        cm.extended=RXB0SIDLbits.EXID;
67
 
68
        // Clear
69
        cm.ident[0]=cm.ident[1]=cm.ident[2]=cm.ident[3]=0;
70
 
71
 
72
        if (cm.extended==TRUE)
73
        {
74
            //Read extended ident.
75
            cm.ident[0]=RXB0EIDL;
76
            cm.ident[1]=RXB0EIDH;
77
            cm.ident[2]=(RXB0SIDL & 0b00000011)+((RXB0SIDL & 0b11100000)>3)+((RXB0SIDH & 0b00000111)<5);
78
            cm.ident[3]=RXB0SIDH>3;
79
        }
80
        else
81
        {
82
            //Read standard ident.
83
            cm.ident[0]=((RXB0SIDL & 0b11100000)>5)+(RXB0SIDH>2);
84
            cm.ident[1]=RXB0SIDH>5;
85
        }
86
 
87
        // Data length
88
        cm.data_length=RXB0DLC;
89
 
90
        // Data one bye one, for speed
91
        cm.data[0]=RXB0D0;  cm.data[1]=RXB0D1;
92
        cm.data[2]=RXB0D2;  cm.data[3]=RXB0D3;
93
        cm.data[4]=RXB0D4;  cm.data[5]=RXB0D5;
94
        cm.data[6]=RXB0D6;  cm.data[7]=RXB0D7;
95
 
96
 
97
        //Call main parser
98
        canParse(cm);
99
 
100
        RXB0CONbits.RXFUL=0;
101
        PIR3bits.RXB0IF=0;
102
    }    
103
    if (PIR3bits.RXB1IF==1 && PIE3bits.RXB1IE==1)
104
    {
105
        CAN_MESSAGE cm;
106
 
107
        uartPutrs("IF2");
108
 
109
        // Set extended mode or not.
110
        cm.extended=RXB1SIDLbits.EXID;
111
 
112
        // Clear
113
        cm.ident[0]=cm.ident[1]=cm.ident[2]=cm.ident[3]=0;
114
 
115
 
116
        if (cm.extended==TRUE)
117
        {
118
            //Read extended ident.
119
            cm.ident[0]=RXB1EIDL;
120
            cm.ident[1]=RXB1EIDH;
121
            cm.ident[2]=(RXB1SIDL & 0b00000011)+((RXB1SIDL & 0b11100000)>3)+((RXB1SIDH & 0b00000111)<5);
122
            cm.ident[3]=RXB1SIDH>3;
123
        }
124
        else
125
        {
126
            //Read standard ident.
127
            cm.ident[0]=((RXB1SIDL & 0b11100000)>5)+(RXB1SIDH>2);
128
            cm.ident[1]=RXB1SIDH>5;
129
        }
130
 
131
        // Data length
132
        cm.data_length=RXB1DLC;
133
 
134
        // Data one bye one, for speed
135
        cm.data[0]=RXB1D0;  cm.data[1]=RXB1D1;
136
        cm.data[2]=RXB1D2;  cm.data[3]=RXB1D3;
137
        cm.data[4]=RXB1D4;  cm.data[5]=RXB1D5;
138
        cm.data[6]=RXB1D6;  cm.data[7]=RXB1D7;
139
 
140
 
141
        //Call main parser
142
        canParse(cm);
143
 
144
        RXB1CONbits.RXFUL=0;
145
        PIR3bits.RXB1IF=0;
146
    }
147
 
148
}
149
 
150
 
151
/*
152
*   Function: canSendMessage
153
*
154
*   Input:  CAN_MESSAGE to send
155
*   Output: True if packet scheduled sucess, false otherwise.
156
*   Pre-conditions: canInit
157
*   Affects: ..
158
*   Depends: ..
159
*/
160
BOOL canSendMessage(CAN_MESSAGE cm)
161
{
162
    BYTE defECANCON;
163
 
164
    // Find the first empty transmitter. 
165
    if ( TXB0CONbits.TXREQ == 0 )
166
    {
167
        uartPutrs("Sending..");
168
 
169
        // Set extended mode or not.
170
        TXB0SIDLbits.EXIDE=cm.extended;
171
 
172
        if (cm.extended==TRUE)
173
        {
174
            //Write extended ident.
175
            TXB0SIDH=(cm.ident[3]<3)+(cm.ident[2]>5);
176
            TXB0SIDL=(TXB0SIDL & 0b00011100)+((cm.ident[2] & 0b0001100)<3)+(cm.ident[2] & 0b00000011);
177
            TXB0EIDH=cm.ident[1];
178
            TXB0EIDL=cm.ident[0];
179
        }
180
        else
181
        {
182
            //Write standard ident.
183
            TXB0SIDH=(cm.ident[1]<5)+(cm.ident[0]>3);
184
            TXB0SIDL=(TXB0SIDL & 0b00011111)+(cm.ident[0]<5);
185
        }
186
 
187
        // Data length
188
        if (cm.data_length>8) TXB0DLC=8; else TXB0DLC=cm.data_length;
189
 
190
        // Data one bye one, for speed
191
        TXB0D0=cm.data[0];  TXB0D1=cm.data[1];
192
        TXB0D2=cm.data[2];  TXB0D3=cm.data[3];
193
        TXB0D4=cm.data[4];  TXB0D5=cm.data[5];
194
        TXB0D6=cm.data[6];  TXB0D7=cm.data[7];
195
 
196
        // mark as redy to transmit
197
        TXB0CONbits.TXREQ=1;
198
 
199
        while(TXB0CONbits.TXREQ);
200
 
201
 
202
    }
203
    // None of the transmit buffers were empty. 
204
    else {uartPutrs("No free tx."); return FALSE;}
205
 
206
 
207
 
208
 
209
        return TRUE;
210
 
211
}
212
 
213
 
214
#endif //USE_CAN